/* global React */
/* ============================================================
   Exhibit 5 rework: the wider map as a JOURNEY.
   - Bedrock (project information) is a full-width band the
     whole map stands on, echoing Exhibit 4's strata.
   - A phase toggle advances the firm: meters move, and the
     domains that moved this phase are marked in ochre.
   Exports: window.WiderMapJourney
   ============================================================ */

const WM_PHASES = [
  { num: "01", phase: "Win the work", sub: "Pre-construction",
    domains: ["Bidding & tendering", "Cost estimation & takeoff", "Proposal generation", "Permitting & approvals"] },
  { num: "02", phase: "Run the work", sub: "Execution",
    domains: ["Scheduling & planning", "Cost control & cash flow", "Procurement & logistics", "Quality control", "Health & safety", "Subcontractor management", "RFIs, submittals & change orders", "Progress reporting & deliverables"] },
  { num: "03", phase: "Close & learn", sub: "Handover & memory",
    domains: ["Closeout & handover", "Knowledge across projects", "Forecasting & risk anticipation"] },
];
const WM_ACROSS = ["Client & owner communication", "Compliance & control"];
const WM_BEDROCK = "Project information & day-to-day management";

/* The journey: one column of levels (0–4) per step */
const WM_STEPS = [
  { tag: "01", label: "Today",
    note: "Running on memory: the record lives in heads and scattered files, and nearly every domain sits on the first rungs." },
  { tag: "02", label: "The bedrock set",
    note: "Project information reaches AI-augmented — and reporting and client communication move with it, almost for free." },
  { tag: "03", label: "Winning work",
    note: "The process repeats on the early lifecycle — bidding, estimating, proposals — where the speed is most visible." },
  { tag: "04", label: "The augmented firm",
    note: "Domain by domain, the same four stages. The firm runs on a system that keeps its own record." },
];

const WM_LEVELS = {
  "Project information & day-to-day management": [2, 4, 4, 4],
  "Bidding & tendering":                         [1, 1, 3, 4],
  "Cost estimation & takeoff":                   [1, 1, 3, 3],
  "Proposal generation":                         [1, 1, 4, 4],
  "Permitting & approvals":                      [1, 1, 2, 3],
  "Scheduling & planning":                       [1, 1, 1, 3],
  "Cost control & cash flow":                    [1, 1, 1, 3],
  "Procurement & logistics":                     [1, 1, 1, 3],
  "Quality control":                             [1, 1, 1, 3],
  "Health & safety":                             [1, 1, 1, 2],
  "Subcontractor management":                    [1, 1, 1, 3],
  "RFIs, submittals & change orders":            [1, 2, 2, 3],
  "Progress reporting & deliverables":           [1, 3, 3, 4],
  "Closeout & handover":                         [0, 1, 1, 3],
  "Knowledge across projects":                   [0, 1, 1, 3],
  "Forecasting & risk anticipation":             [0, 0, 1, 3],
  "Client & owner communication":                [1, 2, 2, 3],
  "Compliance & control":                        [1, 1, 2, 3],
};

const WM_SEG = ["#A9CDB5", "#5FA980", "#2F9E72", "#00603C"];
const WM_STAGE_NAMES = ["Manual", "Digital", "Standardized", "AI-augmented"];

