/* ============================================================
   IRONLOG — Sections 1: Hero (Before/After), Goal, PRs
   ============================================================ */

/* ---------- helpers ---------- */
function parseMDY(s) { const [m,d,y] = s.split("/").map(Number); return new Date(y, m-1, d); }
function daysBetween(a, b) { return Math.round(Math.abs(parseMDY(b) - parseMDY(a)) / 86400000); }

/* ============================================================
   HERO — Before / After transformation
   ============================================================ */
function Hero({ data, admin, onUpdate, onUploadImage, onRemoveImage }) {
  const { before, after } = data;
  const [edit, setEdit] = useState(null); // 'before' | 'after' | null
  const bwUnit = after.bwUnit || before.bwUnit || "kg";
  const rawDelta = (after.bodyweightKg || 0) - (before.bodyweightKg || 0);
  const deltaSign = rawDelta < 0 ? "−" : "+";
  const deltaMag = Math.abs(rawDelta);
  const days = daysBetween(before.date, after.date);

  return (
    <header id="snapshot" className="section" style={{ paddingTop: "clamp(96px,12vw,150px)" }}>
      <div className="container">
        <Reveal className="hero-top">
          <div className="eyebrow"><span className="tick">●</span>&nbsp;&nbsp;The Ledger · {IRONLOG.profile.federation}</div>
          <h1 className="display hero-h">
            BUILT<span style={{ color: "var(--ox-bright)" }}>.</span> NOT<br/>BORN<span style={{ color: "var(--ox-bright)" }}>.</span>
          </h1>
          <p className="hero-lede muted">
            {IRONLOG.profile.name} — {IRONLOG.profile.discipline}. A running record of every plate added to the bar.
          </p>
        </Reveal>

        <div className="ba-grid">
          <BACol which="before" rec={before} delay={0} admin={admin} onEdit={() => setEdit("before")} onUploadImage={onUploadImage} onRemoveImage={onRemoveImage} />

          {/* center delta seal */}
          <Reveal delay={220} className="ba-delta">
            <div className="ba-delta-inner">
              <div className="eyebrow center" style={{ letterSpacing: "0.3em" }}>The Delta</div>
              <div className="ba-delta-num display">{deltaSign}{deltaMag}<span className="ba-unit">{bwUnit}</span></div>
              <div className="hairline" style={{ margin: "14px auto", maxWidth: 60 }} />
              <div className="ba-delta-days tnum head"><CountUp value={days} /> DAYS</div>
              <div className="muted ba-delta-sub">of staying under the bar</div>
            </div>
          </Reveal>

          <BACol which="after" rec={after} delay={120} admin={admin} onEdit={() => setEdit("after")} onUploadImage={onUploadImage} onRemoveImage={onRemoveImage} />
        </div>
      </div>

      {edit && (
        <BeforeAfterEdit
          which={edit} rec={data[edit]}
          onClose={() => setEdit(null)}
          onSave={(rec) => { onUpdate(edit, rec); setEdit(null); }}
        />
      )}
    </header>
  );
}

