"use client";

import { useEffect, useState } from "react";
import { X, Save, Loader2, AlertTriangle } from "lucide-react";
import { Input } from "@/components/ui/input";
import { Button } from "@/components/ui/button";
import { InfoTooltip } from "@/components/ui/info-tooltip";
import { custoHoraDeMaquina } from "@/lib/precificacao/custo-por-hora";
import { formatMoneyInput, parseMoneyInput, formatMoney } from "@/utils/formatters";
import { numeroDoTexto, textoDecimalValido, textoDoNumero } from "@/components/ui/campo-decimal";

/**
 * O modal de máquina — o mesmo no cadastro de operações e no assistente de
 * precificação.
 *
 * Existia a versão completa na página de operações (com o "calcular o custo
 * por hora para mim") e uma mínima no assistente, que pedia a hora seca. Quem
 * não sabe a própria hora de máquina chutava um número — justamente na tela
 * cujo trabalho é acertar o preço. Um modal só, os dois lugares.
 */

export type MaquinaParaEditar = {
  id: string;
  name: string;
  hourly_cost: number;
  setup_minutes_default: number;
  acquisition_value?: number | null;
  useful_life_years?: number | null;
  residual_value?: number | null;
  power_kw?: number | null;
  energy_cost_kwh?: number | null;
  maintenance_monthly?: number | null;
  productive_hours_month?: number | null;
  hourly_cost_manual?: boolean | null;
};

/* Campo vazio vira nulo, e nao zero: "nao informei" e diferente de "e zero",
   e so o primeiro deve impedir a conta de rodar. */
function numeroOuNulo(valor: string): number | null {
  const limpo = String(valor ?? "").replace(",", ".").trim();
  if (!limpo) return null;
  const n = Number(limpo);
  return Number.isFinite(n) ? n : null;
}

const FORM_VAZIO = {
  name: "", hourly_cost: "0,00", setup_minutes_default: "0",
  acquisition_value: "", useful_life_years: "", residual_value: "",
  power_kw: "", energy_cost_kwh: "", maintenance_monthly: "", productive_hours_month: "",
  hourly_cost_manual: true,
};

