/* Pólix — Importador de pólizas desde Excel (pegar o archivo) */
const PAGA_MAP = { CAJA: "Caja", TARJETA: "Tarjeta", DEBITO: "Débito", "DÉBITO": "Débito", CONTADO: "Contado" };
const TIER_NAME = { TOTAL: "TOTAL", GLOBAL: "GLOBAL", TRIPLE: "TRIPLE", SOA: "SOA" };

function norm(s) { return ("" + (s ?? "")).trim().toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, ""); }
function parseNum(s) {
  if (s == null) return 0;
  let t = ("" + s).replace(/[^0-9.,-]/g, "").replace(/\./g, "").replace(",", ".");
  const n = parseFloat(t);
  return isNaN(n) ? 0 : Math.round(n);
}
function parseFecha(s) {
  if (!s) return "";
  const m = ("" + s).trim().match(/(\d{1,2})[/\-.](\d{1,2})[/\-.](\d{2,4})/);
  if (!m) return "";
  let [, d, mo, y] = m;
  if (y.length === 2) y = "20" + y;
  return `${y}-${String(mo).padStart(2, "0")}-${String(d).padStart(2, "0")}`;
}

function parsePaste(text) {
  const lines = text.replace(/\r/g, "").split("\n").filter((l) => l.trim().length);
  if (!lines.length) return [];
  const delim = lines[0].includes("\t") ? "\t" : (lines[0].split(";").length > lines[0].split(",").length ? ";" : ",");
  let rows = lines.map((l) => l.split(delim).map((c) => c.trim()));
  // descartar fila de encabezado si la hay
  if (rows[0] && norm(rows[0].join(" ")).includes("cliente") && norm(rows[0].join(" ")).includes("seguro")) rows = rows.slice(1);
  return rows;
}

