/* Pólix — Formulario de nueva póliza (dropdown dependiente compañía → cobertura) */
function NuevaPolizaForm() {
  const { data, route, go, addPoliza, updatePoliza } = useApp();
  const { companias, clientes, ramos } = data;
  const editP = route.params.editId ? data.polizas.find((p) => p.id === route.params.editId) : null;
  const HOY = window.POLIX_DATA.HOY;

  const [f, setF] = React.useState(() => editP ? {
    clienteId: editP.clienteId, ramo: editP.ramo, companiaId: editP.companiaId, cobertura: editP.cobertura,
    inicio: editP.inicio, fin: (editP.fin && editP.fin.startsWith("9999")) ? "" : editP.fin,
    sinVencimiento: !!(editP.fin && editP.fin.startsWith("9999")),
    metodoPago: editP.metodoPago, cuotas: editP.cuotas, premio: editP.premio,
    tipoBien: editP.vehiculo ? (editP.vehiculo.tipoBien || "Automóvil") : "Automóvil",
    marca: editP.vehiculo ? (editP.vehiculo.marca || editP.vehiculo.descripcion || "") : "",
    modelo: editP.vehiculo ? (editP.vehiculo.modelo || "") : "",
    anio: editP.vehiculo ? (editP.vehiculo.anio || "") : "",
    matricula: editP.vehiculo ? (editP.vehiculo.matricula || "") : "",
    chasis: editP.vehiculo ? (editP.vehiculo.chasis || "") : "",
    padron: editP.vehiculo ? (editP.vehiculo.padron || "") : "",
    motor: editP.vehiculo ? (editP.vehiculo.motor || "") : "",
    deducible: editP.vehiculo ? (editP.vehiculo.deducible || "") : "",
    tipoCobertura: editP.vehiculo ? (editP.vehiculo.tipoCobertura || "Todo riesgo") : "Todo riesgo",
  } : {
    clienteId: route.params.cliente || "",
    ramo: "vehiculos", companiaId: "", cobertura: "",
    inicio: HOY, fin: addMonths(HOY, 12), sinVencimiento: false,
    metodoPago: "Débito automático", cuotas: 12, premio: "",
    tipoBien: "Automóvil", marca: "", modelo: "", anio: "", matricula: "", chasis: "", padron: "", motor: "", deducible: "", tipoCobertura: "Todo riesgo",
  });
  const set = (k, v) => setF((s) => ({ ...s, [k]: v }));
  const close = () => go("polizas", {});

  // Compañías que ofrecen el ramo elegido
  const companiasRamo = companias.filter((c) => c.ramos.includes(f.ramo));
  // Coberturas dependientes: solo las de la compañía elegida para ese ramo
  const co = companias.find((c) => c.id === f.companiaId);
  const coberturas = co ? co.coberturas.filter((cb) => cb.ramo === f.ramo) : [];
  // nombres genéricos para ramos sin catálogo cargado
  const coberturasGenericas = { hogar: ["Hogar Integral", "Vivienda Protegida", "Básico"], accidentesTrabajo: ["Ley 16.074"], objetos: ["Objetos Valiosos", "Todo Riesgo"], garantiaAlquiler: ["Garantía Alquiler Plus", "Garantía Estándar"] };
  const opcionesCobertura = coberturas.length ? coberturas.map((c) => c.nombre) : (coberturasGenericas[f.ramo] || []);

  // al cambiar compañía o ramo, reseteo cobertura (salvo en el primer render al editar)
  const firstCob = React.useRef(true);
  React.useEffect(() => { if (firstCob.current) { firstCob.current = false; return; } set("cobertura", ""); }, [f.companiaId, f.ramo]);
  // accidentes de trabajo => mensual
  const esMensual = f.ramo === "accidentesTrabajo";
  const firstFin = React.useRef(true);
  React.useEffect(() => {
    if (firstFin.current) { firstFin.current = false; return; }
    if (esMensual) { set("fin", addMonths(f.inicio, 1)); }
    else if (!f.sinVencimiento) { set("fin", addMonths(f.inicio, 12)); }
  }, [f.inicio, f.ramo, f.sinVencimiento]);

  // sugerir premio según cobertura elegida
  React.useEffect(() => {
    const cb = coberturas.find((c) => c.nombre === f.cobertura);
    if (cb && !f.premio) set("premio", esMensual ? cb.precioMensual * 12 : Math.round(cb.precioMensual * 12 * 0.97));
  }, [f.cobertura]);

  const premioN = Number(f.premio) || 0;
  const iva = esMensual ? 0 : Math.round(premioN * 0.22);
  const total = premioN + iva;
  const cli = clientes.find((c) => c.id === f.clienteId);

  const valido = f.clienteId && f.companiaId && f.cobertura && premioN > 0 &&
    (f.ramo !== "vehiculos" || f.marca);

  function guardar() {
    const base = {
      ramo: f.ramo, clienteId: f.clienteId, companiaId: f.companiaId, cobertura: f.cobertura,
      inicio: f.inicio, fin: f.sinVencimiento ? "9999-12-31" : f.fin,
      metodoPago: f.metodoPago, cuotas: esMensual ? 1 : Number(f.cuotas), premio: premioN, iva, total, mensual: esMensual,
    };
    const veh = f.ramo === "vehiculos" ? { tipoBien: f.tipoBien, descripcion: `${f.marca} ${f.modelo}`.trim(), marca: f.marca, modelo: f.modelo, anio: Number(f.anio) || "", chasis: f.chasis, padron: f.padron, motor: f.motor, matricula: f.matricula, deducible: Number(f.deducible) || 0, tipoCobertura: f.tipoCobertura } : null;
    if (editP) {
      const upd = { ...editP, ...base };
      if (veh) upd.vehiculo = { ...editP.vehiculo, ...veh }; else delete upd.vehiculo;
      updatePoliza(upd);
    } else {
      const nueva = { id: "p" + Math.random().toString(36).slice(2, 7), numero: numeroPoliza(f.ramo), ...base, renovada: false, anulada: false };
      if (veh) nueva.vehiculo = veh;
      addPoliza(nueva);
    }
    close();
  }

  return (
    <Modal title={editP ? "Editar póliza" : "Nueva póliza"} sub={editP ? editP.numero : "Completá los datos para emitir"} onClose={close} wide
      footer={<>
        <button className="btn btn-ghost" onClick={close}>Cancelar</button>
        <button className="btn btn-primary" disabled={!valido} style={!valido ? { opacity: .5, pointerEvents: "none" } : null} onClick={guardar}><Icon name="shieldCheck" size={16} />{editP ? "Guardar cambios" : "Emitir póliza"}</button>
      </>}>

      <div className="fieldset-title">Asegurado y ramo</div>
      <div className="form-grid" style={{ margin: "12px 0 22px" }}>
        <div className="field full">
          <label>Cliente asegurado *</label>
          <select className="select" value={f.clienteId} onChange={(e) => set("clienteId", e.target.value)}>
            <option value="">Seleccionar cliente…</option>
            {[...clientes].sort((a, b) => (a.apellido || a.nombre).localeCompare(b.apellido || b.nombre)).map((c) => (
              <option key={c.id} value={c.id}>{nombreCompleto(c)} — {c.cedula}</option>
            ))}
          </select>
          {cli && <span className="hint">{cli.telefono} · {cli.email}</span>}
        </div>
        <div className="field">
          <label>Ramo / tipo de seguro *</label>
          <select className="select" value={f.ramo} onChange={(e) => set("ramo", e.target.value)}>
            {Object.keys(ramos).map((r) => <option key={r} value={r}>{ramos[r].label}</option>)}
          </select>
        </div>
        <div className="field">
          <label>Compañía aseguradora *</label>
          <select className="select" value={f.companiaId} onChange={(e) => set("companiaId", e.target.value)}>
            <option value="">Seleccionar compañía…</option>
            {companiasRamo.map((c) => <option key={c.id} value={c.id}>{c.nombre}</option>)}
          </select>
        </div>
        <div className="field full">
          <label>Cobertura *</label>
          <select className="select" value={f.cobertura} disabled={!f.companiaId} onChange={(e) => set("cobertura", e.target.value)}>
            <option value="">{f.companiaId ? "Seleccionar cobertura…" : "Elegí primero la compañía"}</option>
            {opcionesCobertura.map((n) => <option key={n} value={n}>{n}</option>)}
          </select>
          <span className="hint">{f.companiaId ? `Cada compañía nombra sus coberturas distinto — mostramos solo las de ${co?.corto}.` : "El listado depende de la compañía seleccionada."}</span>
        </div>
      </div>

      {f.ramo === "vehiculos" && (
        <>
          <div className="fieldset-title">Datos del vehículo</div>
          <div className="form-grid" style={{ margin: "12px 0 22px" }}>
            <div className="field"><label>Tipo de bien</label><select className="select" value={f.tipoBien} onChange={(e) => set("tipoBien", e.target.value)}><option>Automóvil</option><option>Motocicleta</option><option>Camioneta / Utilitario</option></select></div>
            <div className="field"><label>Marca *</label><input className="input" value={f.marca} onChange={(e) => set("marca", e.target.value)} placeholder="Toyota" /></div>
            <div className="field"><label>Modelo</label><input className="input" value={f.modelo} onChange={(e) => set("modelo", e.target.value)} placeholder="Corolla XEI" /></div>
            <div className="field"><label>Año</label><input className="input num" value={f.anio} onChange={(e) => set("anio", e.target.value)} placeholder="2023" /></div>
            <div className="field"><label>Matrícula *</label><input className="input mono" value={f.matricula} onChange={(e) => set("matricula", e.target.value.toUpperCase())} placeholder="SBA 4471" /></div>
            <div className="field"><label>Nº de chasis</label><input className="input mono" value={f.chasis} onChange={(e) => set("chasis", e.target.value.toUpperCase())} placeholder="9BR53…" /></div>
            <div className="field"><label>Nº de padrón</label><input className="input mono" value={f.padron} onChange={(e) => set("padron", e.target.value)} placeholder="900.482.671" /></div>
            <div className="field"><label>Nº de motor</label><input className="input mono" value={f.motor} onChange={(e) => set("motor", e.target.value.toUpperCase())} /></div>
            <div className="field"><label>Tipo de cobertura</label><select className="select" value={f.tipoCobertura} onChange={(e) => set("tipoCobertura", e.target.value)}><option>Todo riesgo</option><option>Intermedia</option><option>Responsabilidad civil</option></select></div>
            <div className="field"><label>Valor del deducible</label><input className="input num" value={f.deducible} onChange={(e) => set("deducible", e.target.value)} placeholder="38000" /></div>
          </div>
        </>
      )}

      <div className="fieldset-title">Vigencia y pago</div>
      <div className="form-grid" style={{ margin: "12px 0 22px" }}>
        <div className="field"><label>Fecha de inicio</label><input type="date" className="input" value={f.inicio} onChange={(e) => set("inicio", e.target.value)} /></div>
        <div className="field"><label>Fecha de fin {esMensual && "(mensual)"}</label><input type="date" className="input" value={f.sinVencimiento ? "" : f.fin} disabled={f.sinVencimiento || esMensual} onChange={(e) => set("fin", e.target.value)} />
          {!esMensual && <label className="hint row" style={{ gap: 6, cursor: "pointer" }}><input type="checkbox" checked={f.sinVencimiento} onChange={(e) => set("sinVencimiento", e.target.checked)} />Vigencia continua (sin vencimiento estricto)</label>}
        </div>
        <div className="field"><label>Método de pago</label><select className="select" value={f.metodoPago} onChange={(e) => set("metodoPago", e.target.value)}><option>Débito automático</option><option>Tarjeta de crédito</option><option>Efectivo</option><option>Contado</option></select></div>
        <div className="field"><label>Cantidad de cuotas</label><input className="input num" value={esMensual ? 1 : f.cuotas} disabled={esMensual} onChange={(e) => set("cuotas", e.target.value)} /></div>
        <div className="field"><label>Premio {esMensual ? "mensual" : "anual"} *</label><input className="input num" value={f.premio} onChange={(e) => set("premio", e.target.value)} placeholder="56400" /></div>
      </div>

      {/* Resumen de importe */}
      <div className="card card-pad" style={{ background: "var(--surface-2)" }}>
        <div className="kv" style={{ gridTemplateColumns: "1fr auto" }}>
          <dt>Premio</dt><dd className="num" style={{ textAlign: "right" }}>{fmtMoney(premioN)}</dd>
          <dt>IVA (22%)</dt><dd className="num" style={{ textAlign: "right" }}>{fmtMoney(iva)}</dd>
        </div>
        <div className="divider" style={{ margin: "12px 0" }} />
        <div className="between"><b style={{ fontSize: 15 }}>Total {esMensual ? "mensual" : ""}</b><b className="num" style={{ fontSize: 22, color: "var(--primary-strong)" }}>{fmtMoney(total)}</b></div>
        {!esMensual && f.cuotas > 0 && premioN > 0 && <div className="muted" style={{ fontSize: 12.5, marginTop: 6, textAlign: "right" }}>{f.cuotas} cuotas de {fmtMoney(Math.round(total / f.cuotas))}</div>}
      </div>
    </Modal>
  );
}

function addMonths(iso, n) {
  const d = new Date(iso + "T00:00:00");
  d.setMonth(d.getMonth() + n);
  return d.toISOString().slice(0, 10);
}
function numeroPoliza(ramo) {
  const pref = { vehiculos: "VEH", hogar: "HOG", accidentesTrabajo: "ACT", objetos: "OBJ", garantiaAlquiler: "GAR" }[ramo] || "POL";
  return `${pref}-2026-${String(Math.floor(Math.random() * 90000) + 10000)}`;
}
window.NuevaPolizaForm = NuevaPolizaForm;
window.addMonths = addMonths;
