import { Icon } from "@iconify/react";
import {
  Alert,
  Autocomplete,
  Box,
  Button,
  Dialog,
  DialogActions,
  DialogContent,
  DialogTitle,
  MenuItem,
  Stack,
  TextField,
  Typography,
} from "@mui/material";
import { useQuery } from "@tanstack/react-query";
import { useEffect, useMemo, useState } from "react";
import { getPlanCuentas } from "../../../api/contabilidad.service";
import { useReclasificarProveedorMutation } from "../../../tanstack/ProveedoresStack";
import {
  TIPOS_ENTIDAD_PROVEEDOR_LIST,
  getTipoEntidadProveedor,
} from "../../_standards/enums/tiposEntidadProveedor";

/**
 * FASE 3 — Diálogo de reclasificación de tercero.
 * Ver docs/plan-acreedores-proveedores-exterior.md.
 *
 * Cambia tipo_entidad y opcionalmente el override de cuenta contable.
 * Advierte que los saldos y asientos existentes NO migran: la cuenta_pasivo_id
 * ya quedó congelada en cada CxP. Solo documentos nuevos usan la cuenta destino.
 */
export function ProveedorReclasificarDialog({ open, onClose, proveedor }) {
  const tipoActual = proveedor?.tipo_entidad || "PROVEEDOR_LOCAL";
  const [tipoDestino, setTipoDestino] = useState(tipoActual);
  const [cuentaContableId, setCuentaContableId] = useState(
    proveedor?.cuenta_contable_id ?? null,
  );
  const [motivo, setMotivo] = useState("");

  useEffect(() => {
    if (open) {
      setTipoDestino(proveedor?.tipo_entidad || "PROVEEDOR_LOCAL");
      setCuentaContableId(proveedor?.cuenta_contable_id ?? null);
      setMotivo("");
    }
  }, [open, proveedor]);

  const { data: planCuentasData } = useQuery({
    queryKey: ["plan-cuentas-pasivo-hojas"],
    queryFn: () => getPlanCuentas(null, false),
    staleTime: 5 * 60 * 1000,
    enabled: open,
  });
  const cuentasPasivoHojas = useMemo(() => {
    const arr = Array.isArray(planCuentasData?.data)
      ? planCuentasData.data
      : Array.isArray(planCuentasData)
        ? planCuentasData
        : [];
    return arr.filter(
      (c) => c.acepta_movimientos && c.tipo === "PASIVO" && c.naturaleza === "ACREEDORA" && c.active,
    );
  }, [planCuentasData]);

  const mutation = useReclasificarProveedorMutation();
  const tipoInfo = getTipoEntidadProveedor(tipoDestino);
  const cambio = tipoDestino !== tipoActual;
  const destinoAcreedor = tipoDestino === "ACREEDOR_VARIO";

  const handleSubmit = async (e) => {
    e.preventDefault();
    if (!cambio && cuentaContableId === (proveedor?.cuenta_contable_id ?? null)) {
      onClose?.();
      return;
    }
    await mutation.mutateAsync({
      id: proveedor.id,
      tipo_entidad: tipoDestino,
      cuenta_contable_id: cuentaContableId,
      motivo: motivo || undefined,
    });
    onClose?.();
  };

  const selectedCuenta =
    cuentasPasivoHojas.find((c) => c.id === cuentaContableId) || null;

  return (
    <Dialog open={open} onClose={onClose} maxWidth="sm" fullWidth>
      <form onSubmit={handleSubmit}>
        <DialogTitle sx={{ display: "flex", alignItems: "center", gap: 1 }}>
          <Icon icon="mdi:tag-arrow-right-outline" width={22} />
          Reclasificar tercero
        </DialogTitle>
        <DialogContent dividers>
          <Stack spacing={2}>
            <Box>
              <Typography variant="caption" color="text.secondary">
                Tercero
              </Typography>
              <Typography variant="body2" fontWeight={600}>
                {proveedor?.personas?.razon_social || proveedor?.razon_social || "—"}
              </Typography>
              <Typography variant="caption" color="text.secondary">
                Tipo actual: {getTipoEntidadProveedor(tipoActual).label}
              </Typography>
            </Box>

            <TextField
              select
              size="small"
              fullWidth
              label="Nuevo tipo de entidad"
              value={tipoDestino}
              onChange={(e) => setTipoDestino(e.target.value)}
              helperText={tipoInfo.descripcion}
            >
              {TIPOS_ENTIDAD_PROVEEDOR_LIST.map((t) => (
                <MenuItem key={t.value} value={t.value}>
                  <Box sx={{ display: "flex", alignItems: "center", gap: 1 }}>
                    <Icon icon={t.icon} width={16} />
                    <span>{t.label}</span>
                  </Box>
                </MenuItem>
              ))}
            </TextField>

            {destinoAcreedor && (
              <Alert severity="info" icon={<Icon icon="mdi:information-outline" />}>
                Los <b>acreedores varios</b> no pueden usarse en órdenes de compra ni
                embarques. Si el tercero tiene documentos activos en esos flujos, la
                reclasificación será rechazada.
              </Alert>
            )}

            <Autocomplete
              size="small"
              options={cuentasPasivoHojas}
              value={selectedCuenta}
              onChange={(_, v) => setCuentaContableId(v?.id ?? null)}
              getOptionLabel={(o) => (o ? `${o.codigo} — ${o.descripcion}` : "")}
              isOptionEqualToValue={(o, v) => o.id === v?.id}
              renderInput={(params) => (
                <TextField
                  {...params}
                  label="Cuenta contable (override, opcional)"
                  helperText="Vacío = usa el concepto contable por defecto del tipo elegido"
                />
              )}
            />

            <TextField
              size="small"
              fullWidth
              label="Motivo de la reclasificación"
              placeholder="Ej: el contador reclasificó como acreedor por naturaleza del vínculo"
              value={motivo}
              onChange={(e) => setMotivo(e.target.value)}
              multiline
              minRows={2}
              helperText="Queda registrado en la bitácora de auditoría"
            />

            <Alert severity="warning" icon={<Icon icon="mdi:alert-outline" />}>
              Los saldos y asientos existentes <b>no migran</b> a la nueva cuenta.
              La cuenta pasivo quedó congelada en cada cuenta por pagar al momento
              del asiento de compra/gasto. Solo los documentos <b>nuevos</b> usarán
              la cuenta destino.
            </Alert>
          </Stack>
        </DialogContent>
        <DialogActions>
          <Button onClick={onClose} disabled={mutation.isPending}>
            Cancelar
          </Button>
          <Button
            type="submit"
            variant="contained"
            disabled={mutation.isPending}
            startIcon={<Icon icon="mdi:check" />}
          >
            {mutation.isPending ? "Guardando..." : "Reclasificar"}
          </Button>
        </DialogActions>
      </form>
    </Dialog>
  );
}

export default ProveedorReclasificarDialog;
