import { useState, useEffect } from "react";
import GlobalRepository from "../repositories/GlobalRepository";
import { useQuery } from "@tanstack/react-query";


export const useDashboard_Data = ({ days, FromDate, projectId }) => {
  const [dashboard_data, setDashboard_Data] = useState([]);
  const [isLineChartLoading, setLoading] = useState(false);
  const [error, setError] = useState("");

  useEffect(() => {
    if (!days) return;

    const fetchData = async () => {
      setLoading(true);
      setError("");

      try {
        const payload = {
          days,
          FromDate: FromDate || '',
          projectId: projectId || null,
        };

        const response = await GlobalRepository.getDashboardProgressionData(payload);
        setDashboard_Data(response.data);
      } catch (err) {
        setError("Failed to fetch dashboard data.");
        console.error(err);
      } finally {
        setLoading(false);
      }
    };

    fetchData();
  }, [days, FromDate, projectId]);

  return { dashboard_data, loading: isLineChartLoading, error };
};


// export const useDashboard_AttendanceData = (date, projectId) => {
//   const [dashboard_Attendancedata, setDashboard_AttendanceData] = useState([]);
//   const [isLineChartLoading, setLoading] = useState(false);
//   const [error, setError] = useState("");

//   useEffect(() => {
//     const fetchData = async () => {
//       setLoading(true);
//       setError("");

//       try {
//         const response = await GlobalRepository.getDashboardAttendanceData(date, projectId); // date in 2nd param
//         setDashboard_AttendanceData(response.data);
//       } catch (err) {
//         setError("Failed to fetch dashboard data.");
//         console.error(err);
//       } finally {
//         setLoading(false);
//       }
//     };

//     if (date && projectId !== null) {
//       fetchData();
//     }
//   }, [date, projectId]);

//   return { dashboard_Attendancedata, isLineChartLoading: isLineChartLoading, error };
// };


// 🔹 Dashboard Projects Card Data Hook
// export const useDashboardProjectsCardData = () => {
//   const [projectsCardData, setProjectsData] = useState([]);
//   const [loading, setLoading] = useState(false);
//   const [error, setError] = useState("");

//   useEffect(() => {
//     const fetchProjectsData = async () => {
//       setLoading(true);
//       setError("");

//       try {
//         const response = await GlobalRepository.getDashboardProjectsCardData();
//         setProjectsData(response.data);
//       } catch (err) {
//         setError("Failed to fetch projects card data.");
//         console.error(err);
//       } finally {
//         setLoading(false);
//       }
//     };

//     fetchProjectsData();
//   }, []);

//   return { projectsCardData, loading, error };
// };

// 🔹 Dashboard Teams Card Data Hook
// export const useDashboardTeamsCardData = (projectId) => {
//   const [teamsCardData, setTeamsData] = useState({});
//   const [loading, setLoading] = useState(false);
//   const [error, setError] = useState("");

//   useEffect(() => {
//     const fetchTeamsData = async () => {
//       setLoading(true);
//       setError("");

//       try {
//         const response = await GlobalRepository.getDashboardTeamsCardData(projectId);
//         setTeamsData(response.data || {});
//       } catch (err) {
//         setError("Failed to fetch teams card data.");
//         console.error("Error fetching teams card data:", err);
//         setTeamsData({});
//       } finally {
//         setLoading(false);
//       }
//     };

//     fetchTeamsData();
//   }, [projectId]);

//   return { teamsCardData, loading, error };
// };

// export const useDashboardTasksCardData = (projectId) => {
//   const [tasksCardData, setTasksData] = useState({});
//   const [loading, setLoading] = useState(false);
//   const [error, setError] = useState("");

//   useEffect(() => {
//     const fetchTasksData = async () => {
//       setLoading(true);
//       setError("");

//       try {
//         const response = await GlobalRepository.getDashboardTasksCardData(projectId);
//         setTasksData(response.data);
//       } catch (err) {
//         setError("Failed to fetch tasks card data.");
//         console.error(err);
//         setTasksData({});
//       } finally {
//         setLoading(false);
//       }
//     };

