import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
import { toast } from "sonner";
import {
    createNumeracion,
    deleteNumeracion,
    getNextNumber,
    getNumeracion,
    getNumeracionesByPuntoExpedicion,
    incrementNumber,
    setNumeracionDefault,
    toggleNumeracionStatus,
    unsetNumeracionDefault,
    updateNumeracion,
} from "../api/numeraciones.service";

export const useNumeracionesByPuntoExpedicionQuery = (puntoExpedicionId) => {
  return useQuery({
    queryKey: ["numeraciones", puntoExpedicionId],
    queryFn: () => getNumeracionesByPuntoExpedicion(puntoExpedicionId),
    enabled: !!puntoExpedicionId,
    select: (data) => data?.data || [],
  });
};

export const useNumeracionQuery = (id) => {
  return useQuery({
    queryKey: ["numeracion", id],
    queryFn: () => getNumeracion(id),
    enabled: !!id,
    select: (data) => data?.data,
  });
};

export const useNextNumberQuery = (id) => {
  return useQuery({
    queryKey: ["next-number", id],
    queryFn: () => getNextNumber(id),
    enabled: !!id,
    select: (data) => data?.data,
  });
};

export const useCreateNumeracionMutation = () => {
  const queryClient = useQueryClient();
  return useMutation({
    mutationFn: createNumeracion,
    onSuccess: (data) => {
      toast.success(data?.message || "Numeración creada");
      queryClient.invalidateQueries({ queryKey: ["numeraciones"] });
      queryClient.invalidateQueries({ queryKey: ["sucursal-detalle"] });
    },
    onError: (error) => {
      toast.error(
        error?.response?.data?.message || "Error al crear numeración",
      );
    },
  });
};

export const useUpdateNumeracionMutation = () => {
  const queryClient = useQueryClient();
  return useMutation({
    mutationFn: ({ id, data }) => updateNumeracion(id, data),
    onSuccess: (data) => {
      toast.success(data?.message || "Numeración actualizada");
      queryClient.invalidateQueries({ queryKey: ["numeraciones"] });
      queryClient.invalidateQueries({ queryKey: ["numeracion"] });
      queryClient.invalidateQueries({ queryKey: ["sucursal-detalle"] });
    },
    onError: (error) => {
      toast.error(error?.response?.data?.message || "Error al actualizar");
    },
  });
};

export const useIncrementNumberMutation = () => {
  const queryClient = useQueryClient();
  return useMutation({
    mutationFn: incrementNumber,
    onSuccess: () => {
      queryClient.invalidateQueries({ queryKey: ["numeraciones"] });
      queryClient.invalidateQueries({ queryKey: ["next-number"] });
    },
    onError: (error) => {
      toast.error(
        error?.response?.data?.message || "Error al incrementar número",
      );
    },
  });
};

export const useToggleNumeracionMutation = () => {
  const queryClient = useQueryClient();
  return useMutation({
    mutationFn: toggleNumeracionStatus,
    onSuccess: (data) => {
      toast.success(data?.message || "Estado actualizado");
      queryClient.invalidateQueries({ queryKey: ["numeraciones"] });
      queryClient.invalidateQueries({ queryKey: ["sucursal-detalle"] });
    },
    onError: (error) => {
      toast.error(error?.response?.data?.message || "Error al cambiar estado");
    },
  });
};

export const useSetNumeracionDefaultMutation = () => {
  const queryClient = useQueryClient();
  return useMutation({
    mutationFn: setNumeracionDefault,
    onSuccess: (data) => {
      toast.success(data?.message || "Numeración predeterminada");
      queryClient.invalidateQueries({ queryKey: ["numeraciones"] });
      queryClient.invalidateQueries({ queryKey: ["numeracion"] });
      queryClient.invalidateQueries({ queryKey: ["sucursal-detalle"] });
    },
    onError: (error) => {
      toast.error(
        error?.response?.data?.message || "Error al marcar como predeterminada",
      );
    },
  });
};

export const useUnsetNumeracionDefaultMutation = () => {
  const queryClient = useQueryClient();
  return useMutation({
    mutationFn: unsetNumeracionDefault,
    onSuccess: (data) => {
      toast.success(data?.message || "Predeterminada desmarcada");
      queryClient.invalidateQueries({ queryKey: ["numeraciones"] });
      queryClient.invalidateQueries({ queryKey: ["numeracion"] });
      queryClient.invalidateQueries({ queryKey: ["sucursal-detalle"] });
    },
    onError: (error) => {
      toast.error(
        error?.response?.data?.message || "Error al desmarcar predeterminada",
      );
    },
  });
};

export const useDeleteNumeracionMutation = () => {
  const queryClient = useQueryClient();
  return useMutation({
    mutationFn: deleteNumeracion,
    onSuccess: (data) => {
      toast.success(data?.message || "Numeración eliminada");
      queryClient.invalidateQueries({ queryKey: ["numeraciones"] });
      queryClient.invalidateQueries({ queryKey: ["sucursal-detalle"] });
    },
    onError: (error) => {
      toast.error(error?.response?.data?.message || "Error al eliminar");
    },
  });
};