function BACol({ which, rec, delay, admin, onEdit, onUploadImage, onRemoveImage }) {
  const images = rec.images && rec.images.length ? rec.images : (rec.image ? [rec.image] : []);
  const imageIds = rec.imageIds || [];
  const [active, setActive] = useState(0);
  const idx = Math.min(active, Math.max(0, images.length - 1));
  const canAdd = images.length < 3;
  return (
    <Reveal delay={delay} className="ba-col">
      <Editable admin={admin} label={"Edit " + which} penPos="tr" onEdit={onEdit}>
        <div className="card ba-card card-hover">
          <div className="ba-tagrow">
            <span className="ba-which display">{which === "before" ? "BEFORE" : "AFTER"}</span>
            <span className="muted tnum ba-date">{rec.date}</span>
          </div>
          <div className="ph ba-img">
            {images.length
              ? <img src={images[idx]} alt={rec.label} style={{ width:"100%", height:"100%", objectFit:"cover" }} />
              : <span className="ph-label">{which} physique</span>}
            {admin && canAdd && (
              <button className="btn btn-ghost ba-upload" onClick={() => { onUploadImage && onUploadImage(which); }}>
                <Icons.Image size={15}/> {images.length ? "Add side pic" : "Upload"}
              </button>
            )}
            {admin && images.length > 0 && (
              <button className="pen ba-img-del" onClick={() => onRemoveImage && onRemoveImage(which, imageIds[idx])} aria-label="Remove this photo"><Icons.Trash size={14}/></button>
            )}
          </div>

          {/* thumbnail strip for the 1–3 side pics */}
          {images.length > 1 && (
            <div className="ba-thumbs">
              {images.map((src, i) => (
                <button key={i} className={"ba-thumb" + (i === idx ? " on" : "")} onClick={() => setActive(i)} aria-label={`Photo ${i + 1}`}>
                  <img src={src} alt="" />
                </button>
              ))}
            </div>
          )}
          {admin && <div className="ba-imgcount dim">{images.length}/3 photos</div>}

          <div className="ba-foot">
            <div>
              <div className="eyebrow" style={{ letterSpacing: "0.22em" }}>Bodyweight</div>
              <div className="ba-bw display tnum">{rec.bodyweightKg}<span className="ba-unit">{rec.bwUnit || "kg"}</span></div>
            </div>
          </div>
        </div>
      </Editable>
    </Reveal>
  );
}

function BeforeAfterEdit({ which, rec, onClose, onSave }) {
  const [date, setDate] = useState(rec.date);
  const [bw, setBw] = useState(rec.bodyweightKg);
  const [unit, setUnit] = useState(rec.bwUnit || "kg");
  const [image, setImage] = useState(rec.image || null);
  const [imageId, setImageId] = useState(rec.imageId || null);
  const [busy, setBusy] = useState(false);
  // convert MM/DD/YYYY <-> yyyy-mm-dd for the picker
  const toISO = (s) => { const [m,d,y] = s.split("/"); return `${y}-${m}-${d}`; };
  const fromISO = (s) => { const [y,m,d] = s.split("-"); return `${m}/${d}/${y}`; };
  async function upload() {
    const picked = await pickImageFile();
    if (!picked) return;
    setBusy(true);
    try {
      const r = await API.upload(picked.dataUrl, { target: "profile", which });
      setImage(r.url); setImageId(r.id);
    } catch (ex) { alert(ex.message || "Upload failed"); }
    finally { setBusy(false); }
  }
  return (
    <Modal title={"Edit " + which} onClose={onClose}
      footer={<>
        <button className="btn" onClick={onClose}>Cancel</button>
        <button className="btn btn-primary" onClick={() => onSave({ ...rec, date, bodyweightKg: Number(bw), bwUnit: unit, image, imageId })}><Icons.Check size={15}/> Save</button>
      </>}>
      <div className="field">
        <label>Date</label>
        <input className="input tnum" type="date" value={toISO(date)} onChange={(e) => setDate(fromISO(e.target.value))} />
      </div>
      <div style={{ display: "grid", gridTemplateColumns: "1fr 120px", gap: 14 }}>
        <div className="field"><label>Bodyweight</label>
          <input className="input tnum" type="number" value={bw} onChange={(e) => setBw(e.target.value)} /></div>
        <div className="field"><label>Unit</label>
          <select className="select" value={unit} onChange={(e) => setUnit(e.target.value)}>
            <option value="lbs">lbs</option><option value="kg">kg</option>
          </select>
        </div>
      </div>
      <div className="field" style={{ marginBottom: 0 }}>
        <label>Photo</label>
        <div className="ph" style={{ height: 150, borderRadius: 7, overflow: "hidden" }}>
          {image
            ? <img src={image} alt={which} style={{ width: "100%", height: "100%", objectFit: "cover" }} />
            : <span className="ph-label">no image · {which}</span>}
        </div>
        <button type="button" className="btn" style={{ marginTop: 10 }} onClick={upload} disabled={busy}>
          <Icons.Image size={15}/> {busy ? "Uploading…" : (image ? "Replace photo" : "Upload photo")}
        </button>
      </div>
    </Modal>
  );
}

