/* ============================================================
   MUIY 2.0 — Chelation adherence · check-in, doses, streak
   Loads AFTER health.jsx, BEFORE shell.jsx. Exports to window.
   Reads scheduled-dose logic via TC.adherence; mutates via store.
   ============================================================ */

const ADH = () => window.TC.adherence;

/* a soft completion dot-row — the calm streak visual (no flames, no counters) */
function DotRow({ total = 7, filled = 0, color = 'var(--green)' }) {
  return (
    <div style={{ display: 'flex', gap: 6, alignItems: 'center' }}>
      {Array.from({ length: total }, (_, i) => (
        <span key={i} style={{
          width: 9, height: 9, borderRadius: 999, flex: 'none',
          background: i < filled ? color : 'var(--hairline-2)',
          boxShadow: i < filled ? `0 0 0 3px ${color}22` : 'none',
          transition: 'background .3s, box-shadow .3s',
        }} />
      ))}
    </div>
  );
}

/* the small sprout companion used across adherence (reuses ui.jsx Companion) */
function AdhSprout({ size = 44, color = 'var(--green)', wash = 'var(--green-wash)' }) {
  return <Companion size={size} color={color} wash={wash} />;
}

/* ---- helpers shared by the cards ---- */
function medLabel(medId, store) {
  const m = (store.patient.medications || []).find((x) => x.id === medId);
  if (!m) return { brand: 'Medication', abbr: '', color: 'var(--orange)', wash: 'var(--orange-wash)' };
  const chel = TC.findChelator(m.brand);
  return { med: m, brand: m.brand || m.name, abbr: (chel && chel.abbr) || '', color: 'var(--orange)', wash: 'var(--orange-wash)' };
}

/* ============================================================
   HOME DAILY CHECK-IN  (Today screen)
   Two variants behind a flag: single-question (default) · per-dose chips.
   ============================================================ */
function HomeCheckin({ store, variant, onOpenSkip }) {
  const meds = ADH().chelationMeds(store.patient.medications);
  const sched = ADH().scheduledFor(TC.dayIndexToStr(TC.todayIndex()), meds);
  if (!sched.length) return null;

  const log = store.data.chelationLog || {};
  const doneCount = sched.filter((s) => log[s.key]).length;
  const takenCount = sched.filter((s) => { const e = log[s.key]; return e && e.status === 'taken'; }).length;
  const allDone = doneCount === sched.length;
  const next = sched.find((s) => !log[s.key]);

  const logTaken = (s) => store.logDose({ medId: s.medId, slot: s.slot, dateStr: TC.dayIndexToStr(TC.todayIndex()), status: 'taken' });

  // ---- all logged → calm confirmation ----
  if (allDone) {
    return (
      <div className="checkin stagger">
        <span className="checkin-bar" style={{ background: 'linear-gradient(180deg,var(--green-2),var(--green))' }} />
        <div className="checkin-done">
          <span style={{ width: 44, height: 44, flex: 'none', borderRadius: '50%', background: 'var(--green-wash)', display: 'grid', placeItems: 'center', boxShadow: '0 2px 8px rgba(20,30,25,.06)' }}><Icon name="check" size={22} color="var(--green)" sw={2.6} /></span>
          <div className="checkin-done-tx">
            <div className="checkin-done-t">Chelation logged for today</div>
            <div className="checkin-done-s">{takenCount === sched.length ? 'Every scheduled dose — nicely consistent.' : `${takenCount} of ${sched.length} taken. Tomorrow’s a fresh start.`}</div>
          </div>
        </div>
        <button className="checkin-link" onClick={() => store.goHealth('chelation')}>See your streak &amp; insights<Icon name="chevR" size={14} color="var(--orange)" /></button>
      </div>
    );
  }

  // ---- variant B: one chip per dose ----
  if (variant === 'chips') {
    return (
      <div className="checkin stagger">
        <span className="checkin-bar" />
        <div className="checkin-head">
          <span className="checkin-leaf"><Icon name="pill" size={19} color="var(--orange)" /></span>
          <div>
            <div className="checkin-eyebrow">Today’s chelation{sched.length > 1 ? ` · ${doneCount}/${sched.length}` : ''}</div>
            <div className="checkin-q">Have you taken your doses?</div>
          </div>
        </div>
        <div className="checkin-chips">
          {sched.map((s) => {
            const ml = medLabel(s.medId, store);
            const e = log[s.key]; const taken = e && e.status === 'taken'; const skipped = e && e.status === 'skipped';
            return (
              <div key={s.key} className={'checkin-chip' + (taken ? ' done' : '')}>
                <span className="checkin-chip-leaf" style={{ background: taken ? 'transparent' : ml.wash, color: ml.color }}>
                  <Icon name={ADH().SLOT_ICON[s.slot] || 'pill'} size={16} color={taken ? 'var(--success)' : ml.color} />
                </span>
                <div className="checkin-chip-mid">
                  <div className="checkin-chip-n">{ml.brand} · {s.slot}</div>
                  <div className="checkin-chip-s">{taken ? 'Taken' : skipped ? 'Skipped' : `Due ${s.time}`}</div>
                </div>
                {taken ? (
                  <span className="checkin-chip-tick"><Icon name="check" size={14} color="#fff" sw={3} /></span>
                ) : skipped ? (
                  <button className="checkin-chip-undo" onClick={() => store.clearDose(s.key)}>Undo</button>
                ) : (
                  <button className="checkin-chip-take" onClick={() => logTaken(s)} aria-label="Mark taken">
                    <Icon name="check" size={16} color="#fff" sw={3} />
                  </button>
                )}
              </div>
            );
          })}
        </div>
      </div>
    );
  }

  // ---- variant A (default): single primary question ----
  const ml = medLabel(next.medId, store);
  const multi = sched.length > 1;
  return (
    <div className="checkin stagger">
      <span className="checkin-bar" />
      <div className="checkin-head">
        <span className="checkin-leaf"><Icon name="pill" size={19} color="var(--orange)" /></span>
        <div>
          <div className="checkin-eyebrow">Today’s chelation{multi ? ` · ${doneCount}/${sched.length}` : ''}</div>
          <div className="checkin-q">{multi ? 'Have you taken your scheduled dose?' : 'Did you take your chelator today?'}</div>
        </div>
      </div>
      <div className="checkin-sub">{ml.brand} · {next.slot.toLowerCase()} dose, due {next.time}.</div>
      <div className="checkin-actions">
        <button className="checkin-take" onClick={() => logTaken(next)}>
          <Icon name="check" size={17} color="#fff" sw={2.8} />Taken
        </button>
        <button className="checkin-skip" onClick={() => onOpenSkip(next)}>Skip</button>
      </div>
    </div>
  );
}

