// khao.jsx — Khảo khoá: bộ bài tập Dịch lý soạn sẵn theo cảnh giới, mỗi ngày 3 câu, đúng cả 3 mới thông qua (sai một câu → làm bộ khác).
// Câu sinh từ dữ liệu quẻ có sẵn (bát quái, 64 quẻ, hào động, quẻ hỗ, Thể–Dụng) theo seed ngày — không cần soạn tay, không lặp.
// Exports to window: KHAO_LOAI, ttKhaoCau, ttKhaoLoaiMo, KhaoKhoa, TT_KHAO_SO

const TT_KHAO_SO = 3;
const KHAO_LOAI = [
  { k: 'quai', tier: 0, ten: 'Nhận mặt bát quái' },
  { k: 'tuong', tier: 0, ten: 'Tượng quái' },
  { k: 'hanh', tier: 0, ten: 'Ngũ hành quái' },
  { k: 'ghep', tier: 1, ten: 'Ghép quẻ' },
  { k: 'tach', tier: 1, ten: 'Tách quẻ' },
  { k: 'kw', tier: 1, ten: 'Tượng quẻ' },
  { k: 'bien', tier: 2, ten: 'Hào động → quẻ biến' },
  { k: 'ho', tier: 2, ten: 'Quẻ hỗ' },
  { k: 'theDung', tier: 3, ten: 'Thể–Dụng sinh khắc' },
];
function ttKhaoLoaiMo(tier) { return KHAO_LOAI.filter(l => l.tier <= tier); }

function kSeed(str) { let h = 2166136261; for (const c of String(str)) { h ^= c.charCodeAt(0); h = Math.imul(h, 16777619); } return h >>> 0; }
function kRng(seed) { let a = seed >>> 0; return () => { a |= 0; a = a + 0x6D2B79F5 | 0; let t = Math.imul(a ^ a >>> 15, 1 | a); t = t + Math.imul(t ^ t >>> 7, 61 | t) ^ t; return ((t ^ t >>> 14) >>> 0) / 4294967296; }; }

const K_TRI = ['Kiền', 'Đoài', 'Ly', 'Chấn', 'Tốn', 'Khảm', 'Cấn', 'Khôn'];
const K_HANH = ['Kim', 'Mộc', 'Thủy', 'Hỏa', 'Thổ'];
const K_TD = ['Dụng sinh Thể · cát', 'Thể khắc Dụng · tốt', 'Tỵ hoà · bình', 'Thể sinh Dụng · hao', 'Dụng khắc Thể · hung'];
const K_TD_KEY = { cat: 0, tot: 1, binh: 2, hao: 3, hung: 4 };