/* ---- Spanish: display only; WM_LEVELS keys stay English ---- */
const tr4 = (en, es) => (window.cecLang === "es" ? es : en);
const WM_STAGE_NAMES_ES = ["Manual", "Digital", "Estandarizado", "Asistida por IA"];
const WM_PHASE_ES = {
  "01": { phase: "Ganar el trabajo", sub: "Preconstrucción" },
  "02": { phase: "Ejecutar el trabajo", sub: "Ejecución" },
  "03": { phase: "Cerrar y aprender", sub: "Entrega y memoria" },
};
const WM_STEPS_ES = [
  { label: "Hoy", note: "Corre sobre la memoria: el registro vive en cabezas y archivos sueltos, y casi todos los dominios están en los primeros peldaños." },
  { label: "La base lista", note: "La información de obra llega a Asistida por IA — y la reportería y la comunicación con el cliente se mueven con ella, casi gratis." },
  { label: "Ganando trabajo", note: "El proceso se repite en el ciclo temprano — licitación, presupuesto, propuestas — donde la velocidad se ve más." },
  { label: "La empresa asistida", note: "Dominio por dominio, las mismas cuatro etapas. La empresa corre sobre un sistema que mantiene su propio registro." },
];
const WM_DOMAIN_ES = {
  "Project information & day-to-day management": "Información de obra y gestión del día a día",
  "Bidding & tendering": "Licitación",
  "Cost estimation & takeoff": "Presupuesto y cómputos",
  "Proposal generation": "Generación de propuestas",
  "Permitting & approvals": "Permisos y aprobaciones",
  "Scheduling & planning": "Programación y planeación",
  "Cost control & cash flow": "Control de costos y flujo de caja",
  "Procurement & logistics": "Compras y logística",
  "Quality control": "Control de calidad",
  "Health & safety": "Salud y seguridad",
  "Subcontractor management": "Gestión de subcontratistas",
  "RFIs, submittals & change orders": "RFIs, entregables y órdenes de cambio",
  "Progress reporting & deliverables": "Reportería de avance y entregables",
  "Closeout & handover": "Cierre y entrega",
  "Knowledge across projects": "Conocimiento entre obras",
  "Forecasting & risk anticipation": "Pronóstico y anticipación de riesgos",
  "Client & owner communication": "Comunicación con cliente y dueño",
  "Compliance & control": "Cumplimiento y control",
};
const wmDom = (label) => (window.cecLang === "es" ? (WM_DOMAIN_ES[label] || label) : label);
const wmSN = () => (window.cecLang === "es" ? WM_STAGE_NAMES_ES : WM_STAGE_NAMES);

function WMMeter({ level, onDark }) {
  const empty = onDark ? "rgba(255,255,255,.28)" : "var(--stone)";
  return (
    <span style={{ display: "inline-flex", gap: 3, flexShrink: 0 }}>
      {[0, 1, 2, 3].map((i) => (
        <span key={i} style={{
          width: 13, height: 7, borderRadius: 2,
          background: i < level ? (onDark ? "#fff" : WM_SEG[i]) : empty,
          transition: "background .35s ease-out",
        }}></span>
      ))}
    </span>
  );
}

function WMChip({ label, step }) {
  const lvl = WM_LEVELS[label][step];
  const moved = step > 0 && lvl > WM_LEVELS[label][step - 1];
  return (
    <div style={{
      display: "flex", alignItems: "center", justifyContent: "space-between", gap: 10,
      background: "var(--paper-card)",
      border: "1px solid " + (moved ? "rgba(194,146,47,.65)" : "var(--stone)"),
      borderRadius: 7, padding: "9px 13px", transition: "border-color .35s ease-out",
    }}>
      <span style={{ display: "flex", alignItems: "center", gap: 9, minWidth: 0 }}>
        <span style={{ width: 6, height: 6, borderRadius: "50%", background: moved ? "var(--accent-ochre)" : "var(--green-300)", flexShrink: 0, transition: "background .35s ease-out" }}></span>
        <span style={{ font: "500 13px/1.25 var(--font-sans)", color: "var(--ink)" }}>{wmDom(label)}</span>
      </span>
      <WMMeter level={lvl} />
    </div>
  );
}

function WMPhaseCol({ p, step }) {
  const twoCol = p.domains.length > 5;
  return (
    <div style={{ display: "flex", flexDirection: "column" }}>
      <div style={{ display: "flex", alignItems: "baseline", gap: 9, paddingBottom: 11, marginBottom: 13, borderBottom: "2px solid var(--ink)" }}>
        <span style={{ font: "300 22px var(--font-sans)", color: "var(--green-deep)" }}>{p.num}</span>
        <span style={{ font: "700 17px var(--font-sans)", color: "var(--ink)", letterSpacing: "-.01em" }}>{window.cecLang === "es" ? WM_PHASE_ES[p.num].phase : p.phase}</span>
        <span style={{ font: "500 12.5px var(--font-sans)", color: "var(--ink-mute)", marginLeft: "auto" }}>{window.cecLang === "es" ? WM_PHASE_ES[p.num].sub : p.sub}</span>
      </div>
      <div style={{ display: "grid", gridTemplateColumns: twoCol ? "1fr 1fr" : "1fr", gap: 8, alignContent: "start" }}>
        {p.domains.map((d) => <WMChip key={d} label={d} step={step} />)}
      </div>
    </div>
  );
}

