/* ============================================================
   Robotia Cotizador · App root (§2.2 estado + flujo)
   Flujo: Cliente → Modalidad → Configuración → Precio de venta → Resumen
   ============================================================ */
const Eapp = window.RBEngine;

function nuevaCotizacion() {
  return {
    id: Eapp.uuid(),
    fecha: new Date().toISOString(),
    version: "streaming-v5.0 / imagen-v3.0",
    cliente: { nombre: "", contacto: "", sector: "" },
    modalidad: null,
    anioCotizacion: new Date().getFullYear() < 2025 ? 2025 : new Date().getFullYear(),
    inflacion: 0.05,
    inputs: {
      nPuntos: 4,
      visibilidad: 3,
      equipos: 3,
      nCalibraciones: 1,
      calibracionesAdicionales: [],
      nCalibracionesPrincipal: 1,
      proyectosMedia: 0,
      proyectosAlta: 0,
    },
    venta: window.RBSales ? window.RBSales.ventaDefault() : {},
  };
}

// migración: cotizaciones guardadas antes de la capa de venta / unificación
function asegurarVenta(c) {
  if (c.modalidad === "conjunto") { asegurarConjunto(c); return c; }
  if (!c.venta || !c.venta.margenes) c.venta = window.RBSales.ventaDefault();
  if (!c.venta.escalabilidad) c.venta.escalabilidad = window.RBSales.ventaDefault().escalabilidad;
  // unificación calibración Streaming: flag antiguo → contador
  if (c.inputs && c.inputs.nCalibracionesPrincipal == null) {
    c.inputs.nCalibracionesPrincipal = c.inputs.sinCalibracionBase ? 0 : 1;
  }
  return c;
}

// inicializa / completa la estructura conjunta
function asegurarConjunto(c) {
  if (!c.sub) c.sub = { streaming: window.RBJoint.subDefault("streaming"), imagen: window.RBJoint.subDefault("imagen") };
  ["streaming", "imagen"].forEach(function (k) {
    if (!c.sub[k]) c.sub[k] = window.RBJoint.subDefault(k);
    if (!c.sub[k].venta || !c.sub[k].venta.margenes) c.sub[k].venta = window.RBSales.ventaDefault();
    if (!c.sub[k].venta.escalabilidad) c.sub[k].venta.escalabilidad = window.RBSales.ventaDefault().escalabilidad;
    if (c.sub[k].inputs && c.sub[k].inputs.nCalibracionesPrincipal == null) c.sub[k].inputs.nCalibracionesPrincipal = 1;
  });
  if (c.sinergia == null) c.sinergia = 0;
  return c;
}

const STEPS = [
  { key: "cliente", lbl: "Cliente" },
  { key: "modalidad", lbl: "Modalidad" },
  { key: "config", lbl: "Configuración" },
  { key: "venta", lbl: "Precio de venta" },
  { key: "resumen", lbl: "Resumen" },
];

function Clock() {
  const [t, setT] = useState(new Date());
  useEffect(() => { const id = setInterval(() => setT(new Date()), 1000); return () => clearInterval(id); }, []);
  const f = (n) => String(n).padStart(2, "0");
  return <span className="clock">{f(t.getHours())}:{f(t.getMinutes())}:{f(t.getSeconds())} · {t.toLocaleDateString("es-CL", { day: "2-digit", month: "short", year: "numeric" })}</span>;
}

function Stepper({ screen, cot, go }) {
  if (screen === "welcome") return null;
  const idx = STEPS.findIndex((s) => s.key === screen);
  const reach = (i) => {
    if (i === 0) return true;
    if (i === 1) return (cot.cliente.nombre || "").trim().length > 0;
    return !!cot.modalidad;
  };
  return (
    <div className="stepper">
      {STEPS.map((s, i) => (
        <React.Fragment key={s.key}>
          <div className={"step" + (i === idx ? " active" : "") + (i < idx ? " done" : "") + (reach(i) ? " clickable" : "")}
            onClick={() => reach(i) && go(s.key)}>
            <span className="n">{i < idx ? "✓" : String(i + 1).padStart(2, "0")}</span>
            <span className="lbl">{s.lbl}</span>
          </div>
          {i < STEPS.length - 1 ? <span className="line"></span> : null}
        </React.Fragment>
      ))}
    </div>
  );
}

