import { useMemo, useState } from "react";
import {
  Alert,
  Button,
  Dialog,
  DialogActions,
  DialogContent,
  DialogTitle,
  MenuItem,
  Stack,
  TextField,
} from "@mui/material";
import { toast } from "sonner";
import { useQuery } from "@tanstack/react-query";
import {
  COB_MORA_ESTADO,
  COB_MORA_ESTADO_META,
} from "../../_standards/enums/estados";
import { transicionarGestionMora } from "../../../api/cobranzas.service";
import { getUsuarios } from "../../../api/usuarios.service";
import { useAuthStore } from "../../../store/AuthStore";

const TRANSICIONES = {
  AL_DIA: ["GESTION_INTERNA", "REFINANCIADA"],
  GESTION_INTERNA: [
    "INFORMCONF",
    "DEMANDA",
    "RECUPERADA",
    "REFINANCIADA",
    "AL_DIA",
  ],
  INFORMCONF: ["DEMANDA", "RECUPERADA", "REFINANCIADA"],
  DEMANDA: ["INCOBRABLE", "RECUPERADA", "REFINANCIADA"],
  INCOBRABLE: ["RECUPERADA"],
  RECUPERADA: ["AL_DIA", "GESTION_INTERNA"],
  REFINANCIADA: ["AL_DIA", "GESTION_INTERNA"],
};

const REQUIERE_DOC = ["DEMANDA", "INCOBRABLE"];
const REQUIERE_AUTORIZ = ["DEMANDA", "INCOBRABLE"];

export function TransicionEstadoModal({ open, onClose, gestion, onSuccess }) {
  const [estadoNuevo, setEstadoNuevo] = useState("");
  const [motivo, setMotivo] = useState("");
  const [documentoUrl, setDocumentoUrl] = useState("");
  const [autorizadoPorId, setAutorizadoPorId] = useState("");
  const [loading, setLoading] = useState(false);

  const opciones = useMemo(
    () => TRANSICIONES[gestion?.estado_actual] ?? [],
    [gestion],
  );

  const requiereDoc = REQUIERE_DOC.includes(estadoNuevo);
  const requiereAutoriz = REQUIERE_AUTORIZ.includes(estadoNuevo);

  // El autorizador se elige de los usuarios de la empresa (el endpoint ya
  // limita al tenant); se excluye al usuario actual porque es doble autorización.
  const { user } = useAuthStore();
  const {
    data: usuariosData,
    isLoading: loadingUsuarios,
    isError: errorUsuarios,
  } = useQuery({
    queryKey: ["usuarios-empresa", user?.empresa_id],
    queryFn: () => getUsuarios(1, 200, user?.empresa_id),
    enabled: open && requiereAutoriz,
  });
  const usuariosAutorizadores = useMemo(() => {
    const lista = usuariosData?.data || usuariosData || [];
    return (Array.isArray(lista) ? lista : []).filter(
      (u) => u.active !== false && u.id !== user?.id,
    );
  }, [usuariosData, user?.id]);

  const handleSubmit = async () => {
    if (!estadoNuevo) return toast.error("Seleccioná un estado destino");
    if (!motivo.trim()) return toast.error("Indicá el motivo de la transición");
    if (requiereDoc && !documentoUrl.trim())
      return toast.error("Este estado requiere documento (URL)");
    if (requiereAutoriz && !autorizadoPorId.trim())
      return toast.error("Este estado requiere autorización de otro usuario");

    setLoading(true);
    try {
      await transicionarGestionMora(gestion.id, {
        estado_nuevo: estadoNuevo,
        motivo: motivo.trim(),
        documento_url: documentoUrl.trim() || undefined,
        autorizado_por_id: autorizadoPorId.trim() || undefined,
      });
      toast.success("Estado actualizado");
      onSuccess?.();
      onClose();
    } catch (e) {
      toast.error(e?.response?.data?.message || "No se pudo actualizar el estado");
    } finally {
      setLoading(false);
    }
  };

  return (
    <Dialog open={open} onClose={onClose} maxWidth="sm" fullWidth>
      <DialogTitle>
        Transicionar estado · {COB_MORA_ESTADO_META[gestion?.estado_actual]?.label ?? "—"}
      </DialogTitle>
      <DialogContent dividers>
        <Stack spacing={2} sx={{ pt: 1 }}>
          <TextField
            select
            label="Estado destino"
            value={estadoNuevo}
            onChange={(e) => setEstadoNuevo(e.target.value)}
            fullWidth
            size="small"
          >
            {opciones.map((est) => (
              <MenuItem key={est} value={est}>
                {COB_MORA_ESTADO_META[est]?.label ?? est}
              </MenuItem>
            ))}
          </TextField>

          <TextField
            label="Motivo"
            value={motivo}
            onChange={(e) => setMotivo(e.target.value)}
            multiline
            minRows={2}
            fullWidth
            size="small"
          />

          {requiereDoc && (
            <TextField
              label="URL documento (obligatorio)"
              value={documentoUrl}
              onChange={(e) => setDocumentoUrl(e.target.value)}
              placeholder="https://..."
              fullWidth
              size="small"
              helperText="Adjuntá carátula/acta como evidencia"
            />
          )}

          {requiereAutoriz && errorUsuarios && (
            <Alert severity="error">
              No se pudo cargar la lista de usuarios para elegir el autorizador. Si no
              tenés permiso para ver usuarios, pedile a un administrador que haga esta
              transición.
            </Alert>
          )}

          {requiereAutoriz && !errorUsuarios && (
            <TextField
              select
              label="Usuario autorizador (obligatorio)"
              value={autorizadoPorId}
              onChange={(e) => setAutorizadoPorId(e.target.value)}
              fullWidth
              size="small"
              disabled={loadingUsuarios}
              helperText={
                loadingUsuarios ? "Cargando usuarios..." : "Doble autorización requerida"
              }
            >
              {usuariosAutorizadores.length === 0 && (
                <MenuItem value="" disabled>
                  No hay otros usuarios disponibles
                </MenuItem>
              )}
              {usuariosAutorizadores.map((u) => (
                <MenuItem key={u.id} value={u.id}>
                  {`${u.nombres ?? ""} ${u.apellidos ?? ""}`.trim() ||
                    u.username ||
                    u.email ||
                    "Sin nombre"}
                </MenuItem>
              ))}
            </TextField>
          )}

          {(requiereDoc || requiereAutoriz) && (
            <Alert severity="warning">
              Los estados Demanda e Incobrable requieren documento y doble autorización.
            </Alert>
          )}
        </Stack>
      </DialogContent>
      <DialogActions>
        <Button onClick={onClose} disabled={loading}>
          Cancelar
        </Button>
        <Button onClick={handleSubmit} variant="contained" disabled={loading}>
          {loading ? "Guardando..." : "Confirmar transición"}
        </Button>
      </DialogActions>
    </Dialog>
  );
}
