// 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 axios from 'axios'

// type Props = {}

// const LineGrapInput = (props: Props) => {
//     const [dropDowndata, setDropDownData] = useState({})
//     const [selections, setSelections] = useState<Record<string, { name: string, fields: string }>>({})
//     const [selectedOption, setSelectedOption] = useState('1h')
//     const { measurements, setMeasurements, updateDuration, duration } = useChartStore();
//     const iotApiUrl = process.env.REACT_APP_IOT_SOCKET_SERVER_URL;

//     const handleSelectDuration = (option: string) => {
//         updateDuration(option); // Normalize for key matching
//     };

//     useEffect(() => {
//         const fetchZoneData = async () => {
//             try {
//                 const response = await axios.get(`http://${iotApiUrl}/getinput`);
//                 if (response.status === 200) {
//                     console.log('dropdown data:', response.data);
//                     setDropDownData(response.data)
//                 } else {
//                     console.log('Unexpected response:', response);
//                 }
//             } catch (error) {
//                 console.error('There was an error!', error);
//             }
//         };
//         fetchZoneData();
//     }, []);

//     useEffect(() => {
//         console.log(selections);
//     }, [selections])

//     const handleSelect = (inputKey: string, selectedData: { name: string, fields: string } | null) => {
//         setSelections(prev => {
//             if (selectedData === null) {
//                 const newSelections = { ...prev };
//                 delete newSelections[inputKey];
//                 return newSelections;
//             } else {
//                 return {
//                     ...prev,
//                     [inputKey]: selectedData
//                 };
//             }
//         });
//     };

//     interface Measurement {
//         name: string;
//         fields: string;
//       }

//       interface InputData {
//         [key: string]: Measurement;
//       }

//       const extractMeasurements = (input: InputData): Measurement[] => {
//         return Object.values(input);
//       };

//     useEffect(() => {
//         const measurementsData = extractMeasurements(selections);
//         setMeasurements(measurementsData);
//     }, [selections]);


//     return (
//         <>
//             <div className="inputs-wrapper">
//                 {[...Array(6)].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]}
//                                 />
//                                 <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 LineGrapInput



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/visualization/useChartStore";
import { useSelectedZoneStore } from "../../../../../store/visualization/useZoneStore";
import { useWidgetStore } from "../../../../../store/useWidgetStore";
import axios from "axios";
import RenameInput from "../../../../ui/inputs/RenameInput";

type Props = {};

const LineGrapInput = (props: Props) => {
  const [widgetName, setWidgetName] = useState('Widget');
  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 { selectedChartId } = useWidgetStore();
  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/WidgetData/${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/widget/save`, {
        organization: organization,
        zoneId: selectedZone.zoneId,
        widget: {
          id: selectedChartId.id,
          panel: selectedChartId.panel,
          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 || selectedChartId?.title} onRename={handleNameChange}/>
        </div>
        {[...Array(4)].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 LineGrapInput;
