import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
import { clientService } from "../services/client.service";
import {
  AcceptClientInvitationPayload,
  InviteClientPayload,
  UpdateClientPayload,
} from "../types/client.type";
import { PaginationParams } from "@/lib/pagination";
import { showToast } from "@/lib/toast";

const CLIENT_KEY = "clients";

export const useGetClients = (params: PaginationParams) =>
  useQuery({
    queryKey: [CLIENT_KEY, params],
    queryFn: () => clientService.getClients(params),
    placeholderData: (prev) => prev,
  });

export const useGetClient = (id: string) =>
  useQuery({
    queryKey: [CLIENT_KEY, id],
    queryFn: () => clientService.getClient(id),
    select: (res) => res.data,
    enabled: !!id,
  });

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

export const useAcceptClientInvitation = (onSuccess?: () => void) => {
  return useMutation({
    mutationFn: (payload: AcceptClientInvitationPayload) =>
      clientService.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 useUpdateClient = (id: string, onSuccess?: () => void) => {
  const qc = useQueryClient();
  return useMutation({
    mutationFn: (payload: UpdateClientPayload) => clientService.updateClient(id, payload),
    onSuccess: (res: any) => {
      qc.invalidateQueries({ queryKey: [CLIENT_KEY] });
      showToast.success(res.message || "Client updated successfully!");
      onSuccess?.();
    },
    onError: (err: any) => {
      showToast.error(err?.response?.data?.error || "Failed to update client");
    },
  });
};

export const useDeleteClient = () => {
  const qc = useQueryClient();
  return useMutation({
    mutationFn: (id: string) => clientService.deleteClient(id),
    onSuccess: (res: any) => {
      qc.invalidateQueries({ queryKey: [CLIENT_KEY] });
      showToast.success(res.message || "Client deleted successfully!");
    },
    onError: (err: any) => {
      showToast.error(err?.response?.data?.error || "Failed to delete client");
    },
  });
};
