'use client';

import { useDispatch, useSelector } from 'react-redux';
import { useTranslation } from 'react-i18next';
import * as Yup from 'yup';
import { RootState } from '@/store';
import { setWirings, setLocation, setSaving, setSaveError } from '@/store/slices/installation-slice';
import { InstallationRepository } from '@/repositories/teltoinstall/_index';
import { apiErrorMessage } from '@/utils/teltoinstall/_index';
import { Wiring } from '@/models/teltoinstall/_index';

export function useWiringStep() {
  const { t } = useTranslation();
  const dispatch = useDispatch();
  const { wirings, location, installationId, device } = useSelector(
    (state: RootState) => state.installation
  );
  const productLine = device.product_line;
  const model = device.model;

  const validationSchema = Yup.object({
    location: Yup.string().required(t('errors.locationRequired')),
  });

  function updateWiring(wireId: number, wireAccessoryId: number | undefined) {
    const updated = wirings.filter((w) => w.wire_id !== wireId);
    if (wireAccessoryId !== undefined) {
      updated.push({ wire_id: wireId, wire_accessory_id: wireAccessoryId });
    }
    dispatch(setWirings(updated));
  }

  async function saveWiring(loc: string): Promise<boolean> {
    dispatch(setLocation(loc));
    dispatch(setWirings(wirings));
    if (!installationId) return false;
    dispatch(setSaving(true));
    try {
      await InstallationRepository.update(installationId, {
        location: loc,
        wirings: wirings as Wiring[],
      });
      return true;
    } catch (err) {
      dispatch(setSaveError(apiErrorMessage(err, t('wizard.saveError'))));
      return false;
    } finally {
      dispatch(setSaving(false));
    }
  }

  return { wirings, location, productLine, model, validationSchema, updateWiring, saveWiring };
}
