/* ============================================================
   Minha Jornada — App principal
   Estado central: índice da etapa atual (0..STEPS.length-1).
   ============================================================ */

function statusOf(i, current) {
  if (i < current) return "done";
  if (i === current) return "current";
  return "locked";
}

const BADGE = {
  done:    { cls: "badge--done",    txt: "Concluída" },
  current: { cls: "badge--current", txt: "Você está aqui" },
  locked:  { cls: "badge--locked",  txt: "Bloqueada" },
};

/* ---------- Cabeçalho de status ---------- */
function StatusHeader({ current, candidato }) {
  const total = STEPS.length;
  const done = current;
  const pct = Math.round((done / (total - 1)) * 100);
  const next = STEPS[current];
  const saudacao = candidato ? `Olá, ${candidato.nome.split(" ")[0]} 👋` : "Bem-vindo(a)! 👋";
  return (
    <header className="jhead">
      <div className="jhead__eyebrow">Vestibular 2026.2 · Graduação</div>
      <h1>{saudacao}</h1>
      <p className="jhead__sub">Acompanhe aqui toda a sua jornada — do cadastro à matrícula. A cada etapa concluída, você avança rumo à sua vaga.</p>

      <div className="jhead__progrow">
        <div className="jhead__bar"><i style={{ width: pct + "%" }} /></div>
        <div className="jhead__pct">{pct}%</div>
      </div>

      {current < total - 1 ? (
        <div className="jhead__next">
          <Icon name="arrow" size={20} style={{ color: "var(--gold)" }} />
          <div>
            <div className="lab">Próximo passo</div>
            <b>{next.title} — {next.sub}</b>
          </div>
        </div>
      ) : (
        <div className="jhead__next">
          <Icon name="seal" size={20} style={{ color: "var(--gold)" }} />
          <div><div className="lab">Jornada</div><b>Tudo concluído! 🎉</b></div>
        </div>
      )}
    </header>
  );
}

/* ---------- Um passo da timeline ---------- */
function TimelineStep({ step, index, status, isOpen, onToggle, onComplete }) {
  const Body = STEP_COMPONENTS[step.key];
  const badge = BADGE[status];
  const clickable = status !== "locked";
  return (
    <div className={"tstep tstep--" + status}>
      <div className="tstep__rail">
        <div className="tstep__node">
          {status === "done" ? <Icon name="check" size={22} /> : index + 1}
        </div>
        <div className="tstep__line" />
      </div>

      <div className="tcard">
        <div className="tcard__head" aria-disabled={!clickable}
             onClick={() => clickable && onToggle()}>
          <div className="tcard__ic"><Icon name={step.icon} size={22} /></div>
          <div className="tcard__tt">
            <h3>{step.title}</h3>
            <p>{step.sub}</p>
          </div>
          <span className={"tcard__badge " + badge.cls}>{badge.txt}</span>
          {status === "locked"
            ? <Icon name="lock" size={18} style={{ color: "var(--faint)" }} />
            : <Icon name="chevron" size={20} className="tcard__chev" data-open={isOpen} />}
        </div>

        {isOpen && clickable && (
          <div className="tcard__body">
            <div className="tcard__body-inner">
              {step.key === "pronto"
                ? <Body />
                : <Body onComplete={onComplete} />}
            </div>
          </div>
        )}
      </div>
    </div>
  );
}

