import { Box } from "@mui/material";
import { useQuery, useQueryClient } from "@tanstack/react-query";
import { useState } from "react";
import { toast } from "sonner";
import {
  actualizarReglaPrecio,
  crearReglaPrecio,
  desactivarReglaPrecio,
  getReglasPrecio,
} from "../api/reglas-precio.service";
import { AccesoRestringido } from "../components/common/AccesoRestringido";
import { ScreenGuia } from "../components/_standards";
import { PrevisualizarReglaDialog } from "../components/organismos/reglas-precio/PrevisualizarReglaDialog";
import { RecalcularListaDialog } from "../components/organismos/reglas-precio/RecalcularListaDialog";
import { ReglaPrecioFormDialog } from "../components/organismos/reglas-precio/ReglaPrecioFormDialog";
import { ReglasPrecioTemplate } from "../components/templates/reglas-precio/ReglasPrecioTemplate";
import { useConfirmDialog } from "../hooks/useConfirmDialog";
import { usePermission } from "../hooks/usePermission";

const GUIA_PASOS = [
  {
    icon: "mdi:ruler",
    color: "#60a5fa",
    titulo: "1. Definí los tramos de costo",
    desc: "Cada regla cubre un rango de costo (ej: 0 a 500.000) y una lista de precios destino.",
  },
  {
    icon: "mdi:calculator-variant",
    color: "#34d399",
    titulo: "2. Elegí cómo se marca el precio",
    desc: "Margen sobre costo, markup sobre precio de venta, o un precio fijo. Con redondeo configurable.",
  },
  {
    icon: "mdi:eye-outline",
    color: "#fbbf24",
    titulo: "3. Previsualizá antes de aplicar",
    desc: "Mirá cuántos productos caen en el rango y cómo quedaría el precio antes de escribir nada.",
  },
  {
    icon: "mdi:refresh-circle",
    color: "#a78bfa",
    titulo: "4. Recalculá",
    desc: "Aplicá las reglas a todo el catálogo o a productos puntuales. Los precios editados a mano se preservan por defecto.",
  },
];

const GUIA_NOTAS = [
  {
    icon: "mdi:lock-outline",
    text: "El precio sugerido por una regla se puede editar a mano en la ficha del producto, pero requiere el permiso de override — queda registrado quién lo cambió.",
  },
  {
    icon: "mdi:priority-high",
    text: "Si el costo de un producto cae en el rango de varias reglas activas de la misma lista, gana la de mayor prioridad.",
  },
  {
    icon: "mdi:cash-multiple",
    text: "Al recalcular, además del precio contado se regenera la grilla de cuotas del producto (si hay planes de cuotas activos).",
  },
];

export function ReglasPrecio() {
  const { can } = usePermission("INVENTARIO");
  const canRead = can("INV_RGP_REGLA_VER");
  const canCreate = can("INV_RGP_REGLA_CREAR");
  const canEdit = can("INV_RGP_REGLA_EDITAR");
  const canDelete = can("INV_RGP_REGLA_ELIMINAR");

  const queryClient = useQueryClient();
  const { confirm, dialogs } = useConfirmDialog();

  const [formOpen, setFormOpen] = useState(false);
  const [reglaEdicion, setReglaEdicion] = useState(null);
  const [saving, setSaving] = useState(false);
  const [previsualizarRegla, setPrevisualizarRegla] = useState(null);
  const [recalcularOpen, setRecalcularOpen] = useState(false);

  const { data, isLoading } = useQuery({
    queryKey: ["reglas-precio"],
    queryFn: () => getReglasPrecio(),
    enabled: canRead,
    refetchOnWindowFocus: false,
  });
  const reglas = data?.data || [];

  const invalidar = () => queryClient.invalidateQueries({ queryKey: ["reglas-precio"] });

  const handleCrear = () => {
    setReglaEdicion(null);
    setFormOpen(true);
  };

  const handleEditar = (regla) => {
    setReglaEdicion(regla);
    setFormOpen(true);
  };

  const handleSubmitForm = async (payload) => {
    setSaving(true);
    try {
      if (reglaEdicion) {
        await actualizarReglaPrecio(reglaEdicion.id, payload);
        toast.success("Regla actualizada correctamente");
      } else {
        await crearReglaPrecio(payload);
        toast.success("Regla creada correctamente");
      }
      setFormOpen(false);
      setReglaEdicion(null);
      invalidar();
    } catch (error) {
      toast.error(error?.response?.data?.message || "Error al guardar la regla de precio");
    } finally {
      setSaving(false);
    }
  };

  const handleDesactivar = async (regla) => {
    const ok = await confirm({
      title: "Desactivar regla de precio",
      message: `"${regla.nombre}" dejará de aplicarse en próximos cálculos de precio. Los precios ya escritos no cambian. ¿Confirmás?`,
      confirmText: "Desactivar",
      confirmColor: "error",
    });
    if (!ok) return;
    try {
      await desactivarReglaPrecio(regla.id);
      toast.success("Regla desactivada");
      invalidar();
    } catch (error) {
      toast.error(error?.response?.data?.message || "Error al desactivar la regla");
    }
  };

  if (!canRead) {
    return <AccesoRestringido mensaje="No tienes permisos para ver las reglas de precio." />;
  }

  return (
    <>
      <Box sx={{ mb: 2 }}>
        <ScreenGuia
          moduloPadre="Inventario · Listas de precios"
          titulo="Reglas de precio"
          intro="Definí cómo se marca automáticamente el precio contado a partir del costo del producto, por rango de costo."
          pasos={GUIA_PASOS}
          notas={GUIA_NOTAS}
        />
      </Box>

      <ReglasPrecioTemplate
        reglas={reglas}
        loading={isLoading}
        canCreate={canCreate}
        canEdit={canEdit}
        canDelete={canDelete}
        onCrear={handleCrear}
        onEditar={handleEditar}
        onPrevisualizar={setPrevisualizarRegla}
        onDesactivar={handleDesactivar}
        onRecalcular={() => setRecalcularOpen(true)}
      />

      <ReglaPrecioFormDialog
        open={formOpen}
        onClose={() => {
          setFormOpen(false);
          setReglaEdicion(null);
        }}
        onSubmit={handleSubmitForm}
        regla={reglaEdicion}
        saving={saving}
      />

      <PrevisualizarReglaDialog
        open={!!previsualizarRegla}
        onClose={() => setPrevisualizarRegla(null)}
        regla={previsualizarRegla}
      />

      <RecalcularListaDialog
        open={recalcularOpen}
        onClose={() => setRecalcularOpen(false)}
        onDone={invalidar}
      />

      {dialogs}
    </>
  );
}

export default ReglasPrecio;
