import { Dispatch, SetStateAction, useEffect } from "react";
import { api } from "../API/API";

/**
 * Interface for reported time per category + total time reported
 */
export interface projectTimes {
  admin: number;
  development: number;
  meeting: number;
  own_work: number;
  study: number;
  testing: number;
  totalTime?: number;
}

/**
 * Gets all reported times for this project
 * @param {Dispatch} props.setTimesProp - A setStateAction for the map you want to put times in
 * @param {string} props.projectName - Username
 * @returns {void} Nothing
 * @example
 *  const projectName = "Example";
 *  const [times, setTimes] = useState<Times>();
 *  GetProjectTimes({ setTimesProp: setTimes, projectName: projectName });
 */
function GetProjectTimes(props: {
  setTimesProp: Dispatch<SetStateAction<projectTimes | undefined>>;
  projectName: string;
}): void {
  const setTimes: Dispatch<SetStateAction<projectTimes | undefined>> =
    props.setTimesProp;
  useEffect(() => {
    const fetchUsers = async (): Promise<void> => {
      try {
        const token = localStorage.getItem("accessToken") ?? "";
        const response = await api.getProjectTimes(props.projectName, token);
        if (response.success && response.data) {
          // Calculates total time reported
          response.data.totalTime = response.data.admin;
          response.data.totalTime += response.data.development;
          response.data.totalTime += response.data.meeting;
          response.data.totalTime += response.data.own_work;
          response.data.totalTime += response.data.study;
          response.data.totalTime += response.data.testing;
          setTimes(response.data);
        } else {
          console.error("Failed to fetch project times:", response.message);
        }
      } catch (error) {
        console.error("Error fetching times:", error);
      }
    };

    void fetchUsers();
  }, [props.projectName, setTimes]);
}

export default GetProjectTimes;
