import { useState } from "react";
import {
  createContractor,
  getContractors,
  getContractorById,
  updateContractor,
  deleteContractor,
  getContractorTypes,
  createContractorType,
  getProjectsForDropdown,
  type ContractorFilters,
  type CreateContractorData,
  type UpdateContractorData,
  type CreateContractorTypeData,
  type ContractorListResponse,
  type ContractorResponse,
  type DeleteContractorResponse,
  type ContractorTypesResponse,
  type ProjectsResponse,
  type ContractorTypeResponse,
} from "../../services/contractorService";
import { handleToastError, customizeToast } from "../../utils";

function useContractorService() {
  const [loading, setLoading] = useState(false);

  // Create Contractor
  const createContractorAsync = async (data: CreateContractorData) => {
    try {
      setLoading(true);
      const response = await createContractor(data);

      // Check if the response indicates success
      if (response?.data?.success !== false) {
        customizeToast("Contractor created successfully", "success");
        return {
          success: true,
          data: response.data,
          message:
            response.data?.message || "Contractor created successfully",
        };
      } else {
        // Backend returned success: false, show the backend error message
        const errorMessage =
          response.data?.message || "Failed to create contractor";
        customizeToast(errorMessage, "danger");
        return {
          success: false,
          data: null,
          message: errorMessage,
        };
      }
    } catch (error: any) {
      setLoading(false);
      // Handle network errors or other exceptions
      const errorMessage = error?.response?.data?.message || error.toString();
      customizeToast(errorMessage, "danger");
      return {
        success: false,
        data: null,
        message: errorMessage,
      };
    } finally {
      setLoading(false);
    }
  };

  // Get Contractors
  const getContractorsAsync = async (filters?: ContractorFilters) => {
    try {
      setLoading(true);
      const response = await getContractors(filters);

      // Check if the response indicates success
      if (response?.data?.success !== false) {
        return {
          success: true,
          data: response.data,
          message: response.data?.message || "Contractors fetched successfully",
        };
      } else {
        // Backend returned success: false, show the backend error message
        const errorMessage =
          response.data?.message || "Failed to fetch contractors";
        customizeToast(errorMessage, "danger");
        return {
          success: false,
          data: null,
          message: errorMessage,
        };
      }
    } catch (error: any) {
      setLoading(false);
      // Handle network errors or other exceptions
      const errorMessage = error?.response?.data?.message || error.toString();
      customizeToast(errorMessage, "danger");
      return {
        success: false,
        data: null,
        message: errorMessage,
      };
    } finally {
      setLoading(false);
    }
  };

  // Get Contractor by ID
  const getContractorByIdAsync = async (id: string) => {
    try {
      setLoading(true);
      const response = await getContractorById(id);

      // Check if the response indicates success
      if (response?.data?.success !== false) {
        return {
          success: true,
          data: response.data,
          message: response.data?.message || "Contractor fetched successfully",
        };
      } else {
        // Backend returned success: false, show the backend error message
        const errorMessage =
          response.data?.message || "Failed to fetch contractor";
        customizeToast(errorMessage, "danger");
        return {
          success: false,
          data: null,
          message: errorMessage,
        };
      }
    } catch (error: any) {
      setLoading(false);
      // Handle network errors or other exceptions
      const errorMessage = error?.response?.data?.message || error.toString();
      customizeToast(errorMessage, "danger");
      return {
        success: false,
        data: null,
        message: errorMessage,
      };
    } finally {
      setLoading(false);
    }
  };

  // Update Contractor
  const updateContractorAsync = async (data: UpdateContractorData) => {
    try {
      setLoading(true);
      const response = await updateContractor(data);

      // Check if the response indicates success
      if (response?.data?.success !== false) {
        customizeToast("Contractor updated successfully", "success");
        return {
          success: true,
          data: response.data,
          message:
            response.data?.message || "Contractor updated successfully",
        };
      } else {
        // Backend returned success: false, show the backend error message
        const errorMessage =
          response.data?.message || "Failed to update contractor";
        customizeToast(errorMessage, "danger");
        return {
          success: false,
          data: null,
          message: errorMessage,
        };
      }
    } catch (error: any) {
      setLoading(false);
      // Handle network errors or other exceptions
      const errorMessage = error?.response?.data?.message || error.toString();
      customizeToast(errorMessage, "danger");
      return {
        success: false,
        data: null,
        message: errorMessage,
      };
    } finally {
      setLoading(false);
    }
  };

  // Delete Contractor
  const deleteContractorAsync = async (id: string) => {
    try {
      setLoading(true);
      const response = await deleteContractor(id);

      // Check if the response indicates success
      if (response?.data?.success !== false) {
        customizeToast("Contractor deleted successfully", "success");
        return {
          success: true,
          data: response.data,
          message:
            response.data?.message || "Contractor deleted successfully",
        };
      } else {
        // Backend returned success: false, show the backend error message
        const errorMessage =
          response.data?.message || "Failed to delete contractor";
        customizeToast(errorMessage, "danger");
        return {
          success: false,
          data: null,
          message: errorMessage,
        };
      }
    } catch (error: any) {
      setLoading(false);
      // Handle network errors or other exceptions
      const errorMessage = error?.response?.data?.message || error.toString();
      customizeToast(errorMessage, "danger");
      return {
        success: false,
        data: null,
        message: errorMessage,
      };
    } finally {
      setLoading(false);
    }
  };

  // Get Contractor Types
  const getContractorTypesAsync = async () => {
    try {
      const response = await getContractorTypes();

      // Check if the response indicates success
      if (response?.data?.success !== false) {
        return {
          success: true,
          data: response.data,
          message: response.data?.message || "Contractor types fetched successfully",
        };
      } else {
        // Backend returned success: false, show the backend error message
        const errorMessage =
          response.data?.message || "Failed to fetch contractor types";
        customizeToast(errorMessage, "danger");
        return {
          success: false,
          data: null,
          message: errorMessage,
        };
      }
    } catch (error: any) {
      // Handle network errors or other exceptions
      const errorMessage = error?.response?.data?.message || error.toString();
      customizeToast(errorMessage, "danger");
      return {
        success: false,
        data: null,
        message: errorMessage,
      };
    }
  };

  // Create Contractor Type (Inline)
  const createContractorTypeAsync = async (data: CreateContractorTypeData) => {
    try {
      const response = await createContractorType(data);

      // Check if the response indicates success
      if (response?.data?.success !== false) {
        customizeToast("Contractor type created successfully", "success");
        return {
          success: true,
          data: response.data,
          message:
            response.data?.message || "Contractor type created successfully",
        };
      } else {
        // Backend returned success: false, show the backend error message
        const errorMessage =
          response.data?.message || "Failed to create contractor type";
        customizeToast(errorMessage, "danger");
        return {
          success: false,
          data: null,
          message: errorMessage,
        };
      }
    } catch (error: any) {
      // Handle network errors or other exceptions
      const errorMessage = error?.response?.data?.message || error.toString();
      customizeToast(errorMessage, "danger");
      return {
        success: false,
        data: null,
        message: errorMessage,
      };
    }
  };

  // Get Projects for dropdown
  const getProjectsForDropdownAsync = async () => {
    try {
      const response = await getProjectsForDropdown();

      // Check if the response indicates success
      if (response?.data?.success !== false) {
        return {
          success: true,
          data: response.data,
          message: response.data?.message || "Projects fetched successfully",
        };
      } else {
        // Backend returned success: false, show the backend error message
        const errorMessage =
          response.data?.message || "Failed to fetch projects";
        customizeToast(errorMessage, "danger");
        return {
          success: false,
          data: null,
          message: errorMessage,
        };
      }
    } catch (error: any) {
      // Handle network errors or other exceptions
      const errorMessage = error?.response?.data?.message || error.toString();
      customizeToast(errorMessage, "danger");
      return {
        success: false,
        data: null,
        message: errorMessage,
      };
    }
  };

  return {
    loading,
    createContractor: createContractorAsync,
    getContractors: getContractorsAsync,
    getContractorById: getContractorByIdAsync,
    updateContractor: updateContractorAsync,
    deleteContractor: deleteContractorAsync,
    getContractorTypes: getContractorTypesAsync,
    createContractorType: createContractorTypeAsync,
    getProjectsForDropdown: getProjectsForDropdownAsync,
  };
}

export default useContractorService;
