"use client";

import { usePreciosStore } from "@/lib/calculadora/store";
import type { Coeficientes, IaConfig } from "@/lib/calculadora/engine";

interface Props {
  canEdit: boolean;
}

function NumRow({
  label, hint, value, onChange, disabled, step = "0.01",
}: {
  label: string; hint?: string; value: number;
  onChange: (v: number) => void; disabled: boolean; step?: string;
}) {
  return (
    <div className="flex items-center gap-3 py-2 border-b border-line last:border-0">
      <div className="flex-1 min-w-0">
        <span className="text-sm text-ink">{label}</span>
        {hint && <p className="text-xs text-faint mt-0.5">{hint}</p>}
      </div>
      <input
        type="number"
        value={value}
        step={step}
        disabled={disabled}
        onChange={e => onChange(parseFloat(e.target.value) || 0)}
        className="w-28 bg-white/5 border border-line rounded px-2 py-1 text-sm text-right text-ink outline-none
          focus:border-brand disabled:opacity-40 disabled:cursor-not-allowed"
      />
    </div>
  );
}

function SectionCard({ title, children }: { title: string; children: React.ReactNode }) {
  return (
    <div className="bg-surface border border-line rounded-xl p-4">
      <h3 className="text-sm font-semibold text-ink mb-1">{title}</h3>
      {children}
    </div>
  );
}

