import { useState, useEffect, useCallback } from "react";
import useDashboardService from "./useDashboardService";
import {
  type DashboardStats,
  type RecentProject,
  type RecentLeave,
  NonClockedInUsers,
  TodaysTimeTracking,
} from "../../services/dashboardService";

interface UseDashboardState {
  stats: DashboardStats | null;
  recentProjects: RecentProject[];
  recentLeaves: RecentLeave[];
  nonClockedInUsers: NonClockedInUsers[];
  todaysTimeTracking: TodaysTimeTracking[];
  loading: boolean;
  error: string | null;
}

interface UseDashboardActions {
  refreshData: () => Promise<void>;
}

const INITIAL_STATE: UseDashboardState = {
  stats: null,
  recentProjects: [],
  recentLeaves: [],
  nonClockedInUsers: [],
  todaysTimeTracking: [],
  loading: false,
  error: null,
};

function useDashboard() {
  const [state, setState] = useState<UseDashboardState>(INITIAL_STATE);
  const service = useDashboardService();

  // Fetch dashboard data
  const fetchDashboardData = useCallback(async () => {
    setState((prev) => ({ ...prev, loading: true, error: null }));

    const result = await service.getDashboardData();

    if (result.success && result.data) {
      setState((prev) => ({
        ...prev,
        stats: result.data!.stats || null,
        recentProjects: result.data!.recent_projects || [],
        recentLeaves: result.data!.recent_leaves || [],
        nonClockedInUsers: result.data!.not_clocked_in_employees || [],
        todaysTimeTracking: result.data!.todays_time_tracking || [],
        loading: false,
        error: null,
      }));
    } else {
      setState((prev) => ({
        ...prev,
        stats: null,
        recentProjects: [],
        recentLeaves: [],
        nonClockedInUsers: [],
        todaysTimeTracking: [],
        loading: false,
        error: result.message,
      }));
    }
  }, [service]);

  // Auto-fetch on mount
  useEffect(() => {
    fetchDashboardData();
  }, []);

  // Refresh data action
  const refreshData = useCallback(async () => {
    await fetchDashboardData();
  }, []);

  const actions: UseDashboardActions = {
    refreshData,
  };

  return {
    ...state,
    loading: state.loading || service.loading,
    ...actions,
  };
}

export default useDashboard;