// tier: cảnh giới (0–3); day/lan/idx: seed — cùng ngày, cùng lượt, cùng số câu thì ra cùng câu (tải lại trang không đổi đề)
function ttKhaoCau(tier, day, lan, idx) {
  const rng = kRng(kSeed(`${day}|${lan}|${idx}`));
  const pick = arr => arr[Math.floor(rng() * arr.length)];
  const mo = ttKhaoLoaiMo(Math.max(0, Math.min(3, tier)));
  const pool = mo.concat(mo.filter(l => l.tier === tier)); // bậc mới mở ra nhiều hơn
  const loai = pool[Math.floor(rng() * pool.length)];
  const lua = (dung, nguon) => { const s = new Set([dung]); const src = nguon.filter(x => x !== dung); while (s.size < 4 && src.length) { const i = Math.floor(rng() * src.length); s.add(src.splice(i, 1)[0]); } const arr = [...s]; for (let i = arr.length - 1; i > 0; i--) { const j = Math.floor(rng() * (i + 1)); [arr[i], arr[j]] = [arr[j], arr[i]]; } return arr; };
  const tenHex = HEXAGRAMS.map(h => h.name);
  const T = window.TUONG_TRI || {};
  let c;
  if (loai.k === 'quai') { const tri = pick(K_TRI); c = { hoi: 'Ba vạch này là quái nào?', hinh: { lines: TRI[tri] }, dapAn: tri, lua: lua(tri, K_TRI), giai: `${tri} — tượng ${(T[tri] || {}).tuong || ''}, hành ${TRI_HANH[tri]}.` }; }
  else if (loai.k === 'tuong') { const tri = pick(K_TRI); const tg = t => (T[t] || {}).tuong || t; c = { hoi: `Tượng tự nhiên của quái ${tri} là gì?`, hinh: { lines: TRI[tri] }, dapAn: tg(tri), lua: lua(tg(tri), K_TRI.map(tg)), giai: `${tri} vi ${tg(tri)} · người: ${(T[tri] || {}).nguoi || ''}.` }; }
  else if (loai.k === 'hanh') { const tri = pick(K_TRI); c = { hoi: `Quái ${tri} (${(T[tri] || {}).tuong || ''}) thuộc hành gì?`, hinh: { lines: TRI[tri] }, dapAn: TRI_HANH[tri], lua: lua(TRI_HANH[tri], K_HANH), giai: `Kiền Đoài Kim · Ly Hỏa · Chấn Tốn Mộc · Khảm Thủy · Cấn Khôn Thổ.` }; }
  else if (loai.k === 'ghep') { const h = pick(HEXAGRAMS); c = { hoi: `Thượng ${h.up} · hạ ${h.lo} ghép thành quẻ gì?`, hinh: { lines: hexLines(h) }, dapAn: h.name, lua: lua(h.name, tenHex), giai: `${h.name} — ${h.kw}: ${h.m}` }; }
  else if (loai.k === 'tach') { const h = pick(HEXAGRAMS); const f = x => `thượng ${x.up} · hạ ${x.lo}`; c = { hoi: `Quẻ ${h.name} gồm hai quái nào?`, dapAn: f(h), lua: lua(f(h), HEXAGRAMS.map(f)), giai: `${h.name}: ${f(h)}. Tên quẻ đọc thượng trước, hạ sau.` }; }
  else if (loai.k === 'kw') { const h = pick(HEXAGRAMS); c = { hoi: `Tượng ý chính của quẻ ${h.name}?`, hinh: { lines: hexLines(h) }, dapAn: h.kw, lua: lua(h.kw, [...new Set(HEXAGRAMS.map(x => x.kw))]), giai: `${h.kw} — ${h.m}` }; }
  else if (loai.k === 'bien') { const h = pick(HEXAGRAMS); const hao = 1 + Math.floor(rng() * 6); const b = hexBien(h, hao); c = { hoi: `Quẻ ${h.name}, hào ${hao} động → biến thành quẻ gì?`, hinh: { lines: hexLines(h), dong: hao }, dapAn: b.name, lua: lua(b.name, tenHex), giai: `Lật hào ${hao} (${hexLines(h)[hao - 1] ? 'dương → âm' : 'âm → dương'}) được ${b.name} — ${b.kw}.` }; }
  else if (loai.k === 'ho') { const h = pick(HEXAGRAMS.filter(x => hexHo(x).n !== x.n)); const ho = hexHo(h); c = { hoi: `Quẻ hỗ của ${h.name} là quẻ gì?`, hinh: { lines: hexLines(h) }, dapAn: ho.name, lua: lua(ho.name, tenHex), giai: `Hào 2-3-4 làm hạ (${ho.lo}), hào 3-4-5 làm thượng (${ho.up}) → ${ho.name}.` }; }
  else { const h = pick(HEXAGRAMS.filter(x => x.up !== x.lo)); const hao = 1 + Math.floor(rng() * 6); const dongTren = hao >= 4; const the = dongTren ? h.lo : h.up, dung = dongTren ? h.up : h.lo; const q = ttTuongQuan(TRI_HANH[the], TRI_HANH[dung]); c = { hoi: `Quẻ ${h.name}, hào ${hao} động. Quái không động làm Thể — Thể Dụng quan hệ ra sao?`, hinh: { lines: hexLines(h), dong: hao }, dapAn: K_TD[K_TD_KEY[q.k]], lua: lua(K_TD[K_TD_KEY[q.k]], K_TD), giai: `Thể ${the} (${TRI_HANH[the]}) · Dụng ${dung} (${TRI_HANH[dung]}) → ${q.ten}: ${q.loi}` }; }
  return { ...c, loai };
}