function Importar() {
  const { data, addImportadas, go } = useApp();
  const cols = window.POLIX_DATA.importCols;
  const [text, setText] = React.useState("");
  const [rows, setRows] = React.useState(null); // filas crudas (array de arrays)
  const [include, setInclude] = React.useState({}); // idx -> bool
  const [fixCia, setFixCia] = React.useState({}); // idx -> companiaId
  const fileRef = React.useRef(null);

  const ciaById = (q) => {
    const n = norm(q);
    return data.companias.find((c) => norm(c.corto) === n || norm(c.nombre).includes(n) || n.includes(norm(c.corto)));
  };

  // construir filas analizadas
  const parsed = React.useMemo(() => {
    if (!rows) return [];
    return rows.map((r, i) => {
      const get = (k) => { const idx = cols.findIndex((c) => c.key === k); return (r[idx] || "").trim(); };
      const cliente = get("cliente");
      const seguro = get("seguro").toUpperCase();
      const ciaRaw = get("cia");
      const tipo = get("tipo").toUpperCase();
      const tipoBienRaw = norm(get("tipoBien"));
      const tipoBien = tipoBienRaw.includes("moto") ? "Motocicleta" : tipoBienRaw.includes("camion") || tipoBienRaw.includes("util") ? "Camioneta / Utilitario" : "Automóvil";
      const bien = get("bien");
      const desde = parseFecha(get("desde"));
      const hasta = parseFecha(get("hasta"));
      const prima = parseNum(get("prima"));
      const precio = parseNum(get("precio"));
      const cuotas = parseInt(get("cuotas")) || 1;
      const paga = PAGA_MAP[get("paga").toUpperCase()] || get("paga") || "Caja";
      const anulada = tipo === "AN" || (!hasta && !!desde && desde < window.POLIX_DATA.HOY);
      const co = fixCia[i] ? data.companias.find((c) => c.id === fixCia[i]) : ciaById(ciaRaw);

      const errors = [];
      if (!cliente) errors.push("Falta cliente");
      if (!co) errors.push(`Compañía “${ciaRaw}” no reconocida`);
      if (!bien) errors.push("Falta bien");
      if (!desde) errors.push("Fecha inválida");
      const warnings = [];
      if (anulada) warnings.push("Anulada");
      else if (!hasta) warnings.push("Sin fecha de fin");
      if (!precio && !anulada) warnings.push("Sin precio");

      return { i, cliente, seguro, ciaRaw, co, tipo, tipoBien, bien, desde, hasta, prima, precio, cuotas, paga, anulada, errors, warnings };
    });
  }, [rows, fixCia]);

  const okRows = parsed.filter((p) => p.errors.length === 0);
  const errRows = parsed.filter((p) => p.errors.length > 0);
  const anulRows = parsed.filter((p) => p.anulada && !p.errors.length);
  const isIn = (i) => include[i] !== false;
  const seleccionadas = okRows.filter((p) => isIn(p.i));

  function analizar(t) {
    const r = parsePaste(t);
    setRows(r); setInclude({}); setFixCia({});
  }
  function onFile(e) {
    const file = e.target.files[0]; if (!file) return;
    const reader = new FileReader();
    if (/\.(xlsx|xls)$/i.test(file.name) && window.XLSX) {
      reader.onload = (ev) => {
        const wb = window.XLSX.read(new Uint8Array(ev.target.result), { type: "array" });
        const ws = wb.Sheets[wb.SheetNames[0]];
        const aoa = window.XLSX.utils.sheet_to_json(ws, { header: 1, raw: false, defval: "" });
        let rr = aoa.filter((row) => row.some((c) => ("" + c).trim()));
        if (rr[0] && norm(rr[0].join(" ")).includes("cliente")) rr = rr.slice(1);
        setRows(rr.map((row) => row.map((c) => ("" + c).trim()))); setInclude({}); setFixCia({});
      };
      reader.readAsArrayBuffer(file);
    } else {
      reader.onload = (ev) => { setText(ev.target.result); analizar(ev.target.result); };
      reader.readAsText(file);
    }
  }

  function descargarTemplate() {
    const ejemplo = [
      ["Bazan Claudia", "TOTAL", "SANCOR", "G", "AUTOMOVIL", "Suzuki Maruti 800 2018", "23/1/2026", "23/1/2027", "24212", "37427", "10", "CAJA"],
      ["Duarte Mathew", "SOA", "SURA", "S", "MOTOCICLETA", "Baccio 2023", "5/1/2026", "5/1/2027", "1380", "1970", "1", "CAJA"],
    ];
    downloadCSV("plantilla-polix.csv", cols.map((c) => c.label), ejemplo);
  }
  const SAMPLE = `Gomez Cecilia\tGLOBAL\tSURCO\tG\tAUTOMOVIL\tFiat Mobi Like 0km\t14/1/2026\t14/1/2027\t27.000\t27.647\t10\tCAJA
Castro Karina\tTRIPLE\tSURA\tT\tAUTOMOVIL\tMitsubishi Lancer 1996\t25/1/2026\t25/1/2027\t22.368\t22.537\t10\tTARJETA
Ledesma Wilson\tSOA\tSURA\tAN\tMOTOCICLETA\tBaccio\t16/1/2025\t\t\t\t1\tCAJA
Garcia Nicolas\tGLOBAL\tACME\tG\tAUTOMOVIL\tChevrolet Onix 2019\t17/1/2026\t17/1/2027\t23.693\t36.234\t9\tCAJA`;

  function importar() {
    const nuevasPol = [], nuevosCli = [];
    const mapCli = {}; // nombre normalizado -> id
    data.clientes.forEach((c) => { mapCli[norm(nombreCompleto(c))] = c.id; });
    let seq = 9000;
    seleccionadas.forEach((p) => {
      // cliente: reusar o crear
      let cid = mapCli[norm(p.cliente)];
      if (!cid) {
        const parts = p.cliente.split(/\s+/);
        const empresa = /s\.?a\.?|s\.?r\.?l\.?|ltda|aguatec|inc/i.test(p.cliente);
        cid = "ci" + (seq++);
        const cli = empresa
          ? { id: cid, nombre: p.cliente, apellido: "", cedula: "—", telefono: "", email: "", direccion: "", departamento: "Montevideo", desde: window.POLIX_DATA.HOY, empresa: true }
          : { id: cid, nombre: parts.slice(1).join(" ") || parts[0], apellido: parts[0], cedula: "—", telefono: "", email: "", direccion: "", departamento: "Montevideo", desde: window.POLIX_DATA.HOY };
        nuevosCli.push(cli); mapCli[norm(p.cliente)] = cid;
      }
      const tipoBienPref = p.tipoBien === "Motocicleta" ? "MOT" : "VEH";
      nuevasPol.push({
        id: "ip" + (seq++), numero: `${tipoBienPref}-${(p.desde || "2026").slice(0, 4)}-0${seq}`, ramo: "vehiculos",
        clienteId: cid, companiaId: p.co.id, cobertura: p.seguro, tier: p.tipo,
        inicio: p.desde, fin: p.hasta || addMonths(p.desde, 12), metodoPago: p.paga, cuotas: p.cuotas,
        premio: p.prima, iva: Math.max(0, p.precio - p.prima), total: p.precio, renovada: false, anulada: p.anulada,
        vehiculo: { tipoBien: p.tipoBien, descripcion: p.bien.replace(/\s*\d{4}\s*$/, "").trim(), anio: (p.bien.match(/(\d{4})\s*$/) || [])[1] || "", matricula: "", chasis: "", padron: "", motor: "", deducible: 0, tipoCobertura: p.seguro },
      });
    });
    addImportadas(nuevosCli, nuevasPol);
    go("polizas", {});
  }

  return (
    <div className="view-in">
      {!rows && (
        <div className="grid" style={{ gridTemplateColumns: "minmax(0,1.4fr) minmax(0,1fr)", alignItems: "start" }}>
          <div className="card card-pad">
            <h3 style={{ fontSize: 16, marginBottom: 4 }}>Importá tu cartera en segundos</h3>
            <p className="muted" style={{ marginTop: 0, fontSize: 13.5 }}>Pegá las filas directo desde tu Excel (Ctrl+V) o subí el archivo. Reconocemos las columnas automáticamente y te mostramos una vista previa para revisar antes de importar.</p>
            <textarea className="input" rows={9} value={text} onChange={(e) => setText(e.target.value)}
              placeholder="Pegá acá desde Excel…  (Cliente ⇥ Seguro ⇥ CIA ⇥ Tipo ⇥ Tipo de bien ⇥ Marca ⇥ Desde ⇥ Hasta ⇥ Prima ⇥ Precio ⇥ Cuotas ⇥ Paga por)"
              style={{ fontFamily: "var(--font-mono)", fontSize: 12.5, lineHeight: 1.7, resize: "vertical" }} />
            <div className="row wrap" style={{ gap: 10, marginTop: 14 }}>
              <button className="btn btn-primary" disabled={!text.trim()} style={!text.trim() ? { opacity: .5, pointerEvents: "none" } : null} onClick={() => analizar(text)}><Icon name="eye" size={16} />Analizar y previsualizar</button>
              <button className="btn btn-ghost" onClick={() => fileRef.current.click()}><Icon name="download" size={16} />Subir archivo (.xlsx / .csv)</button>
              <input ref={fileRef} type="file" accept=".xlsx,.xls,.csv" hidden onChange={onFile} />
              <button className="btn btn-soft btn-sm" onClick={() => { setText(SAMPLE); }}>Probar con datos de ejemplo</button>
            </div>
          </div>

          <div className="card card-pad">
            <div className="fieldset-title" style={{ marginBottom: 12 }}>Columnas esperadas</div>
            <div className="grid" style={{ gap: 7 }}>
              {cols.map((c, i) => (
                <div key={c.key} className="row" style={{ gap: 9, fontSize: 13 }}>
                  <span className="num muted" style={{ width: 18, textAlign: "right" }}>{i + 1}</span>
                  <span style={{ fontWeight: 700 }}>{c.label}</span>
                  {c.req ? <span className="pill pill-info" style={{ marginLeft: "auto", padding: "1px 7px", fontSize: 10 }}>requerido</span> : <span className="muted" style={{ marginLeft: "auto", fontSize: 11 }}>opcional</span>}
                </div>
              ))}
            </div>
            <button className="btn btn-ghost btn-sm" style={{ width: "100%", marginTop: 16 }} onClick={descargarTemplate}><Icon name="download" size={15} />Descargar plantilla CSV</button>
            <p className="hint" style={{ marginTop: 12 }}>El orden es el mismo de tu planilla. Las filas con <b>TIPO = AN</b> o sin fecha de fin se marcan como anuladas.</p>
          </div>
        </div>
      )}

      {rows && (
        <>
          <div className="between wrap" style={{ marginBottom: 16, gap: 12 }}>
            <div className="row wrap" style={{ gap: 8 }}>
              <Pill kind="ok" dot={false}>{seleccionadas.length} listas para importar</Pill>
              {anulRows.length > 0 && <Pill kind="neutral" dot={false}>{anulRows.length} anuladas</Pill>}
              {errRows.length > 0 && <Pill kind="danger" dot={false}>{errRows.length} con errores</Pill>}
            </div>
            <div className="row" style={{ gap: 8 }}>
              <button className="btn btn-ghost" onClick={() => { setRows(null); }}><Icon name="chevronLeft" size={15} />Volver</button>
              <button className="btn btn-primary" disabled={!seleccionadas.length} style={!seleccionadas.length ? { opacity: .5, pointerEvents: "none" } : null} onClick={importar}><Icon name="download" size={16} />Importar {seleccionadas.length} pólizas</button>
            </div>
          </div>

          <div className="card" style={{ overflow: "hidden" }}>
            <div className="table-wrap">
              <table className="tbl">
                <thead><tr><th style={{ width: 34 }}></th><th>Estado</th><th>Cliente</th><th>Seguro</th><th>Compañía</th><th>Bien</th><th>Vigencia</th><th>Prima</th><th>Precio</th><th>Cuotas</th><th>Paga</th></tr></thead>
                <tbody>
                  {parsed.map((p) => {
                    const bad = p.errors.length > 0;
                    return (
                      <tr key={p.i} style={{ background: bad ? "var(--danger-bg)" : p.anulada ? "var(--neutral-bg)" : "transparent", cursor: "default", opacity: !bad && !isIn(p.i) ? .45 : 1 }}>
                        <td onClick={(e) => e.stopPropagation()}>
                          {!bad && <input type="checkbox" checked={isIn(p.i)} onChange={() => setInclude({ ...include, [p.i]: !isIn(p.i) })} />}
                          {bad && <Icon name="xCircle" size={16} style={{ color: "var(--danger)" }} />}
                        </td>
                        <td>
                          {bad ? <span className="cell-sub" style={{ color: "var(--danger)" }}>{p.errors[0]}</span>
                            : p.anulada ? <Pill kind="neutral" dot={false}>Anulada</Pill>
                              : <Pill kind="ok" dot={false}>OK</Pill>}
                        </td>
                        <td className="cell-main">{p.cliente || <span className="muted">—</span>}</td>
                        <td><span style={{ fontWeight: 700 }}>{p.seguro}</span></td>
                        <td>
                          {p.co ? <CoChip co={p.co} /> : (
                            <select className="select" style={{ width: 130, padding: "5px 24px 5px 8px", fontSize: 12, borderColor: "var(--danger-line)" }}
                              value={fixCia[p.i] || ""} onChange={(e) => setFixCia({ ...fixCia, [p.i]: e.target.value })}>
                              <option value="">{p.ciaRaw} ?</option>
                              {data.companias.map((c) => <option key={c.id} value={c.id}>{c.corto}</option>)}
                            </select>
                          )}
                        </td>
                        <td><div className="cell-main" style={{ fontSize: 13 }}>{p.bien}</div><div className="cell-sub">{p.tipoBien}</div></td>
                        <td className="num cell-sub">{p.desde ? fmtDate(p.desde) : "—"}{p.hasta ? " → " + fmtDate(p.hasta) : ""}</td>
                        <td className="num">{p.prima ? fmtMoney(p.prima) : "—"}</td>
                        <td className="num cell-main">{p.precio ? fmtMoney(p.precio) : "—"}</td>
                        <td className="num">{p.cuotas}</td>
                        <td>{p.paga}</td>
                      </tr>
                    );
                  })}
                </tbody>
              </table>
            </div>
          </div>
          {errRows.length > 0 && <p className="hint" style={{ marginTop: 12 }}>Las filas en rojo tienen errores y no se importarán. Corregí la compañía con el selector, o destildá las que quieras saltear.</p>}
        </>
      )}
    </div>
  );
}
window.Importar = Importar;
