// /utils/poiUtils.js
import L from "leaflet";
import { toast } from "react-toastify";
import circleIcon from "../components/gisPolylines/icons/CircleIcon.js";
import { redrawPolyline } from "./polylines/redrawPolyline.js";

import { store } from "../redux/store";
import { updatePolylineCoordinatesThunk } from "../redux/thunks/database/polylines/updatePolylineCoordinatesThunk";

// 🧠 Zentrale Redux-Dispatch-Hilfsfunktion
const savePolylineRedux = (lineData) => {
  return store
    .dispatch(
      updatePolylineCoordinatesThunk({
        idModul: lineData.idModul,
        idLD: lineData.idLD,
        newCoordinates: lineData.coordinates,
      })
    )
    .unwrap()
    .catch((error) => {
      console.error("Fehler beim Speichern der Linienkoordinaten:", error.message);
    });
};

export const insertNewPOI = (closestPoints, newPoint, lineData, map) => {
  const newMarker = L.marker(newPoint, {
    icon: circleIcon,
    draggable: true,
  }).addTo(map);

  // Stützpunkt in Koordinatenliste einfügen
  lineData.coordinates.splice(closestPoints[2], 0, [newPoint.lat, newPoint.lng]);

  // Redux: Speichern der neuen Koordinaten
  savePolylineRedux(lineData);
  redrawPolyline(lineData);

  newMarker.on("dragend", () => {
    const newCoords = newMarker.getLatLng();
    const newCoordinates = [...lineData.coordinates];
    newCoordinates[closestPoints[2]] = [newCoords.lat, newCoords.lng];
    lineData.coordinates = newCoordinates;

    redrawPolyline(lineData);
    updateMarkerPosition(newCoords, lineData, newMarker);
    savePolylineRedux(lineData);
  });
};

export const removePOI = (marker, lineData, currentZoom, currentCenter) => {
  const index = lineData.coordinates.findIndex((coord) => L.latLng(coord[0], coord[1]).equals(marker.getLatLng()));

  if (index !== -1) {
    lineData.coordinates.splice(index, 1);
    redrawPolyline(lineData);
    marker.remove();
    savePolylineRedux(lineData);
    window.location.reload();
  }
};

export const updateMarkerPosition = (newCoords, lineData, marker) => {
  if (!marker) return;
  marker.setLatLng([newCoords.lat, newCoords.lng]);
};
