import { useState, useEffect, useCallback } from "react";
import useProjectService from "./useProjectService";

interface UseProjectCompletionPercentageState {
  completionPercentage: number | null;
  loading: boolean;
  error: string | null;
}

interface UseProjectCompletionPercentageActions {
  refreshCompletion: () => Promise<void>;
  updateCompletion: (completion_percentage: number) => Promise<boolean>;
}

const INITIAL_STATE: UseProjectCompletionPercentageState = {
  completionPercentage: null,
  loading: false,
  error: null,
};

function useProjectCompletionPercentage(projectId: string) {
  const [state, setState] =
    useState<UseProjectCompletionPercentageState>(INITIAL_STATE);
  const service = useProjectService();

  const refreshCompletion = useCallback(async () => {
    if (!projectId) return;

    setState((prev) => ({ ...prev, loading: true, error: null }));

    const result = await service.getProjectById(projectId);

    if (result.success && result.data) {
      const value = result.data?.data?.completion_percentage;
      setState((prev) => ({
        ...prev,
        completionPercentage:
          value != null ? Number(value) : null,
        loading: false,
        error: null,
      }));
    } else {
      setState((prev) => ({
        ...prev,
        completionPercentage: null,
        loading: false,
        error: result.message || "Failed to fetch completion percentage",
      }));
    }
  }, [projectId, service]);

  useEffect(() => {
    if (projectId) {
      refreshCompletion();
    }
  }, [projectId]);

  const updateCompletion = useCallback(
    async (completion_percentage: number): Promise<boolean> => {
      if (!projectId) return false;

      const result = await service.updateCompletionPercentage(
        projectId,
        completion_percentage
      );
      if (result.success) {
        setState((prev) => ({
          ...prev,
          completionPercentage: completion_percentage,
          error: null,
        }));
      }
      return result.success;
    },
    [projectId, service]
  );

  const actions: UseProjectCompletionPercentageActions = {
    refreshCompletion,
    updateCompletion,
  };

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

export default useProjectCompletionPercentage;
