import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
import { employeeService } from "../services/employee.service";
import {
  AcceptInvitationPayload,
  InviteEmployeePayload,
} from "../types/employee.type";
import { PaginationParams } from "@/lib/pagination";
import { showToast } from "@/lib/toast";

const EMP_KEY = "employees";

export const useGetEmployees = (params: PaginationParams) =>
  useQuery({
    queryKey: [EMP_KEY, params],
    queryFn: () => employeeService.getEmployees(params),
    placeholderData: (prev) => prev,
  });

export const useGetEmployee = (id: string) =>
  useQuery({
    queryKey: [EMP_KEY, id],
    queryFn: () => employeeService.getEmployee(id),
    select: (res) => res.data,
    enabled: !!id,
  });

export const useInviteEmployee = (onSuccess?: () => void) => {
  const qc = useQueryClient();
  return useMutation({
    mutationFn: (payload: InviteEmployeePayload) =>
      employeeService.inviteEmployee(payload),
    onSuccess: (res) => {
      qc.invalidateQueries({ queryKey: [EMP_KEY] });
      showToast.success(res.message || "Invitation sent successfully!");
      onSuccess?.();
    },
    onError: (err: any) => {
      showToast.error(err?.response?.data?.error || "Failed to send invitation");
    },
  });
};

export const useAcceptInvitation = (onSuccess?: () => void) => {
  return useMutation({
    mutationFn: (payload: AcceptInvitationPayload) =>
      employeeService.acceptInvitation(payload),
    onSuccess: (res) => {
      showToast.success(res.message || "Account created successfully!");
      onSuccess?.();
    },
    onError: (err: any) => {
      showToast.error(err?.response?.data?.error || "Failed to accept invitation");
    },
  });
};

export const useDeleteEmployee = () => {
  const qc = useQueryClient();
  return useMutation({
    mutationFn: (id: string) => employeeService.deleteEmployee(id),
    onSuccess: (res: any) => {
      qc.invalidateQueries({ queryKey: [EMP_KEY] });
      showToast.success(res.message || "Employee deleted successfully!");
    },
    onError: (err: any) => {
      showToast.error(err?.response?.data?.error || "Failed to delete employee");
    },
  });
};
