import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
import { toast } from "sonner";
import {
  cambiarCondicionCompra,
  confirmarCompra,
  consultarDocumentos,
  getMarangatuConfig,
  getPendientes,
  importarCompras,
  importarNotasCredito,
  importarVentas,
  marcarElectronicos,
  rechazarCompra,
  saveMarangatuConfig,
  triggerSyncCompras,
  triggerSyncVentas,
  vincularProductoDetalle,
} from "../api/marangatu.service";
import { getObligacionesFiscales } from "../api/compras.service";

export const useMarangatuConfigQuery = () => {
  return useQuery({
    queryKey: ["marangatu-config"],
    queryFn: getMarangatuConfig,
  });
};

export const useSaveMarangatuConfigMutation = () => {
  const queryClient = useQueryClient();
  return useMutation({
    mutationFn: saveMarangatuConfig,
    onSuccess: () => {
      queryClient.invalidateQueries({ queryKey: ["marangatu-config"] });
      toast.success("Configuración Marangatu guardada");
    },
    onError: (error) => {
      toast.error(error.response?.data?.message || "Error al guardar configuración Marangatu");
    },
  });
};

export const useTriggerSyncComprasMutation = () => {
  return useMutation({
    mutationFn: triggerSyncCompras,
    onSuccess: () => {
      toast.success("Captura COMPRAS iniciada — los resultados llegarán por WebSocket");
    },
    onError: (error) => {
      toast.error(error.response?.data?.message || "Error al iniciar sincronización COMPRAS");
    },
  });
};

export const useTriggerSyncVentasMutation = () => {
  return useMutation({
    mutationFn: triggerSyncVentas,
    onSuccess: () => {
      toast.success("Captura VENTAS iniciada — los resultados llegarán por WebSocket");
    },
    onError: (error) => {
      toast.error(error.response?.data?.message || "Error al iniciar sincronización VENTAS");
    },
  });
};

export const useImportarComprasMutation = () => {
  const queryClient = useQueryClient();
  return useMutation({
    mutationFn: importarCompras,
    onSuccess: (data) => {
      queryClient.invalidateQueries({ queryKey: ["compras"] });
      queryClient.invalidateQueries({ queryKey: ["marangatu-pendientes"] });
    },
    onError: (error) => {
      toast.error(error.response?.data?.message || "Error al importar compras");
    },
  });
};

export const useMarcarElectronicosMutation = () => {
  const queryClient = useQueryClient();
  return useMutation({
    mutationFn: marcarElectronicos,
    onSuccess: (data) => {
      const marcados = (data?.gastos_marcados ?? 0) + (data?.compras_marcadas ?? 0);
      toast.success(
        marcados > 0
          ? `${marcados} comprobante(s) marcados como electrónicos: ya no se declararán en el Libro IVA Compras.`
          : "No había comprobantes por marcar: los del período ya estaban al día.",
      );
      queryClient.invalidateQueries({ queryKey: ["compras"] });
      queryClient.invalidateQueries({ queryKey: ["libro-iva-compras"] });
    },
    onError: (error) => {
      toast.error(error.response?.data?.message || "Error al marcar los comprobantes electrónicos");
    },
  });
};

export const useImportarVentasMutation = () => {
  const queryClient = useQueryClient();
  return useMutation({
    mutationFn: importarVentas,
    onSuccess: () => {
      queryClient.invalidateQueries({ queryKey: ["facturas"] });
      toast.success("Ventas importadas correctamente");
    },
    onError: (error) => {
      toast.error(error.response?.data?.message || "Error al importar ventas");
    },
  });
};

export const useImportarNotasCreditoMutation = () => {
  const queryClient = useQueryClient();
  return useMutation({
    mutationFn: importarNotasCredito,
    onSuccess: (data) => {
      queryClient.invalidateQueries({ queryKey: ["facturas"] });
      queryClient.invalidateQueries({ queryKey: ["nota-creditos"] });
      const importadas = data?.importadas ?? 0;
      const omitidas = data?.omitidas ?? 0;
      if (importadas > 0) toast.success(`${importadas} NC importada${importadas !== 1 ? "s" : ""}`);
      if (omitidas > 0) toast.warning(`${omitidas} NC omitida${omitidas !== 1 ? "s" : ""} — ver detalle`);
    },
    onError: (error) => {
      toast.error(error.response?.data?.message || "Error al importar notas de crédito");
    },
  });
};

export const useConsultarDocumentosMutation = () => {
  return useMutation({
    mutationFn: consultarDocumentos,
  });
};

export const usePendientesQuery = ({ enabled = true } = {}) => {
  return useQuery({
    queryKey: ["marangatu-pendientes"],
    queryFn: getPendientes,
    refetchInterval: 60_000,
    enabled,
  });
};

export const useRechazarCompraMutation = () => {
  const queryClient = useQueryClient();
  return useMutation({
    mutationFn: rechazarCompra,
    onSuccess: (data) => {
      queryClient.invalidateQueries({ queryKey: ["marangatu-pendientes"] });
      toast.success(data?.mensaje ?? "Compra rechazada");
    },
    onError: (error) => {
      toast.error(error.response?.data?.message || "Error al rechazar compra");
    },
  });
};

export const useVincularProductoMutation = () => {
  const queryClient = useQueryClient();
  return useMutation({
    mutationFn: vincularProductoDetalle,
    onSuccess: () => {
      queryClient.invalidateQueries({ queryKey: ["marangatu-pendientes"] });
    },
    onError: (error) => {
      toast.error(error.response?.data?.message || "Error al vincular producto");
    },
  });
};

export const useCambiarCondicionCompraMutation = () => {
  const queryClient = useQueryClient();
  return useMutation({
    mutationFn: cambiarCondicionCompra,
    onSuccess: (data) => {
      queryClient.invalidateQueries({ queryKey: ["marangatu-pendientes"] });
      toast.success(data?.mensaje ?? "Condición actualizada");
    },
    onError: (error) => {
      toast.error(error.response?.data?.message || "Error al cambiar condición");
    },
  });
};

export const useConfirmarCompraMutation = () => {
  const queryClient = useQueryClient();
  return useMutation({
    mutationFn: confirmarCompra,
    onSuccess: (data) => {
      queryClient.invalidateQueries({ queryKey: ["marangatu-pendientes"] });
      queryClient.invalidateQueries({ queryKey: ["compras"] });
      toast.success(data?.mensaje ?? "Compra confirmada");
    },
    onError: (error) => {
      toast.error(error.response?.data?.message || "Error al confirmar compra");
    },
  });
};

/** Impuestos que imputa la empresa: lo que se precarga en la imputación de compras y gastos. */
export const useObligacionesFiscalesQuery = () =>
  useQuery({
    queryKey: ["obligaciones-fiscales"],
    queryFn: getObligacionesFiscales,
    staleTime: 10 * 60_000,
  });
