import React, { useEffect, useState } from "react";
import MultiLevelDropdown from "../../../../ui/inputs/MultiLevelDropDown";
import { AddIcon } from "../../../../icons/ExportCommonIcons";
import RegularDropDown from "../../../../ui/inputs/RegularDropDown";
import useChartStore from "../../../../../store/useChartStore";
import { useSelectedZoneStore } from "../../../../../store/useZoneStore";
import { useWidgetStore } from "../../../../../store/useWidgetStore";
import axios from "axios";
import RenameInput from "../../../../ui/inputs/RenameInput";

type Props = {};

const Widget4InputCard3D = (props: Props) => {
    const { selectedChartId } = useWidgetStore();
  const [widgetName, setWidgetName] = useState("untited");
  const { setMeasurements, updateDuration, updateName } = useChartStore();
  const [duration, setDuration] = useState('1h')
  const [dropDowndata, setDropDownData] = useState({});
  const [selections, setSelections] = useState<Record<string, { name: string; fields: string }>>({});
  const { selectedZone } = useSelectedZoneStore();
  const iotApiUrl = process.env.REACT_APP_IOT_SOCKET_SERVER_URL;
  const email = localStorage.getItem("email") || "";
  const organization = email?.split("@")[1]?.split(".")[0]
  const [isLoading, setLoading] = useState<boolean>(true);
 
  useEffect(() => {
    const fetchZoneData = async () => {
      try {
        setLoading(true)
        const response = await axios.get(`http://${iotApiUrl}/floatinput`);
        if (response.status === 200) {
          // console.log("dropdown data:", response.data);
          setDropDownData(response.data);
          setLoading(false)
        } else {
          console.log("Unexpected response:", response);
        }
      } catch (error) {
        console.error("There was an error!", error);
      }
    };
    fetchZoneData();
  }, []);

  useEffect(() => {
    const fetchSavedInputes = async () => {
      if (selectedChartId.id !== "") {
        try {
          const response = await axios.get(`http://${process.env.REACT_APP_SERVER_REST_API_BASE_URL}/api/v2/widget3D/${selectedChartId.id}/${organization}`);
          if (response.status === 200) {
            setSelections(response.data.Data.measurements)
            setDuration(response.data.Data.duration)
            setWidgetName(response.data.widgetName)
          } else {
            console.log("Unexpected response:", response);
          }
        } catch (error) {
          console.error("There was an error!", error);
        }
      }
    }

    fetchSavedInputes();

  }, [selectedChartId.id]);

  // Sync Zustand state when component mounts
  useEffect(() => {
    setMeasurements(selections);
    updateDuration(duration);
    updateName(widgetName);
  }, [selections, duration, widgetName]);


  const sendInputes = async (inputMeasurement: any, inputDuration: any, inputName: any) => {
    try {
      const response = await axios.post(`http://${process.env.REACT_APP_SERVER_REST_API_BASE_URL}/api/v2/3dwidget/save`, {
        organization: organization,
        zoneId: selectedZone.zoneId,
        widget: {
          id: selectedChartId.id,
          widgetName: inputName,
          Data: {
            measurements: inputMeasurement,
            duration: inputDuration
          }
        }
      } as any);
      if (response.status === 200) {
        return true
      } else {
        console.log("Unexpected response:", response);
        return false
      }
    } catch (error) {
      console.error("There was an error!", error);
      return false
    }
  }

  const handleSelect = async (inputKey: string, selectedData: { name: string; fields: string } | null) => {

    // async() => {
    const newSelections = { ...selections };
    if (selectedData === null) {
      delete newSelections[inputKey];
    } else {
      newSelections[inputKey] = selectedData;
    }
    // setMeasurements(newSelections); // Update Zustand store
    console.log(newSelections);
    if (await sendInputes(newSelections, duration, widgetName)) {
      setSelections(newSelections);
    }
    // sendInputes(newSelections, duration); // Send data to server
    // return newSelections;
    // };
  };

  const handleSelectDuration = async (option: string) => {
    if (await sendInputes(selections, option, widgetName)) {
      setDuration(option);
    }
    // setDuration(option);
  };

  const handleNameChange = async (name:any) => {
    console.log('name change requested',name);
    
    if (await sendInputes(selections, duration, name)) {
      setWidgetName(name);
    }
  }

  return (
    <>
      <div className="inputs-wrapper">
        <div className="datas">
          <div className="datas__label">Title</div>
          <RenameInput value={widgetName} onRename={handleNameChange}/>
        </div>
        {[...Array(1)].map((_, index) => {
          const inputKey = `input${index + 1}`;
          return (
            <div key={index} className="datas">
              <div className="datas__label">Input {index + 1}</div>
              <div className="datas__class">
                <MultiLevelDropdown
                  data={dropDowndata}
                  onSelect={(selectedData) => handleSelect(inputKey, selectedData)}
                  onUnselect={() => handleSelect(inputKey, null)}
                  selectedValue={selections[inputKey]} // Load from Zustand
                  isLoading={isLoading}
                  allSelections={selections}
                />
                <div className="icon">
                  <AddIcon />
                </div>
              </div>
            </div>
          );
        })}
      </div>
      <div>
        <div className="datas">
          <div className="datas__label">Duration</div>
          <div className="datas__class">
            <RegularDropDown
              header={duration}
              options={["1h", "2h", "12h"]}
              onSelect={handleSelectDuration}
              search={false}
            />
          </div>
        </div>
      </div>
    </>
  );
};

export default Widget4InputCard3D;