function WMArrow() {
  return (
    <div style={{ display: "flex", alignItems: "flex-start", justifyContent: "center", paddingTop: 8 }}>
      <svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="var(--stone)" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"><path d="M5 12h14M13 6l6 6-6 6" /></svg>
    </div>
  );
}

function WiderMapJourney({ embed, frozen }) {
  const isFrozen = frozen !== null && frozen !== undefined;
  const [step, setStep] = React.useState(() => {
    if (isFrozen) return frozen;
    const s = parseInt(localStorage.getItem("cecrop-ex5-step"), 10);
    return s >= 0 && s <= 3 ? s : 0;
  });
  const pick = (i) => { if (isFrozen) return; setStep(i); try { localStorage.setItem("cecrop-ex5-step", String(i)); } catch (e) {} };
  const bedrockLvl = WM_LEVELS[WM_BEDROCK][step];
  const bedrockMoved = step > 0 && bedrockLvl > WM_LEVELS[WM_BEDROCK][step - 1];

  return (
    <div style={{ width: "100%", fontFamily: "var(--font-sans)" }}>

      {/* ---- the journey toggle ---- */}
      <div style={{ display: "flex", alignItems: "center", gap: 6, flexWrap: "wrap" }}>
        {WM_STEPS.map((s, i) => (
          <React.Fragment key={s.tag}>
            {i > 0 && <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="var(--stone)" strokeWidth="2.4" strokeLinecap="round" strokeLinejoin="round" style={{ flexShrink: 0 }}><path d="M9 6l6 6-6 6" /></svg>}
            <button onClick={() => pick(i)} style={{
              display: "inline-flex", alignItems: "center", gap: 8, cursor: isFrozen ? "default" : "pointer",
              font: "600 13px var(--font-sans)", letterSpacing: "0",
              padding: "9px 15px", borderRadius: 999,
              background: i === step ? "var(--green-700)" : "var(--paper-card)",
              color: i === step ? "#fff" : "var(--ink-soft)",
              border: "1px solid " + (i === step ? "var(--green-700)" : "var(--stone)"),
              transition: "background .2s ease-out, color .2s ease-out, border-color .2s ease-out",
            }}>
              <span style={{ font: "700 11px var(--font-sans)", opacity: i === step ? .75 : .55 }}>{s.tag}</span>
              {window.cecLang === "es" ? WM_STEPS_ES[i].label : s.label}
            </button>
          </React.Fragment>
        ))}
      </div>
      <p style={{ font: "400 14.5px/1.5 var(--font-sans)", color: "var(--ink-soft)", margin: "13px 0 0", minHeight: 22 }}>
        {(window.cecLang === "es" ? WM_STEPS_ES : WM_STEPS)[step].note}
      </p>

      {/* ---- legend ---- */}
      <div style={{ display: "flex", alignItems: "center", gap: 18, flexWrap: "wrap", margin: "16px 0 18px", padding: "11px 16px", background: "var(--paper-card)", border: "1px solid var(--stone)", borderRadius: 8 }}>
        <span style={{ font: "700 11px var(--font-sans)", letterSpacing: ".1em", textTransform: "uppercase", color: "var(--ink-mute)" }}>{tr4("The four stages", "Las cuatro etapas")}</span>
        <span style={{ display: "flex", gap: 15 }}>
          {wmSN().map((n, i) => (
            <span key={n} style={{ display: "inline-flex", alignItems: "center", gap: 6 }}>
              <span style={{ width: 13, height: 7, borderRadius: 2, background: WM_SEG[i] }}></span>
              <span style={{ font: "500 12.5px var(--font-sans)", color: "var(--ink)" }}>{n}</span>
            </span>
          ))}
        </span>
        <span style={{ display: "inline-flex", alignItems: "center", gap: 6, marginLeft: "auto" }}>
          <span style={{ width: 7, height: 7, borderRadius: "50%", background: "var(--accent-ochre)" }}></span>
          <span style={{ font: "500 12px var(--font-sans)", color: "var(--ink-mute)", fontStyle: "italic" }}>{tr4("moved in this phase · illustrative", "avanzó en esta fase · ilustrativo")}</span>
        </span>
      </div>

      {/* ---- the three lifecycle phases ---- */}
      <div style={{ display: "grid", gridTemplateColumns: "1fr 26px 1.9fr 26px 1fr", columnGap: 16 }}>
        <WMPhaseCol p={WM_PHASES[0]} step={step} />
        <WMArrow />
        <WMPhaseCol p={WM_PHASES[1]} step={step} />
        <WMArrow />
        <WMPhaseCol p={WM_PHASES[2]} step={step} />
      </div>

      {/* ---- across band ---- */}
      <div style={{ display: "flex", alignItems: "center", gap: 16, marginTop: 14, background: "var(--paper-deep)", border: "1px solid var(--stone)", borderRadius: 8, padding: "11px 16px" }}>
        <span style={{ font: "700 11px var(--font-sans)", letterSpacing: ".1em", textTransform: "uppercase", color: "var(--ink-mute)", flexShrink: 0 }}>{tr4("Across the whole project", "En todo el proyecto")}</span>
        <div style={{ display: "flex", gap: 8, flexWrap: "wrap", flex: 1 }}>
          {WM_ACROSS.map((d) => <WMChip key={d} label={d} step={step} />)}
        </div>
      </div>

      {/* ---- seam: everything stands on the bedrock ---- */}
      <div style={{ display: "flex", alignItems: "center", justifyContent: "center", gap: 9, padding: "9px 0" }}>
        <svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="var(--green-600)" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"><path d="M12 19V5M6 11l6-6 6 6" /></svg>
        <span style={{ font: "600 11px var(--font-sans)", letterSpacing: ".07em", textTransform: "uppercase", color: "var(--ink-mute)" }}>{tr4("every domain stands on the record below", "cada dominio se apoya en el registro de abajo")}</span>
        <svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="var(--green-600)" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"><path d="M12 5v14M6 13l6 6 6-6" /></svg>
      </div>

      {/* ---- the bedrock band ---- */}
      <div style={{ background: "var(--green-700)", borderRadius: 10, padding: "17px 22px", display: "flex", alignItems: "center", gap: 16, border: bedrockMoved ? "1px solid var(--accent-ochre)" : "1px solid var(--green-700)", transition: "border-color .35s ease-out" }}>
        <span style={{ font: "700 11px var(--font-sans)", letterSpacing: ".12em", textTransform: "uppercase", color: "rgba(255,255,255,.6)", flexShrink: 0 }}>{tr4("The bedrock", "La base")}</span>
        <span style={{ flexShrink: 0, width: 38, height: 38, borderRadius: 9, background: "rgba(255,255,255,.13)", display: "grid", placeItems: "center", color: "#fff" }}>
          <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.9" strokeLinecap="round" strokeLinejoin="round"><path d="M12 2l9 5-9 5-9-5 9-5zM3 12l9 5 9-5M3 17l9 5 9-5" /></svg>
        </span>
        <span style={{ font: "700 16.5px var(--font-sans)", color: "#fff", letterSpacing: "-.01em" }}>{wmDom(WM_BEDROCK)}</span>
        <span style={{ marginLeft: "auto", display: "inline-flex", alignItems: "center", gap: 10 }}>
          {bedrockMoved && <span style={{ width: 7, height: 7, borderRadius: "50%", background: "var(--accent-ochre)" }}></span>}
          <span style={{ font: "600 12.5px var(--font-sans)", color: "rgba(255,255,255,.85)" }}>{wmSN()[bedrockLvl - 1]}</span>
          <WMMeter level={bedrockLvl} onDark={true} />
        </span>
      </div>

    </div>
  );
}

Object.assign(window, { WiderMapJourney });