/* ============================================================
   GOAL — manifesto banner
   ============================================================ */
function Goal({ data, admin, onUpdate }) {
  const [edit, setEdit] = useState(false);
  return (
    <section id="goal" className="goal-band">
      <div className="goal-rule" />
      <div className="container">
        <Reveal>
          <Editable admin={admin} label="Edit goal" penPos="tr" onEdit={() => setEdit(true)}>
            <div className="goal-inner">
              <div className="eyebrow center" style={{ letterSpacing: "0.4em", marginBottom: 18 }}>The Mandate</div>
              <h2 className="display goal-h">{data.headline}</h2>
              <p className="goal-sub muted">{data.sub}</p>
            </div>
          </Editable>
        </Reveal>
      </div>
      <div className="goal-rule" />
      {edit && (
        <Modal title="Edit goal" onClose={() => setEdit(false)}
          footer={null}>
          <GoalForm data={data} onCancel={() => setEdit(false)} onSave={(d) => { onUpdate(d); setEdit(false); }} />
        </Modal>
      )}
    </section>
  );
}
function GoalForm({ data, onCancel, onSave }) {
  const [h, setH] = useState(data.headline);
  const [s, setS] = useState(data.sub);
  return (
    <>
      <div className="field"><label>Headline</label><input className="input" value={h} onChange={(e)=>setH(e.target.value)} /></div>
      <div className="field"><label>Supporting line</label><textarea className="textarea" value={s} onChange={(e)=>setS(e.target.value)} /></div>
      <div style={{ display:"flex", gap:12, justifyContent:"flex-end" }}>
        <button className="btn" onClick={onCancel}>Cancel</button>
        <button className="btn btn-primary" onClick={() => onSave({ headline: h, sub: s })}><Icons.Check size={15}/> Save</button>
      </div>
    </>
  );
}

/* ============================================================
   PERSONAL RECORDS
   ============================================================ */
function PRCard({ pr, big, admin, onEdit, onDelete, onOpen, pulse }) {
  const delta = pr.trend.length > 1 ? pr.value - pr.trend[0] : 0;
  const open = () => onOpen && onOpen(pr);
  return (
    <div className={"pr-cell" + (admin ? " hl" : "") + (pulse ? " pr-pulse" : "")} style={{ position: "relative" }}>
      <div className={"card card-hover pr-card pr-clickable" + (big ? " pr-big" : "") + (pr.isNew ? " pr-new" : "")}
        role="button" tabIndex={0} onClick={open}
        onKeyDown={(e) => { if (e.key === "Enter" || e.key === " ") { e.preventDefault(); open(); } }}
        aria-label={"Open " + pr.lift + " details"}>
        <div className="pr-top">
          <span className="pr-name head">{pr.lift}</span>
          {pr.isNew && <span className="tag tag-pr">New PR</span>}
        </div>
        <div className="pr-numrow">
          <span className={"display pr-num" + (big ? "" : " pr-num-sm")}>
            <CountUp value={pr.value} />
          </span>
          <span className="pr-unit head">{pr.unit}</span>
        </div>
        <div className="pr-foot">
          <div className="pr-trend">
            <Sparkline data={pr.trend} w={big ? 110 : 84} h={big ? 34 : 28} />
            {delta !== 0 && <span className="pr-delta head"><Icons.Arrow size={12} /> {delta > 0 ? "+" : "−"}{Math.abs(delta)} since</span>}
          </div>
          <span className="dim pr-updated tnum">{pr.updated}</span>
        </div>

        {/* maximize affordance — pulses on one card to invite the click */}
        <span className="pr-maximize" aria-hidden="true"><Icons.Maximize size={14}/> Maximize</span>

        {admin && (
          <div className="pr-admin-actions" onClick={(e) => e.stopPropagation()}>
            <button className="pen pen-sm" onClick={onEdit} aria-label={"Edit " + pr.lift}><Icons.Pen /></button>
            <button className="pen pen-sm" onClick={() => onDelete && onDelete(pr.id)} aria-label={"Delete " + pr.lift}><Icons.Trash /></button>
          </div>
        )}
      </div>
    </div>
  );
}