function App() {
  const [screen, setScreen] = useState("welcome");
  const [cot, setCot] = useState(nuevaCotizacion());
  const [saved, setSaved] = useState(Eapp.cargarCotizaciones());
  const [toast, setToast] = useState(null);
  const [justSaved, setJustSaved] = useState(false);
  const [view, setView] = useState("costos");        // resumen: costos | venta
  const [printMode, setPrintMode] = useState("costos"); // costos | venta

  const showToast = (msg) => { setToast(msg); setTimeout(() => setToast(null), 2200); };
  const go = (s) => { setScreen(s); window.scrollTo && window.scrollTo(0, 0); const sc = document.querySelector(".scroll"); if (sc) sc.scrollTop = 0; };

  const onNew = () => { setCot(nuevaCotizacion()); setJustSaved(false); setView("costos"); go("cliente"); };
  const onOpen = (c) => { setCot(asegurarVenta(JSON.parse(JSON.stringify(c)))); setJustSaved(true); setView("costos"); go("resumen"); };
  const onDelete = (id) => { const arr = Eapp.eliminarCotizacion(id); setSaved(arr); showToast("Cotización eliminada"); };
  const onDuplicate = (id) => { const copy = Eapp.duplicarCotizacion(id); if (copy) { setCot(asegurarVenta(copy)); setJustSaved(false); setView("costos"); go("resumen"); } };

  // al pasar de Modalidad → siguiente, si es conjunto inicializa la estructura
  const afterModalidad = () => {
    if (cot.modalidad === "conjunto") {
      const next = JSON.parse(JSON.stringify(cot));
      asegurarConjunto(next);
      setCot(next);
    }
    go("config");
  };

  const onSave = () => {
    const toStore = JSON.parse(JSON.stringify(cot));
    toStore.fecha = toStore.fecha || new Date().toISOString();
    const arr = Eapp.guardarCotizacion(toStore);
    setSaved(arr); setJustSaved(true); showToast("Cotización guardada");
  };
  const doPrint = (mode) => { setPrintMode(mode); showToast("Preparando PDF…"); setTimeout(() => window.print(), 450); };
  const onPdf = () => doPrint("costos");
  const onPdfCliente = () => doPrint("venta");
  const onExcel = () => { Eapp.exportarExcel(cot); showToast("Excel de costos generado"); };
  const onExcelCliente = () => { window.RBSales.exportarExcelCliente(cot, cot.venta); showToast("Propuesta cliente generada"); };
  const onExcelConjuntoCostos = () => { window.RBJoint.exportarExcelConjuntoCostos(cot); showToast("Excel conjunto generado"); };
  const onExcelConjuntoCliente = () => { window.RBJoint.exportarExcelConjuntoCliente(cot); showToast("Propuesta conjunta generada"); };

  const setCotDirty = (next) => { setCot(next); setJustSaved(false); };

  return (
    <div className="app">
      <div className="topbar no-print">
        <div className="brand">
          <img src="assets/logo-robotia-white.png" alt="Robotia" />
          <div className="sep"></div>
          <div className="prod">Cotizador<em>_</em> Sentinel</div>
        </div>
        <div className="right">
          <Clock />
          <div className="av">RB</div>
        </div>
      </div>

      <Stepper screen={screen} cot={cot} go={go} />

      <div className="scroll">
        {screen === "welcome" && (
          <Welcome saved={saved} onNew={onNew} onOpen={onOpen} onDelete={onDelete} onDuplicate={onDuplicate} />
        )}
        {screen === "cliente" && (
          <ClienteForm cot={cot} setCot={setCotDirty} onNext={() => go("modalidad")} onBack={() => go("welcome")} />
        )}
        {screen === "modalidad" && (
          <ModalitySelect cot={cot} setCot={setCotDirty} onNext={afterModalidad} onBack={() => go("cliente")} />
        )}
        {screen === "config" && (cot.modalidad === "conjunto"
          ? <JointConfig joint={cot} setJoint={setCotDirty} onNext={() => go("venta")} onBack={() => go("modalidad")} />
          : <Config cot={cot} setCot={setCotDirty} onCalc={() => go("venta")} onBack={() => go("modalidad")} />
        )}
        {screen === "venta" && (cot.modalidad === "conjunto"
          ? <JointVenta joint={cot} setJoint={setCotDirty} onNext={() => { setView("venta"); go("resumen"); }} onBack={() => go("config")} />
          : <Venta cot={cot} setCot={setCotDirty} onNext={() => { setView("venta"); go("resumen"); }} onBack={() => go("config")} />
        )}
        {screen === "resumen" && (cot.modalidad === "conjunto"
          ? <JointResumen joint={cot} setJoint={setCotDirty} view={view} setView={setView}
              onSave={onSave}
              onPdfCliente={onPdfCliente} onExcelCliente={onExcelConjuntoCliente}
              onPdfCostos={onPdf} onExcelCostos={onExcelConjuntoCostos}
              onEditConfig={() => go("config")} onEditVenta={() => go("venta")} justSaved={justSaved} />
          : <Summary cot={cot} view={view} setView={setView}
              onSave={onSave} onPdf={onPdf} onExcel={onExcel}
              onPdfCliente={onPdfCliente} onExcelCliente={onExcelCliente}
              onEdit={() => go("config")} onEditVenta={() => go("venta")} justSaved={justSaved} />
        )}
      </div>

      {cot.modalidad === "conjunto"
        ? (cot.sub ? <PrintDocConjunto joint={cot} mode={printMode} /> : null)
        : (cot.modalidad ? (printMode === "venta" ? <PrintDocVenta cot={cot} /> : <PrintDoc cot={cot} />) : null)}

      <div className={"toast" + (toast ? " show" : "")}>
        <span className="ok">✓</span>{toast}
      </div>
    </div>
  );
}

ReactDOM.createRoot(document.getElementById("root")).render(<App />);