/* ============================================================
   TODAY'S DOSES CARD  (Chelation tab) + skip sheet
   ============================================================ */
function DoseRow({ store, s }) {
  const ml = medLabel(s.medId, store);
  const e = (store.data.chelationLog || {})[s.key];
  const taken = e && e.status === 'taken';
  const skipped = e && e.status === 'skipped';
  const justLogged = e && e._fresh;
  const onTaken = () => store.logDose({ medId: s.medId, slot: s.slot, dateStr: TC.dayIndexToStr(TC.todayIndex()), status: 'taken' });
  return (
    <div className="dose-row">
      <span className="dose-leaf" style={{ background: ml.wash, color: ml.color }}><Icon name="pill" size={18} color={ml.color} /></span>
      <div className="dose-mid">
        <div className="dose-name">{ml.brand}{ml.abbr ? <span className="dose-gen">{ml.abbr}</span> : null}</div>
        <div className="dose-meta"><Icon name={ADH().SLOT_ICON[s.slot] || 'clock'} size={12.5} color="var(--ink-3)" /><span>{s.slot} · {s.time}</span></div>
      </div>
      {taken ? (
        <button className={'dose-state taken' + (justLogged ? ' pop' : '')} onClick={() => store.clearDose(s.key)} title="Tap to undo">
          <Icon name="check" size={15} color="var(--success)" sw={2.8} /><span>Taken</span>
        </button>
      ) : skipped ? (
        <button className="dose-state skipped" onClick={() => store.clearDose(s.key)} title="Tap to undo">
          <span>Skipped</span><Icon name="refresh" size={13} color="var(--ink-3)" />
        </button>
      ) : (
        <div className="dose-actions">
          <button className="dose-skip" onClick={() => store.openModal('skipDose', { slot: s })}>Skip</button>
          <button className="dose-take" onClick={onTaken}><Icon name="check" size={15} color="#fff" sw={2.8} />Taken</button>
        </div>
      )}
    </div>
  );
}

function TodayDosesCard({ store }) {
  const meds = ADH().chelationMeds(store.patient.medications);
  const sched = ADH().scheduledFor(TC.dayIndexToStr(TC.todayIndex()), meds);
  const log = store.data.chelationLog || {};
  const done = sched.filter((s) => log[s.key]).length;
  const allDone = sched.length > 0 && done === sched.length;
  const taken = sched.filter((s) => { const e = log[s.key]; return e && e.status === 'taken'; }).length;

  return (
    <div className="card adh-today">
      <div className="between" style={{ marginBottom: 4 }}>
        <div>
          <div className="adh-today-k">Today · {TC.fmtDate(TC.now(), { weekday: 'short', day: 'numeric', month: 'short' })}</div>
          <div className="adh-today-h">{allDone ? 'All doses logged' : 'Your chelation doses'}</div>
        </div>
        <div className="adh-today-prog"><span className="num">{done}</span><span className="adh-today-prog-d">/{sched.length}</span></div>
      </div>
      <div className="dose-list">
        {sched.map((s) => <DoseRow key={s.key} store={store} s={s} />)}
      </div>
      {allDone && (
        <div className="adh-today-foot">
          <AdhSprout size={30} />
          <span>{taken === sched.length ? 'Every dose logged today — gently done.' : 'Logged for today. Tomorrow is a fresh start.'}</span>
        </div>
      )}
    </div>
  );
}