//     fetchTasksData();
//   }, [projectId]);

//   return { tasksCardData, loading, error };
// };


export const useAttendanceOverviewData = (projectId, days) => {
  const [attendanceOverviewData, setAttendanceOverviewData] = useState([]);
  const [loading, setLoading] = useState(false);
  const [error, setError] = useState("");

  useEffect(() => {
    if (!projectId || !days) return;
    const fetchAttendanceOverview = async () => {
      setLoading(true);
      setError("");

      try {
        const response = await GlobalRepository.getAttendanceOverview(projectId, days);
        setAttendanceOverviewData(response.data);
      } catch (err) {
        setError("Failed to fetch attendance overview data.");
      } finally {
        setLoading(false);
      }
    };

    fetchAttendanceOverview();
  }, [projectId, days]);

  return { attendanceOverviewData, loading, error };
};


// -------------------Query----------------------------

// export const useDashboard_Data = (days, FromDate, projectId)=>{
//   return useQuery({
//     queryKey:["dashboardProjectProgress"],
//     queryFn:async()=> {
//          const payload = {
//           days,
//           FromDate: FromDate || '',
//           projectId: projectId || null,
//         };
//      const resp =  await GlobalRepository.getDashboardProgressionData(payload);
//      return resp.data;
//     }
//   })
// }

export const useDashboard_AttendanceData = (date, projectId) => {
  return useQuery({
    queryKey: ["dashboardAttendances", date, projectId],
    queryFn: async () => {

      const resp = await await GlobalRepository.getDashboardAttendanceData(date, projectId)
      return resp.data;
    }
  })
}

export const useDashboardTeamsCardData = (projectId) => {
  return useQuery({
    queryKey: ["dashboardTeams", projectId],
    queryFn: async () => {

      const resp = await GlobalRepository.getDashboardTeamsCardData(projectId)
      return resp.data;
    }
  })
}

export const useDashboardTasksCardData = (projectId) => {
  return useQuery({
    queryKey: ["dashboardTasks", projectId],
    queryFn: async () => {

      const resp = await GlobalRepository.getDashboardTasksCardData(projectId)
      return resp.data;
    }
  })
}
// export const useAttendanceOverviewData = (projectId, days) => {
//    return useQuery({
//     queryKey:["dashboardAttendanceOverView",projectId],
//     queryFn:async()=> {

//      const resp =  await GlobalRepository.getAttendanceOverview(projectId, days);
//      return resp.data;
//     }
//   })
// }

export const useDashboardProjectsCardData = () => {
  return useQuery({
    queryKey: ["dashboardProjects"],
    queryFn: async () => {

      const resp = await GlobalRepository.getDashboardProjectsCardData();
      return resp.data;
    }
  })
}

export const useExpenseAnalysis = (projectId, startDate, endDate) => {
  const hasBothDates = !!startDate && !!endDate;
  const noDatesSelected = !startDate && !endDate;

  const shouldFetch =
    noDatesSelected ||
    hasBothDates;
  return useQuery({
    queryKey: ["expenseAnalysis", projectId, startDate, endDate],
    queryFn: async () => {
      const resp = await GlobalRepository.getExpenseData(projectId, startDate, endDate);
      return resp.data;
    },
    enabled: shouldFetch,
    refetchOnWindowFocus: true,   // refetch when you come back
    refetchOnMount: "always",     // always refetch on remount
    staleTime: 0,
  });
};

export const useExpenseStatus = (projectId) => {
  return useQuery({
    queryKey: ["expense_stauts", projectId],
    queryFn: async () => {
      const resp = await GlobalRepository.getExpenseStatus(projectId);
      return resp.data;
    }
  })
}

export const useExpenseDataByProject = (projectId, categoryId, months) => {
  return useQuery({
    queryKey: ["expenseByProject", projectId, categoryId, months],
    queryFn: async () => {
      const resp = await GlobalRepository.getExpenseDataByProject(projectId, categoryId, months);
      return resp.data;
    },

  });
};