"use client";

import { useEffect, useState } from "react";

type Tenant = { id: string; name: string };
type Rule = { id: string; code: string; name: string; rule_type: string; points: number | string; action: string; condition_json: unknown; is_enabled: number | boolean };
type RuleSet = { id: string; name: string; version: string; confidence_threshold: number | string; approved_limit: number | string; review_limit: number | string; rejected_limit: number | string };

const vehicleTypes = [{ value: "light", label: "Leves" }, { value: "motorcycle", label: "Motos" }, { value: "heavy", label: "Pesados" }];
const actionLabels: Record<string, string> = { approve: "Aprovar", approve_with_notes: "Aprovar com ressalvas", human_review: "Análise humana", retriage: "Solicitar retriagem", reject: "Reprovar", alert: "Alerta" };

function slugCode(value: string) {
  return value.toUpperCase().normalize("NFD").replace(/[\u0300-\u036f]/g, "").replace(/[^A-Z0-9]+/g, "_").replace(/^_+|_+$/g, "").slice(0, 100) || "NOVA_REGRA";
}

function keywordsFromCondition(condition: unknown) {
  try {
    const parsed = typeof condition === "string" ? JSON.parse(condition) : condition;
    return Array.isArray((parsed as { values?: unknown[] })?.values) ? (parsed as { values: unknown[] }).values.join(", ") : "";
  } catch { return ""; }
}

function conditionFromKeywords(value: string) {
  return { type: "finding_contains", values: value.split(",").map((item) => item.trim()).filter(Boolean) };
}

