"use client"; // IsoChartView.tsx

import React, { useEffect } from "react";
import { Listbox } from "@headlessui/react";
import ReactModal from "react-modal";
import IsoMeasurementChart from "./IsoMeasurementChart";
import IsoChartActionBar, { useIsoDataLoader } from "./IsoChartActionBar";
import Report from "./Report";
import { useSelector, useDispatch } from "react-redux";
import { AppDispatch } from "@/redux/store";
import { RootState } from "@/redux/store";
import {
  setChartOpen,
  setFullScreen,
  setSlotNumber,
  setChartTitle,
} from "@/redux/slices/kabelueberwachungChartSlice";

import { resetBrushRange } from "@/redux/slices/brushSlice";

import {
  setVonDatum,
  setBisDatum,
  setSelectedMode,
  setSelectedSlotType,
} from "@/redux/slices/kabelueberwachungChartSlice";

interface IsoChartViewProps {
  isOpen: boolean;
  onClose: () => void;
  slotIndex: number;
}

const IsoChartView: React.FC<IsoChartViewProps> = ({
  isOpen,
  onClose,
  slotIndex,
}) => {
  const dispatch = useDispatch<AppDispatch>();
  const { loadData } = useIsoDataLoader();

  const { isFullScreen, chartTitle } = useSelector(
    (state: RootState) => state.kabelueberwachungChartSlice
  );

  // **Modal schließen + Redux-Status zurücksetzen**
  const handleClose = () => {
    const today = new Date();
    const thirtyDaysAgo = new Date();
    thirtyDaysAgo.setDate(today.getDate() - 30);

    const toISO = (date: Date) => date.toLocaleDateString("sv-SE");

    // Reset Datum
    dispatch(setVonDatum(toISO(thirtyDaysAgo)));
    dispatch(setBisDatum(toISO(today)));

    // Reset Dropdowns
    dispatch(setSelectedMode("DIA1"));
    dispatch(setSelectedSlotType("isolationswiderstand"));
    dispatch(setChartTitle("Messkurve")); // Reset zu Messkurve

    // Sonstiges Reset
    dispatch(setChartOpen(false));
    dispatch(setFullScreen(false));
    dispatch(resetBrushRange());

    onClose();
  };

  // **Vollbildmodus umschalten**
  const toggleFullScreen = () => {
    dispatch(setFullScreen(!isFullScreen));
  };

  // Modal öffnen - ISO spezifische Einstellungen
  useEffect(() => {
    if (isOpen) {
      const today = new Date();
      const thirtyDaysAgo = new Date();
      thirtyDaysAgo.setDate(today.getDate() - 30);

      const toISO = (date: Date) => date.toLocaleDateString("sv-SE");

      // Set slot number first
      dispatch(setSlotNumber(slotIndex));

      // Set dates
      dispatch(setVonDatum(toISO(thirtyDaysAgo)));
      dispatch(setBisDatum(toISO(today)));

      // Set ISO specific settings
      dispatch(setSelectedSlotType("isolationswiderstand"));

      // Set default to Messkurve
      dispatch(setChartTitle("Messkurve"));

      // Automatisch Daten laden nach kurzer Verzögerung
      // um sicherzustellen, dass alle Redux-States gesetzt sind
      const timer = setTimeout(() => {
        loadData();
      }, 100);

      // Cleanup timer
      return () => clearTimeout(timer);
    }
    // eslint-disable-next-line react-hooks/exhaustive-deps
  }, [isOpen, slotIndex, dispatch]); // loadData bewusst ausgelassen um Endlosschleife zu vermeiden

  return (
    <ReactModal
      isOpen={isOpen}
      onRequestClose={handleClose}
      ariaHideApp={false}
      style={{
        overlay: { backgroundColor: "rgba(0, 0, 0, 0.5)" },
        content: {
          top: "50%",
          left: "50%",
          bottom: "auto",
          marginRight: "-50%",
          transform: "translate(-50%, -50%)",
          width: isFullScreen ? "90vw" : "70rem",
          height: isFullScreen ? "90vh" : "35rem",
          padding: "1rem",
          transition: "all 0.3s ease-in-out",
          display: "flex",
          flexDirection: "column",
        },
      }}
    >
      {/* Action-Buttons */}
      <div
        style={{
          position: "absolute",
          top: "0.625rem",
          right: "0.625rem",
          display: "flex",
          gap: "0.75rem",
        }}
      >
        {/* Fullscreen-Button */}
        <button
          onClick={toggleFullScreen}
          style={{
            background: "transparent",
            border: "none",
            fontSize: "1.5rem",
            cursor: "pointer",
          }}
        >
          <i
            className={
              isFullScreen ? "bi bi-fullscreen-exit" : "bi bi-arrows-fullscreen"
            }
          ></i>
        </button>

        {/* Schließen-Button */}
        <button
          onClick={handleClose}
          style={{
            background: "transparent",
            border: "none",
            fontSize: "1.5rem",
            cursor: "pointer",
          }}
        >
          <i className="bi bi-x-circle-fill"></i>
        </button>
      </div>

      {/* Chart-Container */}
      <div
        style={{
          flex: 1,
          display: "flex",
          flexDirection: "column",
          height: "100%",
        }}
      >
        <div className="flex justify-between items-center mb-2 pr-24">
          <h3 className="text-lg font-semibold">Isolationswiderstand</h3>
          <Listbox
            value={chartTitle}
            onChange={(value: "Messkurve" | "Meldungen") =>
              dispatch(setChartTitle(value))
            }
          >
            <div className="relative w-40">
              <Listbox.Button className="w-full border px-3 py-1 rounded text-left bg-white flex justify-between items-center text-sm">
                <span>
                  {chartTitle === "Meldungen" ? "Meldungen" : "Messkurve"}
                </span>
                <svg
                  className="w-5 h-5 text-gray-400"
                  viewBox="0 0 20 20"
                  fill="currentColor"
                >
                  <path
                    fillRule="evenodd"
                    d="M5.23 7.21a.75.75 0 011.06.02L10 10.585l3.71-3.355a.75.75 0 111.02 1.1l-4.25 3.85a.75.75 0 01-1.02 0l-4.25-3.85a.75.75 0 01.02-1.06z"
                    clipRule="evenodd"
                  />
                </svg>
              </Listbox.Button>
              <Listbox.Options className="absolute z-50 mt-1 w-full border rounded bg-white shadow max-h-60 overflow-auto text-sm">
                {(["Messkurve", "Meldungen"] as const).map((option) => (
                  <Listbox.Option
                    key={option}
                    value={option}
                    className={({
                      selected,
                      active,
                    }: {
                      selected: boolean;
                      active: boolean;
                    }) =>
                      `px-4 py-1 cursor-pointer ${
                        selected
                          ? "bg-littwin-blue text-white"
                          : active
                          ? "bg-gray-200"
                          : ""
                      }`
                    }
                  >
                    {option === "Meldungen" ? "Meldungen" : "Messkurve"}
                  </Listbox.Option>
                ))}
              </Listbox.Options>
            </div>
          </Listbox>
        </div>
        <IsoChartActionBar />
        <div style={{ flex: 1, height: "90%" }}>
          {chartTitle === "Messkurve" ? (
            <IsoMeasurementChart />
          ) : (
            <Report moduleType="ISO" autoLoad={false} />
          )}
        </div>
      </div>
    </ReactModal>
  );
};

export default IsoChartView;