/* ---------- Capa de abertura (hero full-screen, foto randômica) ---------- */
function Cover({ onEnter }) {
  // escolhe uma capa aleatória uma vez por carga
  const cover = React.useMemo(() => COVERS[Math.floor(Math.random() * COVERS.length)], []);
  const [jaInscrito, setJaInscrito] = React.useState(false);
  const [buscando, setBuscando] = React.useState(false);
  const [erro, setErro] = React.useState("");
  const buscar = async (e) => {
    e.preventDefault();
    const termo = e.target.elements.numeroInscricao.value.trim();
    setErro(""); setBuscando(true);
    try {
      const insc = await SEIAdapter.buscarInscricao(termo);
      if (!insc) { setErro("Não encontramos uma inscrição com esses dados. Confira o número/CPF."); setBuscando(false); return; }
      onEnter({ inscricao: insc });
    } catch {
      setErro("Não foi possível buscar agora. Tente novamente em instantes.");
      setBuscando(false);
    }
  };
  return (
    <div className="cover-screen" style={{ backgroundImage: `url("${cover}")` }}>
      <div className="cover-scrim" />
      <div className="cover-top">
        <img className="cover-logo" src="assets/esup-logo-white.png" alt="Faculdade ESUP" />
        <span className="cover-pill"><span className="cover-dot" /> Inscrições abertas</span>
      </div>

      <div className="cover-content">
        <div className="jhead__eyebrow">Vestibular 2026.2 · Goiânia</div>
        <h1 className="cover-title">Sua vez de<br /><span className="kw">protagonizar.</span></h1>
        <p className="cover-sub">Inscreva-se no <b>Vestibular 2026.2</b> da ESUP e acompanhe cada etapa em um só lugar — da inscrição à prova, do resultado à matrícula. Você sempre sabe onde está e qual é o próximo passo.</p>
        <div className="hairline cover-hairline" />

        {!jaInscrito ? (
          <React.Fragment>
            <div className="cover-actions">
              <button className="btn btn--solid btn--lg" onClick={() => onEnter()}>Fazer minha inscrição <Icon name="arrow" size={18} className="arw" /></button>
              <button className="btn btn--ghost" onClick={() => setJaInscrito(true)}>Já estou inscrito</button>
            </div>
            <div className="cover-chips">
              {CURSOS_CHIPS.map((c) => <span key={c} className="cover-chip">{c}</span>)}
            </div>
          </React.Fragment>
        ) : (
          <form className="cover-login" onSubmit={buscar}>
            <label className="cover-login__label">Número de inscrição ou CPF</label>
            <div className="cover-login__row">
              <input name="numeroInscricao" className="cover-login__input" placeholder="Nº da inscrição ou 000.000.000-00" required autoFocus disabled={buscando} />
              <button type="submit" className="btn btn--solid btn--lg" disabled={buscando}>
                {buscando ? "Buscando…" : <React.Fragment>Acessar minha jornada <Icon name="arrow" size={18} className="arw" /></React.Fragment>}
              </button>
            </div>
            {erro && <div className="cover-login__erro">{erro}</div>}
            <button type="button" className="cover-login__back" onClick={() => { setJaInscrito(false); setErro(""); }}>← Voltar</button>
          </form>
        )}
      </div>
    </div>
  );
}

/* ---------- App ---------- */
function iniciaisDe(nome) {
  const p = (nome || "").trim().split(/\s+/);
  return ((p[0]?.[0] || "") + (p.length > 1 ? p[p.length - 1][0] : "")).toUpperCase();
}

function App() {
  const [entered, setEntered] = React.useState(false);
  const [current, setCurrent] = React.useState(0);
  const [openKey, setOpenKey] = React.useState("visita");
  const [candidato, setCandidato] = React.useState(null); // null = visitante novo, sem identidade

  const advance = (data) => {
    // a etapa de inscrição envia { nome, numeroInscricao } e passamos a identificar o candidato
    if (data && data.nome) {
      setCandidato({ nome: data.nome, iniciais: iniciaisDe(data.nome), numeroInscricao: data.numeroInscricao || "" });
    }
    const next = Math.min(current + 1, STEPS.length - 1);
    setCurrent(next);
    setOpenKey(STEPS[next].key);
    window.scrollTo({ top: 0, behavior: "smooth" });
  };

  // Entrada: nova inscrição (info vazio) ou retorno de quem já é inscrito (info.inscricao)
  const entrar = (info) => {
    if (info && info.inscricao) {
      const i = info.inscricao;
      setCandidato({ nome: i.candidato.nome, iniciais: iniciaisDe(i.candidato.nome), numeroInscricao: i.codigo });
      const stepKey = window.SEIAdapter ? SEIAdapter.etapaAtualDe(i) : "prova";
      const idx = STEPS.findIndex((s) => s.key === stepKey);
      setCurrent(idx > 0 ? idx : 1);
      setOpenKey(stepKey);
    }
    setEntered(true);
  };

  if (!entered) return <Cover onEnter={entrar} />;

  return (
    <React.Fragment>
      <div className="topbar">
        <img className="topbar__logo" src="assets/esup-logo-white.png" alt="ESUP" />
        {candidato && (
          <div className="topbar__right">
            <div className="topbar__who">
              <b>{candidato.nome}</b>
              <span>{candidato.numeroInscricao ? `Inscrição ${candidato.numeroInscricao}` : "Inscrição em andamento"}</span>
            </div>
            <div className="topbar__avatar">{candidato.iniciais}</div>
          </div>
        )}
      </div>

      <main className="page">
        <div className="wrap">
          <StatusHeader current={current} candidato={candidato} />
          <div className="timeline">
            {STEPS.map((step, i) => {
              const status = statusOf(i, current);
              return (
                <TimelineStep
                  key={step.key}
                  step={step}
                  index={i}
                  status={status}
                  isOpen={openKey === step.key && status !== "locked"}
                  onToggle={() => setOpenKey(openKey === step.key ? null : step.key)}
                  onComplete={advance}
                />
              );
            })}
          </div>
        </div>
      </main>
    </React.Fragment>
  );
}

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