export default function RulesPage() {
  const [tenants, setTenants] = useState<Tenant[]>([]);
  const [tenantId, setTenantId] = useState("");
  const [vehicleType, setVehicleType] = useState("light");
  const [ruleSet, setRuleSet] = useState<RuleSet | null>(null);
  const [rules, setRules] = useState<Rule[]>([]);
  const [message, setMessage] = useState("Carregando regras...");
  const [saving, setSaving] = useState(false);

  async function load(nextTenantId = tenantId, nextVehicleType = vehicleType) {
    setMessage("Carregando regras...");
    try {
      const response = await fetch(`/api/rules?tenantId=${encodeURIComponent(nextTenantId)}&vehicleType=${nextVehicleType}`);
      const body = await response.json();
      if (!response.ok) throw new Error(body.error || "Não foi possível carregar as regras.");
      setTenants(body.tenants || []);
      const selected = nextTenantId || body.tenants?.[0]?.id || "";
      if (selected !== nextTenantId) { setTenantId(selected); return; }
      setRuleSet(body.ruleSet);
      setRules((body.rules || []).map((rule: Rule) => ({ ...rule, points: Number(rule.points), is_enabled: Boolean(rule.is_enabled) })));
      const provisioned = (body.provisionedVehicleTypes || []) as string[];
      setMessage(provisioned.length ? `Regras padrão aplicadas automaticamente para: ${provisioned.map((item) => vehicleTypes.find((type) => type.value === item)?.label || item).join(", ")}.` : body.ruleSet ? "" : "Não há conjunto ativo para esta combinação.");
    } catch (error) { setMessage(error instanceof Error ? error.message : "Não foi possível carregar as regras."); }
  }

  useEffect(() => { void load(); }, [tenantId, vehicleType]);

  function updateRule(index: number, patch: Partial<Rule>) { setRules(current => current.map((rule, itemIndex) => itemIndex === index ? { ...rule, ...patch } : rule)); }
  function addRule() {
    const index = rules.length + 1;
    setRules((current) => [...current, { id: `new-${Date.now()}`, code: `REGRA_PERSONALIZADA_${index}`, name: "Nova regra personalizada", rule_type: "scoring", points: 10, action: "alert", condition_json: { type: "finding_contains", values: [] }, is_enabled: true }]);
  }
  function removeRule(index: number) { setRules((current) => current.filter((_, itemIndex) => itemIndex !== index)); }
  async function publish() {
    if (!ruleSet) return;
    setSaving(true); setMessage("");
    try {
      const response = await fetch("/api/rules", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ tenantId, vehicleType, sourceRuleSetId: ruleSet.id, name: ruleSet.name, confidenceThreshold: ruleSet.confidence_threshold, approvedLimit: ruleSet.approved_limit, reviewLimit: ruleSet.review_limit, rejectedLimit: ruleSet.rejected_limit, rules }) });
      const body = await response.json();
      if (!response.ok) throw new Error(body.error || "Não foi possível publicar as regras.");
      setMessage(body.message); await load();
    } catch (error) { setMessage(error instanceof Error ? error.message : "Não foi possível publicar as regras."); } finally { setSaving(false); }
  }

  return <main className="rules-page">
    <header className="rules-header"><a href="/">← Dashboard Capital</a><div><a href="/excecoes">Fila de exceções</a><a href="/admin">Administração</a></div></header>
    <div className="rules-heading"><div><p className="eyebrow">MOTOR DE DECISÃO</p><h1>Regras e decisões</h1><p>Todo cliente começa com o padrão Autovistoria Veicular. Ajustes e regras próprias só passam a valer ao publicar uma nova versão.</p></div><button onClick={publish} disabled={!ruleSet || saving}>{saving ? "Publicando..." : "Publicar nova versão"}</button></div>
    <section className="rules-selectors"><label>Cliente<select value={tenantId} onChange={event => setTenantId(event.target.value)}>{tenants.map(tenant => <option key={tenant.id} value={tenant.id}>{tenant.name}</option>)}</select></label><label>Tipo de veículo<select value={vehicleType} onChange={event => setVehicleType(event.target.value)}>{vehicleTypes.map(type => <option key={type.value} value={type.value}>{type.label}</option>)}</select></label>{ruleSet && <div className="rules-version"><span>Versão atual</span><b>{ruleSet.version}</b></div>}</section>
    {ruleSet && <><section className="rules-limits"><label>Confiança mínima da IA<input type="number" min="0" max="100" value={ruleSet.confidence_threshold} onChange={event => setRuleSet({ ...ruleSet, confidence_threshold: event.target.value })}/><small>Abaixo deste nível, encaminha para conferência.</small></label><label>Aprovar até<input type="number" min="0" value={ruleSet.approved_limit} onChange={event => setRuleSet({ ...ruleSet, approved_limit: event.target.value })}/><small>Pontuação máxima para aprovação direta.</small></label><label>Análise humana a partir de<input type="number" min="0" value={ruleSet.review_limit} onChange={event => setRuleSet({ ...ruleSet, review_limit: event.target.value })}/><small>Exige validação antes da decisão.</small></label><label>Reprovar a partir de<input type="number" min="0" value={ruleSet.rejected_limit} onChange={event => setRuleSet({ ...ruleSet, rejected_limit: event.target.value })}/><small>Exceto regras que bloqueiam imediatamente.</small></label></section>
    <section className="rules-table-card"><div className="rules-card-heading"><div><p className="eyebrow">REGRAS ATIVAS</p><h2>Critérios de risco</h2><small>As regras padrão podem ser ajustadas. Regras próprias usam termos que a IA encontrará nos achados; separe os termos por vírgula.</small></div><button className="secondary-button" onClick={addRule}>+ Adicionar regra</button></div><div className="rules-table-wrap"><table><thead><tr><th>Regra e condição</th><th>Pontos</th><th>Ação</th><th>Status</th><th /></tr></thead><tbody>{rules.map((rule, index) => <tr key={rule.id}><td><input className="rule-name-input" aria-label="Nome da regra" value={rule.name} onChange={event => updateRule(index, { name: event.target.value, code: slugCode(event.target.value) })}/><small><input className="rule-code-input" aria-label="Código da regra" value={rule.code} onChange={event => updateRule(index, { code: slugCode(event.target.value) })}/> · {rule.rule_type}</small><input className="rule-condition-input" aria-label="Termos que ativam a regra" placeholder="Ex.: amassado, para-choque" value={keywordsFromCondition(rule.condition_json)} onChange={event => updateRule(index, { condition_json: conditionFromKeywords(event.target.value) })}/></td><td><input type="number" min="0" value={rule.points} onChange={event => updateRule(index, { points: event.target.value })}/></td><td><select value={rule.action} onChange={event => updateRule(index, { action: event.target.value })}>{Object.entries(actionLabels).map(([value, label]) => <option key={value} value={value}>{label}</option>)}</select></td><td><button type="button" className={rule.is_enabled ? "rule-toggle on" : "rule-toggle"} onClick={() => updateRule(index, { is_enabled: !Boolean(rule.is_enabled) })}>{rule.is_enabled ? "Ativa" : "Desativada"}</button></td><td><button type="button" className="rule-remove" onClick={() => removeRule(index)} disabled={rules.length === 1} aria-label={`Excluir ${rule.name}`}>Excluir</button></td></tr>)}</tbody></table></div></section></>}
    {message && <p className="rules-message" role="status">{message}</p>}
  </main>;
}
