import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
import { departmentService } from "../services/department.service";
import {
  CreateDepartmentPayload,
  UpdateDepartmentPayload,
} from "../types/department.type";
import { PaginationParams } from "@/lib/pagination";
import { showToast } from "@/lib/toast";

const DEPT_KEY = "departments";

export const useGetDepartments = (params: PaginationParams) =>
  useQuery({
    queryKey: [DEPT_KEY, params],
    queryFn: () => departmentService.getDepartments(params),
    placeholderData: (prev) => prev,
  });

export const useGetDepartment = (id: string) =>
  useQuery({
    queryKey: [DEPT_KEY, id],
    queryFn: () => departmentService.getDepartment(id),
    select: (res) => res.data,
    enabled: !!id,
  });

export const useCreateDepartment = (onSuccess?: () => void) => {
  const qc = useQueryClient();
  return useMutation({
    mutationFn: (payload: CreateDepartmentPayload) =>
      departmentService.createDepartment(payload),
    onSuccess: (res) => {
      qc.invalidateQueries({ queryKey: [DEPT_KEY] });
      showToast.success(res.message || "Department created successfully!");
      onSuccess?.();
    },
    onError: (err: any) => {
      showToast.error(
        err?.response?.data?.error || "Failed to create department",
      );
    },
  });
};

export const useUpdateDepartment = (onSuccess?: () => void) => {
  const qc = useQueryClient();
  return useMutation({
    mutationFn: ({
      id,
      payload,
    }: {
      id: string;
      payload: UpdateDepartmentPayload;
    }) => departmentService.updateDepartment(id, payload),
    onSuccess: (res) => {
      qc.invalidateQueries({ queryKey: [DEPT_KEY] });
      showToast.success(res.message || "Department updated successfully!");
      onSuccess?.();
    },
    onError: (err: any) => {
      showToast.error(
        err?.response?.data?.error || "Failed to update department",
      );
    },
  });
};

export const useDeleteDepartment = () => {
  const qc = useQueryClient();
  return useMutation({
    mutationFn: (id: string) => departmentService.deleteDepartment(id),
    onSuccess: (res) => {
      qc.invalidateQueries({ queryKey: [DEPT_KEY] });
      showToast.success(res.message || "Department deleted successfully!");
    },
    onError: (err: any) => {
      showToast.error(
        err?.response?.data?.error || "Failed to delete department",
      );
    },
  });
};