// thẻ Khảo khoá ở Nhật Khoá — khao = st.khao { day, lan, dung }
function KhaoKhoa({ tier, day, khao, done, pts, onTien, onDone, onUncomplete, anim }) {
  const k = khao && khao.day === day ? khao : { day, lan: 0, dung: 0 };
  const [pick, setPick] = React.useState(null);
  const cau = React.useMemo(() => ttKhaoCau(tier, day, k.lan, k.dung), [tier, day, k.lan, k.dung]);
  React.useEffect(() => { setPick(null); }, [cau]);
  const than = STAT_MAP.than, col = statColor(than.hue);
  const mo = ttKhaoLoaiMo(tier);
  const tiep = () => {
    if (!pick) return;
    if (pick.ok) { if (k.dung + 1 >= TT_KHAO_SO) onDone(); else onTien({ day, lan: k.lan, dung: k.dung + 1 }); }
    else onTien({ day, lan: k.lan + 1, dung: 0 });
  };
  return (
    <InkCard style={{ padding: 15, marginBottom: 20, border: `1px solid ${done ? col + '55' : INK.panelBd}` }}>
      <div style={{ display: 'flex', alignItems: 'center', gap: 8, marginBottom: 7 }}>
        <span style={{ ...han, fontSize: 17, color: col, lineHeight: 1 }}>考</span>
        <span style={{ fontFamily: "'Be Vietnam Pro', sans-serif", fontSize: 10.5, letterSpacing: 1.6, textTransform: 'uppercase', color: INK.goldDim }}>Khảo khoá · {REALM_TIERS[tier]}</span>
        <span style={{ flex: 1 }} />
        <div style={{ display: 'flex', gap: 5 }}>
          {Array.from({ length: TT_KHAO_SO }).map((_, i) => <span key={i} style={{ width: 8, height: 8, borderRadius: '50%', background: (done || i < k.dung) ? col : 'transparent', border: `1px solid ${(done || i < k.dung) ? col : INK.hair}` }}></span>)}
        </div>
      </div>
      {done ? (
        <div style={{ display: 'flex', alignItems: 'center', gap: 10 }}>
          <span style={{ display: 'inline-flex', alignItems: 'center', gap: 7, padding: '8px 15px', borderRadius: 999, background: statSoft(than.hue), border: `1px solid ${col}66`, fontFamily: "'Be Vietnam Pro', sans-serif", fontSize: 12, fontWeight: 600, color: col, whiteSpace: 'nowrap' }}>✓ Qua khảo {TT_KHAO_SO}/{TT_KHAO_SO} · +{pts} Thần Thức</span>
          {onUncomplete && <button onClick={onUncomplete} style={{ background: 'none', border: 'none', cursor: 'pointer', color: INK.faint, fontFamily: "'Be Vietnam Pro', sans-serif", fontSize: 11 }}>hoàn tác</button>}
          <span style={{ flex: 1 }} />
          <span style={{ fontFamily: "'Be Vietnam Pro', sans-serif", fontSize: 10.5, color: INK.faint }}>mai có bộ khác</span>
        </div>
      ) : (
        <>
          <div style={{ display: 'flex', gap: 13, alignItems: 'flex-start' }}>
            {cau.hinh && (
              <div style={{ flexShrink: 0, paddingTop: 2 }}>
                <HexLines lines={cau.hinh.lines} w={44} gap={cau.hinh.lines.length > 3 ? 4.5 : 6} h={cau.hinh.lines.length > 3 ? 4.5 : 6} color={INK.gold} dong={cau.hinh.dong || 0} />
              </div>
            )}
            <div style={{ flex: 1, minWidth: 0 }}>
              <div style={{ fontFamily: "'Be Vietnam Pro', sans-serif", fontSize: 10.5, color: INK.faint }}>Câu {k.dung + 1}/{TT_KHAO_SO} · {cau.loai.ten}{k.lan > 0 ? ` · bộ ${k.lan + 1}` : ''}</div>
              <div style={{ fontFamily: "'Spectral', serif", fontSize: 15.5, fontWeight: 600, color: INK.text, marginTop: 3, lineHeight: 1.35, textWrap: 'pretty' }}>{cau.hoi}</div>
            </div>
          </div>
          <div style={{ display: 'grid', gridTemplateColumns: 'repeat(2, minmax(0, 1fr))', gap: 7, marginTop: 11 }}>
            {cau.lua.map(l => {
              const chon = pick && pick.chon === l, dung = pick && l === cau.dapAn;
              const bd = pick ? (dung ? '#7fd6a4' : (chon ? INK.cinnabar : INK.hair)) : INK.hair;
              return (
                <button key={l} disabled={!!pick} onClick={() => setPick({ chon: l, ok: l === cau.dapAn })} style={{
                  padding: '10px 10px', borderRadius: 11, cursor: pick ? 'default' : 'pointer', textAlign: 'left', minHeight: 44,
                  background: pick && dung ? 'rgba(127,214,164,0.12)' : (chon ? 'rgba(200,60,50,0.12)' : INK.panel), border: `1px solid ${bd}`,
                  fontFamily: "'Be Vietnam Pro', sans-serif", fontSize: 12.5, lineHeight: 1.35, color: pick ? (dung ? '#7fd6a4' : (chon ? INK.cinnabar : INK.faint)) : INK.text, textWrap: 'pretty',
                }}>{l}</button>
              );
            })}
          </div>
          {pick ? (
            <div style={{ marginTop: 11 }}>
              <p style={{ fontFamily: "'Spectral', serif", fontSize: 13.5, lineHeight: 1.6, color: pick.ok ? INK.text : INK.dim, margin: 0, textWrap: 'pretty' }}>
                <span style={{ fontWeight: 700, color: pick.ok ? '#7fd6a4' : INK.cinnabar }}>{pick.ok ? 'Đúng. ' : 'Chưa đúng. '}</span>{cau.giai}
              </p>
              <button onClick={tiep} style={{ marginTop: 10, width: '100%', padding: '10px', borderRadius: 11, cursor: 'pointer', background: pick.ok ? 'rgba(var(--gold-rgb),0.14)' : 'transparent', border: `1px solid ${pick.ok ? INK.goldDim + '66' : INK.hair}`, fontFamily: "'Be Vietnam Pro', sans-serif", fontSize: 12.5, fontWeight: 600, color: pick.ok ? INK.gold : INK.dim }}>
                {pick.ok ? (k.dung + 1 >= TT_KHAO_SO ? `Thông qua · +${pts} Thần Thức` : 'Câu tiếp ›') : 'Sai một câu — làm bộ khác từ đầu'}
              </button>
            </div>
          ) : (
            <p style={{ fontFamily: "'Be Vietnam Pro', sans-serif", fontSize: 10.5, lineHeight: 1.5, color: INK.faint, margin: '9px 0 0', textWrap: 'pretty' }}>
              Đúng cả {TT_KHAO_SO} câu mới tính khoá. Bậc đang mở: {mo.map(l => l.ten).join(' · ')}{tier < 3 ? ` — lên ${REALM_TIERS[tier + 1]} mở thêm ${KHAO_LOAI.filter(l => l.tier === tier + 1).map(l => l.ten.toLowerCase()).join(', ')}.` : '.'}
            </p>
          )}
        </>
      )}
    </InkCard>
  );
}

Object.assign(window, { KHAO_LOAI, TT_KHAO_SO, ttKhaoCau, ttKhaoLoaiMo, KhaoKhoa });
