// components/modales/kueModal/handlers/handleSave.ts
import { setVariables } from "../../../../redux/slices/variablesSlice";

export interface OriginalValues {
  kueID: string[];
  kueBezeichnungen: string[];
  isolationsgrenzwerte: number[];
  verzoegerung: number[];
  untereSchleifenGrenzwerte: number[];
  obereSchleifenGrenzwerte: number[];
  schleifenintervall: number[];
}

interface HandleSaveParams {
  ids: string[]; // kueID im Redux-Slice
  bezeichnungen: string[]; // kueBezeichnungen im Redux-Slice
  isolationsgrenzwerte: number[];
  verzoegerung: number[];
  untereSchleifenGrenzwerte: number[];
  obereSchleifenGrenzwerte: number[];
  schleifenintervall: number[];
  originalValues: OriginalValues;
  slot: number;
  dispatch: (action: any) => void;
  onModulNameChange: (id: string) => void;
  onClose: () => void;
}

const handleSave = ({
  ids,
  bezeichnungen,
  isolationsgrenzwerte,
  verzoegerung,
  untereSchleifenGrenzwerte,
  obereSchleifenGrenzwerte,
  schleifenintervall,
  originalValues,
  slot,
  dispatch,
  onModulNameChange,
  onClose,
}: HandleSaveParams): void => {
  const changes: Partial<{
    KID: string;
    KIA: string;
    KL_: number;
    KD_: number;
    KR_: number;
    KRO_: number;
    KRI: number;
  }> = {};

  if (ids[slot] !== originalValues.kueID[slot]) {
    changes.KID = ids[slot];
  }
  if (bezeichnungen[slot] !== originalValues.kueBezeichnungen[slot]) {
    changes.KIA = bezeichnungen[slot];
  }
  if (
    isolationsgrenzwerte[slot] !== originalValues.isolationsgrenzwerte[slot]
  ) {
    changes.KL_ = isolationsgrenzwerte[slot];
  }
  if (verzoegerung[slot] !== originalValues.verzoegerung[slot]) {
    changes.KD_ = verzoegerung[slot];
  }
  if (
    untereSchleifenGrenzwerte[slot] !==
    originalValues.untereSchleifenGrenzwerte[slot]
  ) {
    changes.KR_ = untereSchleifenGrenzwerte[slot];
  }
  if (
    obereSchleifenGrenzwerte[slot] !==
    originalValues.obereSchleifenGrenzwerte[slot]
  ) {
    changes.KRO_ = obereSchleifenGrenzwerte[slot];
  }
  if (schleifenintervall[slot] !== originalValues.schleifenintervall[slot]) {
    changes.KRI = schleifenintervall[slot];
  }

  if (Object.keys(changes).length > 0) {
    let url = `/cpl?/kabelueberwachung.html&slot=${slot}`;
    Object.entries(changes).forEach(([paramKey, paramValue]) => {
      if (paramValue !== undefined) {
        url += `&${paramKey}${slot}=${encodeURIComponent(paramValue)}`;
      }
    });

    fetch(url, { method: "GET" })
      .then((response) => {
        if (response.ok) {
          alert("Daten erfolgreich gespeichert!");
          onModulNameChange(ids[slot]);

          dispatch(
            setVariables({
              kueID: [...ids],
              kueBezeichnungen: [...bezeichnungen],
              isolationsgrenzwerte: [...isolationsgrenzwerte],
              verzoegerung: [...verzoegerung],
              untereSchleifenGrenzwerte: [...untereSchleifenGrenzwerte],
              obereSchleifenGrenzwerte: [...obereSchleifenGrenzwerte],
              schleifenintervall: [...schleifenintervall],
            })
          );
        } else {
          alert("Fehler beim Speichern der Daten!");
        }
      })
      .catch((error) => {
        console.error("Fehler:", error);
        alert("Fehler beim Senden der Daten!");
      });
  } else {
    alert("Keine Änderungen vorgenommen.");
  }

  onClose();
};

export default handleSave;