function SkipDoseSheet({ store, close, slot }) {
  const ml = medLabel(slot.medId, store);
  const [reason, setReason] = React.useState(null);
  const [note, setNote] = React.useState('');
  const save = () => {
    store.logDose({ medId: slot.medId, slot: slot.slot, dateStr: TC.dayIndexToStr(TC.todayIndex()), status: 'skipped', skipReason: reason || 'Other', note });
    close();
  };
  return (
    <MSheet title="Mark as skipped" onClose={close}>
      <p className="body" style={{ margin: '0 0 16px' }}>
        {ml.brand}, {slot.slot.toLowerCase()} dose. No worries — noting why just helps you spot patterns later.
      </p>
      <div className="skip-opts">
        {ADH().SKIP_REASONS.map((r) => (
          <button key={r} className={'skip-opt' + (reason === r ? ' on' : '')} onClick={() => setReason(r)}>
            <span>{r}</span>
            <span className="skip-tick">{reason === r && <Icon name="check" size={12} color="#fff" sw={3} />}</span>
          </button>
        ))}
      </div>
      <textarea className="textarea" style={{ marginTop: 14 }} rows={2} placeholder="Add a note (optional)" value={note} onChange={(e) => setNote(e.target.value)} />
      <button className="btn btn-primary" style={{ width: '100%', marginTop: 16, opacity: reason ? 1 : 0.55 }} disabled={!reason} onClick={save}>Save</button>
    </MSheet>
  );
}

/* ============================================================
   GENTLE CONSISTENCY STREAK  (Chelation tab + Today stat)
   Paused (never "broken") on a miss. No red, no failure language.
   ============================================================ */
function StreakCard({ store }) {
  const meds = ADH().chelationMeds(store.patient.medications);
  const log = store.data.chelationLog || {};
  const streak = ADH().streak(log, meds);
  const best = ADH().longestStreak(log, meds);
  const last7 = ADH().windowStats(log, meds, 7);
  const paused = streak === 0;
  const accent = paused ? 'var(--waiting)' : 'var(--green)';
  const wash = paused ? 'var(--waiting-wash)' : 'var(--green-wash)';
  const days = Math.round(streak / Math.max(1, ADH().scheduledFor(TC.dayIndexToStr(TC.todayIndex()), meds).length));

  return (
    <div className="streak-card" style={{ background: wash }}>
      <span className="streak-bar" style={{ background: accent }} />
      <div className="streak-top">
        <AdhSprout size={46} color={accent} wash="var(--surface)" />
        <div style={{ flex: 1, minWidth: 0 }}>
          <div className="streak-lead" style={{ color: accent }}>{paused ? 'Streak paused' : 'Consistency streak'}</div>
          <div className="streak-big num">
            {paused ? 'A fresh start' : streak}
            {!paused && <span className="streak-unit">{streak === 1 ? 'dose' : 'doses'} in a row{days >= 2 ? ` · ${days}-day` : ''}</span>}
          </div>
        </div>
      </div>
      <p className="streak-line">
        {paused
          ? 'Your streak is paused. Every dose is a new opportunity.'
          : `Nice work staying consistent. You’ve logged ${streak} scheduled ${streak === 1 ? 'dose' : 'doses'} in a row.`}
      </p>
      <div className="streak-foot">
        <DotRow total={7} filled={Math.min(7, paused ? last7.taken % 8 : streak)} color={accent} />
        <span className="streak-best">Best: {best} in a row</span>
      </div>
    </div>
  );
}

/* ---- gentle "drifting sprout" feedback on a successful 'taken' log ----
   Appends a one-shot sprite to the app frame; the CSS keyframe self-removes
   visually and we clean up the node. Fully gated behind prefers-reduced-motion. */
function tcCelebrate() {
  try {
    if (window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches) return;
    const host = document.querySelector('.app-frame') || document.body;
    const el = document.createElement('div');
    el.className = 'float-sprite';
    el.innerHTML = '<svg width="38" height="38" viewBox="0 0 24 24" fill="none"><circle cx="12" cy="12" r="11" fill="var(--success-wash)"/><path d="M12 17c0-3 0-5 0-6" stroke="#65B017" stroke-width="2" stroke-linecap="round"/><path d="M12 11c-2.2 0-3.6-1.4-3.6-3.4C10.6 7.6 12 9 12 11zM12 12.5c1.9 0 3.1-1.2 3.1-3-1.9 0-3.1 1.2-3.1 3z" fill="#65B017"/></svg>';
    host.appendChild(el);
    setTimeout(() => { el.remove(); }, 1600);
  } catch (e) {}
}

Object.assign(window, { DotRow, AdhSprout, HomeCheckin, DoseRow, TodayDosesCard, SkipDoseSheet, StreakCard, tcCelebrate });