export function ModalDeMaquina({ aberta, maquina, nomeInicial, aoFechar, aoSalvar }: {
  aberta: boolean;
  /** Presente = edição; ausente = máquina nova. */
  maquina?: MaquinaParaEditar | null;
  /** Pré-preenche o nome no cadastro (a busca que não achou vira o nome). */
  nomeInicial?: string;
  aoFechar: () => void;
  /** Recebe a linha que o banco devolveu, já com id. */
  aoSalvar: (salva: MaquinaParaEditar) => void;
}) {
  const [form, setForm] = useState({ ...FORM_VAZIO });
  const [saving, setSaving] = useState(false);
  const [error, setError] = useState("");

  useEffect(() => {
    if (!aberta) return;
    setError("");
    if (maquina) {
      setForm({
        name: maquina.name,
        hourly_cost: formatMoneyInput(maquina.hourly_cost),
        setup_minutes_default: textoDoNumero(maquina.setup_minutes_default ?? 0),
        acquisition_value: maquina.acquisition_value?.toString() ?? "",
        useful_life_years: maquina.useful_life_years?.toString() ?? "",
        residual_value: maquina.residual_value?.toString() ?? "",
        power_kw: maquina.power_kw?.toString() ?? "",
        energy_cost_kwh: maquina.energy_cost_kwh?.toString() ?? "",
        maintenance_monthly: maquina.maintenance_monthly?.toString() ?? "",
        productive_hours_month: maquina.productive_hours_month?.toString() ?? "",
        hourly_cost_manual: maquina.hourly_cost_manual !== false,
      });
    } else {
      setForm({ ...FORM_VAZIO, name: nomeInicial ?? "" });
    }
    // eslint-disable-next-line react-hooks/exhaustive-deps
  }, [aberta]);

  /* O valor descoberto pelo calculo preenche o campo la de cima sozinho:
     descobrir a hora e ter que copiar no braco era pedir erro de digitacao.
     So sincroniza enquanto o calculo automatico esta ligado — desligou, o
     campo volta a ser da pessoa. */
  const previa = custoHoraDeMaquina({
    valorDeCompra: numeroOuNulo(form.acquisition_value),
    vidaUtilAnos: numeroOuNulo(form.useful_life_years),
    valorResidual: numeroOuNulo(form.residual_value),
    potenciaKw: numeroOuNulo(form.power_kw),
    custoKwh: numeroOuNulo(form.energy_cost_kwh),
    manutencaoMensal: numeroOuNulo(form.maintenance_monthly),
    horasProdutivasMes: numeroOuNulo(form.productive_hours_month),
  });
  useEffect(() => {
    if (form.hourly_cost_manual || previa === null) return;
    const formatado = formatMoneyInput(previa);
    if (form.hourly_cost !== formatado) {
      setForm((f) => ({ ...f, hourly_cost: formatado }));
    }
    // eslint-disable-next-line react-hooks/exhaustive-deps
  }, [previa, form.hourly_cost_manual]);

  const salvar = async (e: React.FormEvent) => {
    e.preventDefault();
    setSaving(true);
    try {
      const payload = {
        name: form.name,
        hourly_cost: parseMoneyInput(form.hourly_cost),
        setup_minutes_default: numeroDoTexto(form.setup_minutes_default),
        acquisition_value: numeroOuNulo(form.acquisition_value),
        useful_life_years: numeroOuNulo(form.useful_life_years),
        residual_value: numeroOuNulo(form.residual_value),
        power_kw: numeroOuNulo(form.power_kw),
        energy_cost_kwh: numeroOuNulo(form.energy_cost_kwh),
        maintenance_monthly: numeroOuNulo(form.maintenance_monthly),
        productive_hours_month: numeroOuNulo(form.productive_hours_month),
        hourly_cost_manual: form.hourly_cost_manual,
        type: "machine",
      };
      const res = await fetch("/api/production/operations", {
        method: maquina ? "PUT" : "POST",
        headers: { "Content-Type": "application/json" },
        body: JSON.stringify(maquina ? { ...payload, id: maquina.id } : payload),
      });
      const json = await res.json().catch(() => null);
      if (!res.ok) throw new Error(json?.error || "Erro ao salvar.");
      aoSalvar(json as MaquinaParaEditar);
      aoFechar();
    } catch (err) {
      setError(err instanceof Error ? err.message : "Erro ao salvar.");
    } finally {
      setSaving(false);
    }
  };

  if (!aberta) return null;

  return (
    <div className="fixed inset-0 z-50 flex items-center justify-center bg-black/50 p-4 animate-in fade-in">
      <div className="bg-white rounded-xl shadow-xl w-full max-w-md overflow-hidden animate-in zoom-in-95 duration-200">
        <div className="flex justify-between items-center p-4 border-b bg-slate-50/50">
          <h3 className="font-semibold text-lg text-slate-800">{maquina ? "Editar Máquina" : "Nova Máquina"}</h3>
          <Button size="icon" variant="ghost" onClick={aoFechar}><X className="h-4 w-4" /></Button>
        </div>
        <form onSubmit={salvar} className="p-6 space-y-4 max-h-[80vh] overflow-y-auto">
          <div className="space-y-2">
            <label className="text-sm font-medium text-slate-700">Nome</label>
            <Input required value={form.name} onChange={(e) => setForm({ ...form, name: e.target.value })} placeholder="Ex: Serra Circular" />
          </div>
          <div className="grid grid-cols-2 gap-4">
            <div className="space-y-2">
              <label className="text-sm font-medium text-slate-700 inline-flex items-center">
                Custo/Hora
                <InfoTooltip text="O que uma hora desta máquina custa: depreciação + energia + manutenção, divididos pelas horas que ela roda. Com o cálculo automático ligado, este campo se preenche sozinho." />
              </label>
              <Input value={form.hourly_cost}
                onChange={(e) => setForm({ ...form, hourly_cost: formatMoneyInput(e.target.value) })}
                placeholder="0,00"
                disabled={!form.hourly_cost_manual}
                title={!form.hourly_cost_manual ? "Preenchido pelo cálculo abaixo — desmarque para digitar" : undefined} />
            </div>
            <div className="space-y-2">
              <label className="text-sm font-medium text-slate-700 inline-flex items-center">
                Setup (min)
                <InfoTooltip text="Minutos de preparo antes de rodar: acerto de máquina, aquecimento, teste. Acontece uma vez por pedido e se dilui na tiragem." />
              </label>
              <Input inputMode="decimal" value={form.setup_minutes_default} onChange={(e) => { if (textoDecimalValido(e.target.value)) setForm({ ...form, setup_minutes_default: e.target.value }); }} placeholder="0" />
            </div>
          </div>

          {/* A conta existe porque quase ninguem sabe de cabeca quanto custa
              uma hora da propria maquina. */}
          <div className="rounded-xl border border-[var(--ks-color-border-subtle)] bg-[var(--ks-color-bg-inset)] p-4 space-y-3">
            <label className="flex items-center gap-2 cursor-pointer">
              <input
                type="checkbox"
                checked={!form.hourly_cost_manual}
                onChange={(e) => setForm({ ...form, hourly_cost_manual: !e.target.checked })}
              />
              <span className="text-sm font-semibold text-slate-700">Calcular o custo por hora para mim</span>
            </label>

            {!form.hourly_cost_manual && (
              <>
                <div className="grid grid-cols-2 gap-3">
                  <div className="space-y-1">
                    <label className="text-xs text-slate-500 inline-flex items-center">Valor de compra<InfoTooltip text="Quanto você pagou na máquina. Vira depreciação: o valor se dilui pela vida útil." /></label>
                    <Input inputMode="decimal" value={form.acquisition_value}
                      onChange={(e) => setForm({ ...form, acquisition_value: e.target.value })} placeholder="0" />
                  </div>
                  <div className="space-y-1">
                    <label className="text-xs text-slate-500 inline-flex items-center">Vida útil (anos)<InfoTooltip text="Por quantos anos a máquina deve trabalhar antes de ser trocada." /></label>
                    <Input inputMode="decimal" value={form.useful_life_years}
                      onChange={(e) => setForm({ ...form, useful_life_years: e.target.value })} placeholder="0" />
                  </div>
                  <div className="space-y-1">
                    <label className="text-xs text-slate-500 inline-flex items-center">Valor residual<InfoTooltip text="Quanto a máquina ainda vale no fim da vida útil (revenda ou troca). Pode deixar 0." /></label>
                    <Input inputMode="decimal" value={form.residual_value}
                      onChange={(e) => setForm({ ...form, residual_value: e.target.value })} placeholder="0" />
                  </div>
                  <div className="space-y-1">
                    <label className="text-xs text-slate-500 inline-flex items-center">Manutenção por mês<InfoTooltip text="Média mensal de peças, técnico e limpeza. Se faz uma revisão anual, divida por 12." /></label>
                    <Input inputMode="decimal" value={form.maintenance_monthly}
                      onChange={(e) => setForm({ ...form, maintenance_monthly: e.target.value })} placeholder="0" />
                  </div>
                  <div className="space-y-1">
                    <label className="text-xs text-slate-500 inline-flex items-center">Potência (kW)<InfoTooltip text="O consumo elétrico da máquina, em kW. Costuma estar na etiqueta ou no manual." /></label>
                    <Input inputMode="decimal" value={form.power_kw}
                      onChange={(e) => setForm({ ...form, power_kw: e.target.value })} placeholder="0" />
                  </div>
                  <div className="space-y-1">
                    <label className="text-xs text-slate-500 inline-flex items-center">Preço do kWh<InfoTooltip text="O valor que você paga por kWh na conta de luz." /></label>
                    <Input inputMode="decimal" value={form.energy_cost_kwh}
                      onChange={(e) => setForm({ ...form, energy_cost_kwh: e.target.value })} placeholder="0" />
                  </div>
                </div>
                <div className="space-y-1">
                  <label className="text-xs text-slate-500 inline-flex items-center">
                    Horas que a máquina roda por mês
                    <InfoTooltip text="As horas que ela realmente roda, não as horas que a empresa abre. Usar 220 aqui faz a hora sair pela metade — e o preço nasce sem cobrir a máquina." />
                  </label>
                  <Input inputMode="decimal" value={form.productive_hours_month}
                    onChange={(e) => setForm({ ...form, productive_hours_month: e.target.value })} placeholder="Ex: 80" />
                </div>
                <div className="rounded-lg bg-white px-3 py-2 text-sm">
                  {previa === null ? (
                    <span className="text-slate-500">Informe as horas por mês para ver o custo.</span>
                  ) : (
                    <span className="text-slate-700">
                      Custo por hora: <strong className="text-base">{formatMoney(previa)}</strong>
                      <span className="text-xs text-slate-400"> — já preenchido lá em cima</span>
                    </span>
                  )}
                </div>
              </>
            )}
          </div>
          {error && (
            <div className="text-sm text-red-600 bg-red-50 p-3 rounded-md flex items-center gap-2">
              <AlertTriangle className="h-4 w-4" />
              {error}
            </div>
          )}
          <div className="flex justify-end gap-3 pt-4 border-t mt-6">
            <Button type="button" variant="ghost" onClick={aoFechar}>Cancelar</Button>
            <Button type="submit" disabled={saving}>
              {saving ? <Loader2 className="h-4 w-4 animate-spin mr-2" /> : <Save className="h-4 w-4 mr-2" />}
              Salvar
            </Button>
          </div>
        </form>
      </div>
    </div>
  );
}
