import { useState } from "react";
import {
  createSalarySetting,
  getSalarySettings,
  getSalarySettingById,
  updateSalarySetting,
  deleteSalarySetting,
  type SalarySettingsFilters,
  type CreateSalarySettingData,
  type UpdateSalarySettingData,
} from "../../services/salarySettingsService";
import { customizeToast } from "../../utils";
import { salarySettingMessages } from "../../helpers/messageHelper";

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

  // Create Salary Setting
  const createSalarySettingAsync = async (data: CreateSalarySettingData) => {
    try {
      setLoading(true);
      const response = await createSalarySetting(data);

      // Check if the response indicates success
      if (response?.data?.success !== false) {
        customizeToast(salarySettingMessages.created(), "success");
        return {
          success: true,
          data: response.data,
          message:
            response.data?.message || "Salary setting created successfully",
        };
      } else {
        // Backend returned success: false, show the backend error message
        const errorMessage =
          response.data?.message || salarySettingMessages.createError();
        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 Salary Settings
  const getSalarySettingsAsync = async (filters?: SalarySettingsFilters) => {
    try {
      setLoading(true);
      const response = await getSalarySettings(filters);

      // Check if the response indicates success
      if (response?.data?.success !== false) {
        return {
          success: true,
          data: response.data,
          message: "Salary settings fetched successfully",
        };
      } else {
        // Backend returned success: false, show the backend error message
        const errorMessage =
          response.data?.message || "Failed to fetch salary settings";
        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();
      return {
        success: false,
        data: null,
        message: errorMessage,
      };
    } finally {
      setLoading(false);
    }
  };

  // Get Salary Setting by ID
  const getSalarySettingByIdAsync = async (id: string) => {
    try {
      setLoading(true);
      const response = await getSalarySettingById(id);

      // Check if the response indicates success
      if (response?.data?.success !== false) {
        return {
          success: true,
          data: response.data,
          message: "Salary setting fetched successfully",
        };
      } else {
        // Backend returned success: false, show the backend error message
        const errorMessage =
          response.data?.message || "Failed to fetch salary setting";
        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();
      return {
        success: false,
        data: null,
        message: errorMessage,
      };
    } finally {
      setLoading(false);
    }
  };

  // Update Salary Setting
  const updateSalarySettingAsync = async (data: UpdateSalarySettingData) => {
    try {
      setLoading(true);
      const response = await updateSalarySetting(data);

      // Check if the response indicates success
      if (response?.data?.success !== false) {
        customizeToast(salarySettingMessages.updated(), "success");
        return {
          success: true,
          data: response.data,
          message:
            response.data?.message || "Salary setting updated successfully",
        };
      } else {
        // Backend returned success: false, show the backend error message
        const errorMessage =
          response.data?.message || "Failed to update salary setting";
        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 Salary Setting
  const deleteSalarySettingAsync = async (id: string) => {
    try {
      setLoading(true);
      const response = await deleteSalarySetting(id);

      // Check if the response indicates success
      if (response?.data?.success !== false) {
        customizeToast(salarySettingMessages.deleted(), "success");
        return {
          success: true,
          data: response.data,
          message:
            response.data?.message || "Salary setting deleted successfully",
        };
      } else {
        // Backend returned success: false, show the backend error message
        const errorMessage =
          response.data?.message || "Failed to delete salary setting";
        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);
    }
  };

  return {
    loading,
    createSalarySetting: createSalarySettingAsync,
    getSalarySettings: getSalarySettingsAsync,
    getSalarySettingById: getSalarySettingByIdAsync,
    updateSalarySetting: updateSalarySettingAsync,
    deleteSalarySetting: deleteSalarySettingAsync,
  };
}

export default useSalarySettingsService;
