import { useState, useEffect, useCallback } from "react";
import {
  getMyMisList,
  type MyMisRow,
  type MyMisFilters,
} from "@/lib/services/misService";

interface UseMyMisState {
  data: MyMisRow[];
  loading: boolean;
  error: string | null;
  year: number;
}

interface UseMyMisActions {
  setYear: (year: number) => void;
  refreshData: () => Promise<void>;
}

const getCurrentYear = (): number => {
  return new Date().getFullYear();
};

const INITIAL_STATE: UseMyMisState = {
  data: [],
  loading: false,
  error: null,
  year: getCurrentYear(),
};

export function useMyMis() {
  const [state, setState] = useState<UseMyMisState>(INITIAL_STATE);

  const fetchData = useCallback(async () => {
    setState((prev) => ({ ...prev, loading: true, error: null }));
    const filters: MyMisFilters = {
      year: String(state.year),
    };
    const result = await getMyMisList(filters);
    if (result.success && result.data) {
      setState((prev) => ({
        ...prev,
        data: result.data,
        loading: false,
        error: null,
      }));
    } else {
      setState((prev) => ({
        ...prev,
        data: [],
        loading: false,
        error: result.message ?? "Failed to load data",
      }));
    }
  }, [state.year]);

  // Refetch when year changes
  useEffect(() => {
    fetchData();
  }, [fetchData]);

  const setYear = useCallback((year: number) => {
    setState((prev) => ({ ...prev, year }));
  }, []);

  const refreshData = useCallback(async () => {
    await fetchData();
  }, [fetchData]);

  return {
    ...state,
    setYear,
    refreshData,
  } as UseMyMisState & UseMyMisActions;
}