/* ---------- PR maximize: big chart + fresh AI summary ---------- */
function PRMaximize({ pr, onClose }) {
  const [summary, setSummary] = useState("");
  const [loading, setLoading] = useState(true);
  const [err, setErr] = useState("");
  const points = (pr.history && pr.history.length ? pr.history : (pr.trend || []).map((v, i) => ({ value: v, date: "" })));
  const delta = points.length > 1 ? pr.value - points[0].value : 0;
  const firstDate = pr.startDate || (points[0] && points[0].date) || pr.updated;

  useEffect(() => {
    let alive = true;
    setLoading(true); setErr("");
    // Fresh summary every time the modal opens (nonce busts any caching).
    API.prSummary(pr.id).then((r) => { if (alive) { setSummary(r.summary || ""); setLoading(false); } })
      .catch((e) => { if (alive) { setErr(e.message || "Summary unavailable."); setLoading(false); } });
    return () => { alive = false; };
  }, [pr.id]);

  return (
    <Modal title={pr.lift} onClose={onClose} maxWidth={900}>
      <div className="prmax">
        <div className="prmax-head">
          <div className="prmax-bignum display tnum">{pr.value}<span className="prmax-unit">{pr.unit}</span></div>
          <div className="prmax-meta">
            <div className="prmax-meta-row"><span className="eyebrow">First recorded</span><span className="tnum">{firstDate}</span></div>
            <div className="prmax-meta-row"><span className="eyebrow">Latest</span><span className="tnum">{pr.updated}</span></div>
            <div className="prmax-meta-row"><span className="eyebrow">Total change</span><span className="tnum">{delta >= 0 ? "+" : "−"}{Math.abs(delta)} {pr.unit}</span></div>
            <div className="prmax-meta-row"><span className="eyebrow">Data points</span><span className="tnum">{points.length}</span></div>
          </div>
        </div>

        <div className="prmax-chart-wrap">
          <div className="prmax-chart-label eyebrow">Progression · day per day (training days only)</div>
          <DayChart points={points} unit={pr.unit} height={280} />
          <div className="dim" style={{ fontSize: 12, marginTop: 6 }}>Hover a node to read the exact lift and date.</div>
        </div>

        <div className="prmax-summary">
          <div className="prmax-summary-head">
            <span className="chat-avatar display" style={{ width: 34, height: 34, fontSize: 12 }}>AI</span>
            <div>
              <div className="head" style={{ letterSpacing: "0.08em" }}>COACH'S READ</div>
              <div className="chat-status"><span className="chat-dot" /> Fresh analysis</div>
            </div>
          </div>
          {loading ? (
            <div className="prmax-loading">
              <div className="bubble bubble-ai typing"><span/><span/><span/></div>
              <span className="muted" style={{ marginLeft: 10 }}>Reading your numbers…</span>
            </div>
          ) : err ? (
            <p className="muted">{err}</p>
          ) : (
            <RichText text={summary} className="prmax-summary-text" />
          )}
        </div>
      </div>
    </Modal>
  );
}

