import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
import { toast } from "sonner";
import {
    addEmpresaMoneda,
    createCotizacion,
    createMoneda,
    deleteCotizacion,
    getCotizaciones,
    getEmpresaMonedas,
    getMonedas,
    getUltimaCotizacion,
    removeEmpresaMoneda,
    toggleMonedaStatus,
    updateCotizacion,
    updateEmpresaMoneda,
    updateMoneda,
} from "../api/monedas.service";

// ==================== MONEDAS (Catálogo global) ====================

export const useMonedasQuery = (includeInactive = false) => {
  return useQuery({
    queryKey: ["monedas", includeInactive],
    queryFn: () => getMonedas(includeInactive),
  });
};

export const useCreateMonedaMutation = () => {
  const queryClient = useQueryClient();
  return useMutation({
    mutationFn: createMoneda,
    onSuccess: () => {
      toast.success("Moneda creada correctamente");
      queryClient.invalidateQueries({ queryKey: ["monedas"] });
    },
    onError: (error) => {
      toast.error(error.response?.data?.message || "Error al crear moneda");
    },
  });
};

export const useUpdateMonedaMutation = () => {
  const queryClient = useQueryClient();
  return useMutation({
    mutationFn: ({ id, data }) => updateMoneda(id, data),
    onSuccess: () => {
      toast.success("Moneda actualizada correctamente");
      queryClient.invalidateQueries({ queryKey: ["monedas"] });
    },
    onError: (error) => {
      toast.error(
        error.response?.data?.message || "Error al actualizar moneda",
      );
    },
  });
};

export const useToggleMonedaMutation = () => {
  const queryClient = useQueryClient();
  return useMutation({
    mutationFn: toggleMonedaStatus,
    onSuccess: () => {
      toast.success("Estado de moneda actualizado");
      queryClient.invalidateQueries({ queryKey: ["monedas"] });
    },
    onError: (error) => {
      toast.error(error.response?.data?.message || "Error al cambiar estado");
    },
  });
};

// ==================== EMPRESA MONEDAS ====================

export const useEmpresaMonedasQuery = () => {
  return useQuery({
    queryKey: ["empresa-monedas"],
    queryFn: getEmpresaMonedas,
  });
};

export const useAddEmpresaMonedaMutation = () => {
  const queryClient = useQueryClient();
  return useMutation({
    mutationFn: addEmpresaMoneda,
    onSuccess: () => {
      toast.success("Moneda agregada a la empresa");
      queryClient.invalidateQueries({ queryKey: ["empresa-monedas"] });
    },
    onError: (error) => {
      toast.error(error.response?.data?.message || "Error al agregar moneda");
    },
  });
};

export const useUpdateEmpresaMonedaMutation = () => {
  const queryClient = useQueryClient();
  return useMutation({
    mutationFn: ({ id, data }) => updateEmpresaMoneda(id, data),
    onSuccess: () => {
      toast.success("Configuración actualizada");
      queryClient.invalidateQueries({ queryKey: ["empresa-monedas"] });
    },
    onError: (error) => {
      toast.error(error.response?.data?.message || "Error al actualizar");
    },
  });
};

export const useRemoveEmpresaMonedaMutation = () => {
  const queryClient = useQueryClient();
  return useMutation({
    mutationFn: removeEmpresaMoneda,
    onSuccess: () => {
      toast.success("Moneda removida de la empresa");
      queryClient.invalidateQueries({ queryKey: ["empresa-monedas"] });
    },
    onError: (error) => {
      toast.error(error.response?.data?.message || "Error al remover moneda");
    },
  });
};

// ==================== COTIZACIONES ====================

export const useCotizacionesQuery = (moneda_id = null, limit = 30) => {
  return useQuery({
    queryKey: ["cotizaciones", moneda_id, limit],
    queryFn: () => getCotizaciones(moneda_id, limit),
  });
};

export const useUltimaCotizacionQuery = (moneda_id) => {
  return useQuery({
    queryKey: ["ultima-cotizacion", moneda_id],
    queryFn: () => getUltimaCotizacion(moneda_id),
    enabled: !!moneda_id,
  });
};

export const useCreateCotizacionMutation = () => {
  const queryClient = useQueryClient();
  return useMutation({
    mutationFn: createCotizacion,
    onSuccess: () => {
      toast.success("Cotización registrada");
      queryClient.invalidateQueries({ queryKey: ["cotizaciones"] });
      queryClient.invalidateQueries({ queryKey: ["ultima-cotizacion"] });
      // El backend también la graba en Contabilidad → Tipo de Cambio.
      queryClient.invalidateQueries({ queryKey: ["tipos-cambio"] });
      queryClient.invalidateQueries({ queryKey: ["cotizaciones-pendientes-hoy"] });
    },
    onError: (error) => {
      toast.error(
        error.response?.data?.message || "Error al registrar cotización",
      );
    },
  });
};

export const useUpdateCotizacionMutation = () => {
  const queryClient = useQueryClient();
  return useMutation({
    mutationFn: ({ id, data }) => updateCotizacion(id, data),
    onSuccess: () => {
      toast.success("Cotización actualizada");
      queryClient.invalidateQueries({ queryKey: ["cotizaciones"] });
      queryClient.invalidateQueries({ queryKey: ["ultima-cotizacion"] });
      // El backend también la graba en Contabilidad → Tipo de Cambio.
      queryClient.invalidateQueries({ queryKey: ["tipos-cambio"] });
      queryClient.invalidateQueries({ queryKey: ["cotizaciones-pendientes-hoy"] });
    },
    onError: (error) => {
      toast.error(
        error.response?.data?.message || "Error al actualizar cotización",
      );
    },
  });
};

export const useDeleteCotizacionMutation = () => {
  const queryClient = useQueryClient();
  return useMutation({
    mutationFn: deleteCotizacion,
    onSuccess: () => {
      toast.success("Cotización eliminada");
      queryClient.invalidateQueries({ queryKey: ["cotizaciones"] });
      queryClient.invalidateQueries({ queryKey: ["ultima-cotizacion"] });
      // El backend también la graba en Contabilidad → Tipo de Cambio.
      queryClient.invalidateQueries({ queryKey: ["tipos-cambio"] });
      queryClient.invalidateQueries({ queryKey: ["cotizaciones-pendientes-hoy"] });
    },
    onError: (error) => {
      toast.error(
        error.response?.data?.message || "Error al eliminar cotización",
      );
    },
  });
};