export default function LogicaTab({ canEdit }: Props) {
  const { data, saveData, saveToDB, syncStatus } = usePreciosStore();
  const c = data.coefs;
  const ia = data.iaConfig;

  function patchCoef(patch: Partial<Coeficientes>) {
    saveData({ ...data, coefs: { ...c, ...patch } });
  }

  function patchCoefs(patch: Partial<Coeficientes["COEFS"]>) {
    saveData({ ...data, coefs: { ...c, COEFS: { ...c.COEFS, ...patch } } });
  }

  function patchMueble(patch: Partial<Coeficientes["COEFS"]["#Mueble"]>) {
    patchCoefs({ "#Mueble": { ...c.COEFS["#Mueble"], ...patch } });
  }

  function patchIa(patch: Partial<IaConfig>) {
    saveData({ ...data, iaConfig: { ...ia, ...patch } });
  }

  const dbLabel = { ok: "Guardado ✓", syncing: "Guardando...", error: "Error ✗" }[syncStatus] ?? "Guardar en DB";

  return (
    <div className="flex flex-col gap-4 pb-8">

      {!canEdit && (
        <div className="bg-bad/10 border border-bad/30 rounded-lg px-4 py-2 text-sm text-bad">
          Solo el administrador puede editar los coeficientes de cálculo.
        </div>
      )}

      {/* Save button */}
      <div className="flex justify-end">
        <button
          onClick={() => saveToDB()}
          disabled={syncStatus === "syncing" || !canEdit}
          className="px-4 py-1.5 text-sm rounded-lg bg-brand text-white font-medium
            hover:bg-brand/90 disabled:opacity-50 disabled:cursor-not-allowed transition-colors"
        >
          {dbLabel}
        </button>
      </div>

      {/* ── Coeficiente general ─────────────────────────────────────────── */}
      <SectionCard title="Coeficiente general">
        <NumRow
          label="COEF_GENERAL"
          hint="Multiplicador global aplicado al precio de todas las líneas (excepto #Adicional)."
          value={c.COEF_GENERAL}
          onChange={v => patchCoef({ COEF_GENERAL: v })}
          disabled={!canEdit}
        />
      </SectionCard>

      {/* ── Coeficientes por tag (#Mueble) ──────────────────────────────── */}
      <SectionCard title="Coeficientes por material — #Mueble / #Corte / #Sobrante">
        <NumRow
          label="#Mueble — MDF"
          hint="Coef aplicado sobre costo de material para tableros MDF sin sufijo."
          value={c.COEFS["#Mueble"].mdf}
          onChange={v => patchMueble({ mdf: v })}
          disabled={!canEdit}
        />
        <NumRow
          label="#Mueble — Blanco"
          hint="Coef para melamina blanca (código termina en 'b')."
          value={c.COEFS["#Mueble"].blanco}
          onChange={v => patchMueble({ blanco: v })}
          disabled={!canEdit}
        />
        <NumRow
          label="#Mueble — Color"
          hint="Coef para melamina color (código termina en 'c')."
          value={c.COEFS["#Mueble"].color}
          onChange={v => patchMueble({ color: v })}
          disabled={!canEdit}
        />
        <NumRow
          label="#Corte"
          hint="Coef para cortes a medida simples."
          value={c.COEFS["#Corte"]}
          onChange={v => patchCoefs({ "#Corte": v })}
          disabled={!canEdit}
        />
        <NumRow
          label="#Pino"
          hint="Coef para piezas de pino."
          value={c.COEFS["#Pino"]}
          onChange={v => patchCoefs({ "#Pino": v })}
          disabled={!canEdit}
        />
        <NumRow
          label="#Sobrante"
          hint="Coef para sobrantes (generalmente 1.0 = sin markup)."
          value={c.COEFS["#Sobrante"]}
          onChange={v => patchCoefs({ "#Sobrante": v })}
          disabled={!canEdit}
        />
      </SectionCard>

      {/* ── Corte / Trozado ─────────────────────────────────────────────── */}
      <SectionCard title="Corte y trozado">
        <NumRow
          label="COEF_TROZADO"
          hint="Costo de trozado por cm de perímetro (usado en STD_FAMILY)."
          value={c.COEF_TROZADO}
          onChange={v => patchCoef({ COEF_TROZADO: v })}
          disabled={!canEdit}
          step="0.001"
        />
        <NumRow
          label="COEF_CORTE_LINEAL"
          hint="Factor adicional por cm de corte lineal ponderado por espesor."
          value={c.COEF_CORTE_LINEAL}
          onChange={v => patchCoef({ COEF_CORTE_LINEAL: v })}
          disabled={!canEdit}
          step="0.001"
        />
        <NumRow
          label="COEF_CALADO"
          hint="Costo de calado/círculo por cm × espesor."
          value={c.COEF_CALADO}
          onChange={v => patchCoef({ COEF_CALADO: v })}
          disabled={!canEdit}
          step="0.001"
        />
      </SectionCard>

      {/* ── Tapacanto y Pintura ─────────────────────────────────────────── */}
      <SectionCard title="Tapacanto y pintura">
        <NumRow
          label="VALOR_TAPACANTO base ($/ml)"
          hint="Precio de referencia del tapacanto por ml (se multiplica por canto [x/y] de cada línea)."
          value={c.VALOR_TAPACANTO}
          onChange={v => patchCoef({ VALOR_TAPACANTO: v })}
          disabled={!canEdit}
          step="1"
        />
        <NumRow
          label="VALOR_PINTURA ($/m² por cara)"
          hint="Costo de pintura en tablero por metro cuadrado por cara aplicada."
          value={c.VALOR_PINTURA}
          onChange={v => patchCoef({ VALOR_PINTURA: v })}
          disabled={!canEdit}
          step="500"
        />
      </SectionCard>

      {/* ── Cajón ───────────────────────────────────────────────────────── */}
      <SectionCard title="Cajón — mano de obra">
        <NumRow
          label="MO_CAJON_FIJO ($/cajón)"
          hint="Costo fijo de armado por cajón."
          value={c.MO_CAJON_FIJO}
          onChange={v => patchCoef({ MO_CAJON_FIJO: v })}
          disabled={!canEdit}
          step="100"
        />
        <NumRow
          label="MO_CAJON_VOL ($/m³)"
          hint="Costo de armado proporcional al volumen del cajón (A×B×C en m³)."
          value={c.MO_CAJON_VOL}
          onChange={v => patchCoef({ MO_CAJON_VOL: v })}
          disabled={!canEdit}
          step="1000"
        />
      </SectionCard>

      {/* ── Placas emplacadas ──────────────────────────────────────────── */}
      <SectionCard title="Placas emplacadas">
        <NumRow
          label="PLACAS_FIJO ($/unidad)"
          hint="Costo fijo de emplacado por pieza."
          value={c.PLACAS_FIJO}
          onChange={v => patchCoef({ PLACAS_FIJO: v })}
          disabled={!canEdit}
          step="100"
        />
        <NumRow
          label="PLACAS_VOL ($/m³)"
          hint="Costo proporcional al volumen de la pieza emplacada."
          value={c.PLACAS_VOL}
          onChange={v => patchCoef({ PLACAS_VOL: v })}
          disabled={!canEdit}
          step="1000"
        />
      </SectionCard>

      {/* ── Prompt para agentes IA ───────────────────────────────────────── */}
      <SectionCard title="Prompt para agentes IA">
        <p className="text-xs text-faint mb-3">
          Instrucciones que enseñan al agente cómo funciona el sistema de cálculo y cómo armar
          listas de corte en formato Odoo. Por ahora se guarda editable; todavía no está conectado
          a ningún agente.
        </p>

        <label className="flex flex-col gap-1.5 mb-4">
          <span className="text-sm text-ink">Instrucciones del sistema (system prompt)</span>
          <textarea
            value={ia.systemPrompt}
            disabled={!canEdit}
            onChange={e => patchIa({ systemPrompt: e.target.value })}
            rows={16}
            className="bg-white/5 border border-line rounded-lg px-3 py-2 text-xs font-mono text-ink outline-none
              focus:border-brand disabled:opacity-40 disabled:cursor-not-allowed resize-y leading-relaxed"
          />
        </label>

        <label className="flex flex-col gap-1.5">
          <span className="text-sm text-ink">Base de conocimiento (URL de Google Doc publicado como texto)</span>
          <input
            type="url"
            value={ia.knowledgeUrl}
            disabled={!canEdit}
            onChange={e => patchIa({ knowledgeUrl: e.target.value })}
            placeholder="https://docs.google.com/document/d/e/.../pub"
            className="bg-white/5 border border-line rounded-lg px-3 py-2 text-xs text-ink outline-none
              focus:border-brand disabled:opacity-40 disabled:cursor-not-allowed"
          />
          <span className="text-xs text-faint">
            Documento de Google publicado como texto plano (Archivo → Compartir → Publicar en la web).
          </span>
        </label>
      </SectionCard>
    </div>
  );
}