function PRs({ main, other, admin, onSavePR, onAddPR, onDeletePR }) {
  const [editing, setEditing] = useState(null); // pr obj or {new:true} or {new:true, category}
  const [maxed, setMaxed] = useState(null); // pr being maximized
  const open = (pr) => setEditing(pr);
  // Pulse the newest main PR (or the first) to invite the maximize click.
  const pulseId = (main.find((p) => p.isNew) || main[0] || {}).id;
  return (
    <section id="prs" className="section">
      <div className="container">
        <Reveal className="section-head">
          <div>
            <div className="section-index">03 — THE NUMBERS</div>
            <h2 className="section-title">Personal<br/>Records</h2>
          </div>
          <div style={{ maxWidth: 340 }}>
            <p className="muted" style={{ margin: 0 }}>Every figure is a tested max, logged and dated. <b style={{ color: "var(--chalk)" }}>Tap any card</b> to maximize it — full day-by-day graph and a fresh coach breakdown.</p>
            {admin && <button className="btn btn-primary" style={{ marginTop: 16 }} onClick={() => open({ new: true, category: "main" })}><Icons.Plus size={15}/> Add main lift</button>}
          </div>
        </Reveal>

        <Reveal className="pr-grid pr-grid-main">
          {main.map((pr) => <PRCard key={pr.id} pr={pr} big admin={admin} pulse={pr.id === pulseId}
            onOpen={setMaxed} onEdit={() => open(pr)} onDelete={onDeletePR} />)}
        </Reveal>

        <Reveal className="pr-divider">
          <span className="eyebrow">Accessory &amp; Hypertrophy</span>
          <span className="hairline grow" />
          {admin && <button className="btn btn-ghost" style={{ marginLeft: 12 }} onClick={() => open({ new: true, category: "other" })}><Icons.Plus size={14}/> Add</button>}
        </Reveal>

        <Reveal className="pr-grid pr-grid-other">
          {other.map((pr) => <PRCard key={pr.id} pr={pr} admin={admin}
            onOpen={setMaxed} onEdit={() => open(pr)} onDelete={onDeletePR} />)}
        </Reveal>
      </div>

      {editing && (
        <PREdit pr={editing.new ? null : editing}
          onClose={() => setEditing(null)}
          onDelete={onDeletePR ? (id) => { onDeletePR(id); setEditing(null); } : null}
          onSave={(p) => { editing.new ? onAddPR({ ...p, category: editing.category || "other" }) : onSavePR(p); setEditing(null); }} />
      )}

      {maxed && <PRMaximize pr={maxed} onClose={() => setMaxed(null)} />}
    </section>
  );
}

function PREdit({ pr, onClose, onSave, onDelete }) {
  const isNew = !pr;
  const [lift, setLift] = useState(pr ? pr.lift : "");
  const [value, setValue] = useState(pr ? pr.value : "");
  const [unit, setUnit] = useState(pr ? pr.unit : "lbs");
  return (
    <Modal title={isNew ? "Add lift" : "Edit " + pr.lift} onClose={onClose}
      footer={<>
        {!isNew && onDelete && <button className="btn btn-danger" style={{ marginRight: "auto" }} onClick={() => onDelete(pr.id)}><Icons.Trash size={15}/> Delete</button>}
        <button className="btn" onClick={onClose}>Cancel</button>
        <button className="btn btn-primary" disabled={!lift || value === ""}
          onClick={() => onSave({
            ...(pr || { id: "pr-" + Date.now(), trend: [Number(value)], isNew: true, updated: new Date().toLocaleDateString("en-US") }),
            lift, value: Number(value), unit,
          })}><Icons.Check size={15}/> {isNew ? "Add" : "Save"}</button>
      </>}>
      <div className="field"><label>Lift name</label><input className="input" value={lift} onChange={(e)=>setLift(e.target.value)} placeholder="e.g. Pause Bench" /></div>
      <div style={{ display: "grid", gridTemplateColumns: "1fr 120px", gap: 14 }}>
        <div className="field"><label>Current PR</label><input className="input tnum" type="number" value={value} onChange={(e)=>setValue(e.target.value)} /></div>
        <div className="field"><label>Unit</label>
          <select className="select" value={unit} onChange={(e)=>setUnit(e.target.value)}>
            <option value="lbs">lbs</option><option value="kg">kg</option>
          </select>
        </div>
      </div>
    </Modal>
  );
}

Object.assign(window, { Hero, Goal, PRs });
