// tuong.jsx — Lối DLVN: bắt từ khoá trong câu hỏi → quẻ (chánh hay biến) có tượng ứng với từ ấy là «ứng» (việc đang hỏi), quẻ còn lại «đáp» (trả lời theo tượng).
// KHÔNG dùng Thể–Dụng Mai Hoa (user dặn 28/10). ttTuongQuan còn giữ cho chỗ khác tham khảo sinh khắc hành.
// Exports to window: TUONG_TRI, ttLuanTuong, TuongTraLoi

const TRI_HANH = { 'Kiền': 'Kim', 'Đoài': 'Kim', 'Ly': 'Hỏa', 'Chấn': 'Mộc', 'Tốn': 'Mộc', 'Khảm': 'Thủy', 'Cấn': 'Thổ', 'Khôn': 'Thổ' };
const HANH_SINH = { 'Mộc': 'Hỏa', 'Hỏa': 'Thổ', 'Thổ': 'Kim', 'Kim': 'Thủy', 'Thủy': 'Mộc' };
const HANH_KHAC = { 'Mộc': 'Thổ', 'Thổ': 'Thủy', 'Thủy': 'Hỏa', 'Hỏa': 'Kim', 'Kim': 'Mộc' };

const TUONG_TRI = {
  'Kiền': { tuong: 'trời', nguoi: 'cha, bề trên, người đứng đầu', vat: 'vàng ngọc, xe lớn, vật tròn cứng', than: 'đầu, xương',
    tu: ['trời', 'cha', 'bố', 'ba', 'ông', 'sếp', 'lãnh đạo', 'giám đốc', 'chủ', 'vua', 'quan', 'chính quyền', 'nhà nước', 'công ty', 'tập đoàn', 'vàng', 'ngọc', 'ngựa', 'đầu', 'thăng chức', 'thủ trưởng', 'người lớn', 'lớn tuổi', 'quyền', 'món lớn', 'đồ lớn', 'tài sản', 'nhà lớn', 'xe hơi', 'ô tô'],
    ung: 'việc thuộc bề trên, người có quyền quyết; tính cương, nhanh, không vòng vo — nương người lớn thì xong, tự ý đối đầu thì va.' },
  'Khôn': { tuong: 'đất', nguoi: 'mẹ, người nuôi dưỡng, đám đông', vat: 'ruộng đất, vải vóc, đồ dùng bền', than: 'bụng, tỳ vị',
    tu: ['đất', 'mẹ', 'má', 'bà', 'vợ', 'dân', 'đám đông', 'nhân viên', 'ruộng', 'vườn', 'nhà đất', 'đất đai', 'bụng', 'trâu', 'bò', 'vải', 'quê', 'nuôi', 'chậm', 'bền', 'nông'],
    ung: 'việc thuộc nền nếp, nuôi dưỡng, số đông; đi chậm mà chắc — nhu thuận, chịu khó thì thành, nóng vội thì hỏng.' },
  'Chấn': { tuong: 'sấm', nguoi: 'con trai cả, người hiếu động', vat: 'xe cộ, đường sá, cây lớn, nhạc cụ', than: 'chân, gan',
    tu: ['sấm', 'động', 'xe', 'đường', 'đi lại', 'chuyến đi', 'con trai', 'anh cả', 'chân', 'rồng', 'gấp', 'khởi', 'khởi nghiệp', 'bắt đầu', 'tiếng', 'ồn', 'nhạc', 'giật mình', 'sợ', 'trúc', 'cây', 'nhanh'],
    ung: 'việc khởi động, có tiếng động, có đi lại; đến nhanh, ồn ào — nên động sớm, nhưng động rồi phải giữ, đừng để tiếng lớn mà việc rỗng.' },
  'Tốn': { tuong: 'gió', nguoi: 'con gái cả, người làm ăn buôn bán', vat: 'cây gỗ, dây, giấy tờ đi lại, tin đồn', than: 'đùi, mật',
    tu: ['gió', 'con gái', 'chị', 'chị cả', 'gỗ', 'dây', 'lời đồn', 'tin đồn', 'đồn', 'buôn', 'buôn bán', 'kinh doanh', 'bán hàng', 'lợi nhuận', 'lãi', 'thư', 'email', 'tin nhắn', 'gà', 'mùi', 'vào', 'len lỏi', 'do dự', 'đùi'],
    ung: 'việc len lỏi, thấm dần, có lời qua tiếng lại; lợi ở buôn bán, thư từ — thuận theo mà vào thì được, do dự tiến thoái thì mất.' },
  'Khảm': { tuong: 'nước', nguoi: 'con trai thứ, người gian nan, kẻ trộm', vat: 'nước, rượu, chỗ tối, bẫy', than: 'tai, thận, máu',
    tu: ['nước', 'mưa', 'sông', 'biển', 'hồ bơi', 'hiểm', 'nguy', 'trộm', 'mất', 'rượu', 'tai', 'máu', 'thận', 'lo', 'lo lắng', 'buồn', 'tối', 'bẫy', 'lừa', 'heo', 'lợn', 'trốn', 'nợ', 'bệnh', 'ốm', 'khó khăn', 'kẹt'],
    ung: 'việc có hiểm, có chỗ tối chưa thấy; dễ lo nghĩ, dễ hao — giữ lòng tin, đi từng bước, đừng liều; có nước, có đêm, có rượu trong việc.' },
  'Ly': { tuong: 'lửa', nguoi: 'con gái thứ, người văn chương, người sáng sủa', vat: 'giấy tờ, sách vở, điện, màn hình', than: 'mắt, tim',
    tu: ['lửa', 'nắng', 'mặt trời', 'sáng', 'mắt', 'điện', 'điện thoại', 'máy tính', 'máy', 'văn', 'sách', 'giấy tờ', 'hợp đồng', 'hồ sơ', 'tin tức', 'thấy', 'đẹp', 'tim', 'chữ', 'học', 'thi', 'thi cử', 'bằng', 'bằng cấp', 'kết quả', 'nổi', 'nóng'],
    ung: 'việc có giấy tờ, chữ nghĩa, ánh sáng; sáng rõ, nhanh bùng — bám vào chỗ chính đáng mà sáng, đừng để nóng mà cháy.' },
  'Cấn': { tuong: 'núi', nguoi: 'con trai út, người giữ cửa, trẻ nhỏ', vat: 'nhà cửa, đá, ranh giới', than: 'tay, lưng, mũi',
    tu: ['núi', 'dừng', 'chặn', 'cửa', 'nhà', 'căn hộ', 'con trai út', 'em trai', 'tay', 'ngón', 'chó', 'đá', 'đường cùng', 'ranh', 'đợi', 'chờ', 'kẹt lại', 'mũi', 'lưng', 'trẻ', 'con nít', 'tĩnh', 'kho', 'chậm trễ', 'hoãn'],
    ung: 'việc bị chặn, phải dừng, phải đợi; có nhà cửa, cửa nẻo, ranh giới — biết dừng đúng chỗ là xong một nửa, cố vượt thì vấp.' },
  'Đoài': { tuong: 'đầm', nguoi: 'con gái út, người nói năng, thầy dạy, ca sĩ', vat: 'đồ kim loại nhỏ, đồ ăn uống, miệng lưỡi', than: 'miệng, răng, phổi',
    tu: ['đầm', 'hồ', 'nói', 'nói chuyện', 'lời', 'miệng', 'vui', 'cười', 'hát', 'con gái út', 'em gái', 'ăn', 'uống', 'tiệc', 'nhậu', 'dê', 'cừu', 'tiền', 'thầy', 'cô', 'giảng', 'dạy', 'ca sĩ', 'cãi', 'tranh cãi', 'răng', 'phổi', 'bạn gái', 'hẹn', 'yêu', 'tình', 'người yêu', 'mua', 'mua sắm', 'món', 'món này', 'món đồ', 'đồ ăn', 'quà'],
    ung: 'việc ở lời nói, miệng lưỡi, vui vẻ ăn uống; có người con gái, có hẹn hò, có thầy dạy — nói êm thì được việc, nói quá thì thành cãi.' },
};

function ttTuongQuan(theH, dungH) {
  if (theH === dungH) return { k: 'binh', ten: 'Tỵ hoà', loi: 'Thể Dụng cùng hành — việc bình, thuận theo thì êm, không lợi lớn không hại lớn.' };
  if (HANH_SINH[dungH] === theH) return { k: 'cat', ten: 'Dụng sinh Thể', loi: 'người và việc đến nuôi mình — cát, có người giúp, việc tự tới.' };
  if (HANH_KHAC[dungH] === theH) return { k: 'hung', ten: 'Dụng khắc Thể', loi: 'việc ép mình, người gây khó — hung, nên lùi giữ, chớ cố.' };
  if (HANH_SINH[theH] === dungH) return { k: 'hao', ten: 'Thể sinh Dụng', loi: 'mình phải bỏ sức bỏ của nuôi việc — hao tổn, được thì cũng mệt.' };
  return { k: 'tot', ten: 'Thể khắc Dụng', loi: 'mình nắm được việc, điều khiển được — tốt nhưng phải ra tay, không tự tới.' };
}

function ttChuanHoa(s) { return ' ' + String(s || '').toLowerCase().replace(/[^\p{L}\p{N}\s]/gu, ' ').replace(/\s+/g, ' ').trim() + ' '; }

// ── Lối DLVN: không Thể–Dụng. Trong hai quẻ (chánh, biến) tìm quẻ có TƯỢNG ứng vào một từ khoá trong câu hỏi → quẻ ấy là «ứng» (chỉ việc/người đang hỏi);
// quẻ còn lại là «đáp» — lấy tượng của nó mà trả lời. Không bắt được từ khoá: chánh = tình thế đang hỏi, biến = lời đáp (hướng về sau).
// Tượng của một quẻ = Sổ Tượng riêng (h{n}) + từ khoá kw + tượng của hai quái tạo nên nó (quẻ thuần: một quái, nhân đôi → cân đối, trùng lặp).
function ttTuongCuaQue(hx, so) {
  const out = [];
  (so['h' + hx.n] || []).forEach(t => out.push({ w: ttChuanHoa(t.tu).trim(), rieng: t.src !== 'kho', qua: hx.name }));
  String(hx.kw || '').split(/[,·;]/).forEach(w => { w = ttChuanHoa(w).trim(); if (w) out.push({ w, qua: hx.name }); });
  const tris = hx.up === hx.lo ? [hx.up] : [hx.up, hx.lo];
  tris.forEach(tri => {
    (so['q' + tri] || []).forEach(t => out.push({ w: ttChuanHoa(t.tu).trim(), rieng: t.src !== 'kho', qua: tri }));
    (TUONG_TRI[tri] ? TUONG_TRI[tri].tu : []).forEach(w => out.push({ w, qua: tri }));
  });
  return out.filter(t => t.w);
}
function ttTimUng(norm, hx, so) {
  // khớp trọn cụm = điểm cao nhất; không thì đếm số chữ (≥3 ký tự, bỏ từ đệm) của cụm có trong câu hỏi — kho ghi «hỏi han thăm dò» vẫn bắt được «hỏi»
  const DEM = /^(có|không|nên|được|này|kia|đó|thì|là|và|hay|của|cho|với|về|đang|đã|sẽ|một|cái|người|việc|đi|đến|ra|vào|lên|xuống|trên|dưới|trong|ngoài|như|mà|rồi|lại|cũng|đều|mới|còn)$/;
  const qWords = new Set(norm.trim().split(' ').filter(w => w.length >= 3 && !DEM.test(w)));
  let best = null, bestScore = 0;
  ttTuongCuaQue(hx, so).forEach(t => {
    let score = 0, hit = t.w;
    if (norm.indexOf(' ' + t.w + ' ') >= 0) score = 100 + t.w.length;
    else { const ws = t.w.split(' ').filter(w => w.length >= 3 && !DEM.test(w) && qWords.has(w)); if (ws.length) { score = ws.length * 10 + ws.join('').length / 10; hit = ws.join(' '); } }
    if (score && t.rieng) score += 5;
    if (score > bestScore) { bestScore = score; best = { ...t, hit, cum: t.w }; }
  });
  return best;
}
// gom lời tượng của quẻ «đáp» để trả lời
function ttLoiDap(hx, so) {
  const rieng = (so['h' + hx.n] || []).filter(t => t.src !== 'kho').slice(0, 6).map(t => t.tu);
  const kho = (so['h' + hx.n] || []).filter(t => t.src === 'kho').slice(0, 8).map(t => t.tu);
  const tris = hx.up === hx.lo ? [hx.up] : [hx.up, hx.lo];
  const quai = tris.map(tri => `${tri} (${TUONG_TRI[tri].tuong})`).join(' trên ');
  const ung = tris.map(tri => TUONG_TRI[tri].ung).join(' ');
  return { rieng, kho, quai, ung, thuan: hx.up === hx.lo };
}

// q: câu hỏi; hex: quẻ chính; hao: hào động (1–6); bien: quẻ biến
function ttLuanTuong(q, hex, hao, bien) {
  const norm = ttChuanHoa(q);
  const so = window.__ttSoTuong || {};
  const uC = ttTimUng(norm, hex, so), uB = ttTimUng(norm, bien, so);
  // quẻ nào bắt được rõ hơn thì ứng; hoà nhau ưu tiên quẻ chánh
  const diem = u => u ? (u.hit === u.cum ? 100 + u.cum.length : u.hit.split(' ').length * 10) : 0;
  let ungLa = 'chanh';
  if (uB && diem(uB) > diem(uC)) ungLa = 'bien';
  const best = ungLa === 'bien' ? uB : uC;
  const ung = ungLa === 'bien' ? bien : hex, dap = ungLa === 'bien' ? hex : bien;
  const d = ttLoiDap(dap, so);
  const dong = hao >= 4 ? `thượng quái ${hex.up}` : `hạ quái ${hex.lo}`;
  const loi = [
    best
      ? `«${best.hit}» trong câu hỏi ứng tượng ${best.qua === ung.name ? 'quẻ' : 'quái'} ${best.qua}${best.hit !== best.cum ? ` («${best.cum}»)` : ''}${best.rieng ? ' — Sổ Tượng của đạo hữu' : ''} → quẻ ${ungLa === 'bien' ? 'biến' : 'chánh'} ${ung.name} là việc đang hỏi; quẻ ${ungLa === 'bien' ? 'chánh' : 'biến'} ${dap.name} trả lời.`
      : `Câu hỏi chưa nêu tượng rõ — lấy quẻ chánh ${hex.name} là tình thế đang hỏi, quẻ biến ${bien.name} là lời đáp.`,
    `${dap.name} — ${dap.kw}: ${dap.m}`,
    `Tượng ${d.quai}${d.thuan ? ' — quẻ thuần, hai quái một tượng: cân đối, trùng lặp, trọn một lẽ' : ''}. ${d.ung}`,
    `Hào ${hao} động ở ${dong}: chỗ ấy là mấu chốt đổi từ ${hex.name} sang ${bien.name} — ${ungLa === 'bien' ? 'việc đang hỏi hiện ra từ tình thế này' : 'lời đáp đi theo chiều ấy'}.`,
  ];
  if (d.kho.length) loi.push(`Tượng đời thường ${dap.name}: ${d.kho.join(' · ')}.`);
  const ho = hexHo(hex);
  if (ho.n !== hex.n) { const hk = (so['h' + ho.n] || []).slice(0, 4).map(t => t.tu); loi.push(`Quẻ hỗ ${ho.name} — nội tình bên trong ${hex.name}: ${ho.kw.toLowerCase()}${hk.length ? ' · ' + hk.join(' · ') : ''}.`); }
  if (d.rieng.length) loi.push(`象 Sổ Tượng của đạo hữu với quẻ ${dap.name}: ${d.rieng.join(' · ')}.`);
  return { tu: best ? best.hit : '', tuongQua: best ? best.qua : '', ungLa, ung, dap, loi };
}

function TuongTraLoi({ luan }) {
  if (!luan) return null;
  const mau = INK.goldDim;
  return (
    <div style={{ marginTop: 13, padding: '12px 13px', borderRadius: 12, background: 'rgba(0,0,0,0.22)', border: `1px solid ${mau}55` }}>
      <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>
        <span style={{ ...han, fontSize: 15, color: mau, lineHeight: 1 }}>象</span>
        <span style={{ fontFamily: "'Be Vietnam Pro', sans-serif", fontSize: 10.5, letterSpacing: 1.5, textTransform: 'uppercase', color: mau, flex: 1 }}>Tượng trả lời</span>
        <span style={{ fontFamily: "'Be Vietnam Pro', sans-serif", fontSize: 10.5, color: INK.faint, whiteSpace: 'nowrap' }}>Ứng {luan.ung.name} · Đáp {luan.dap.name}</span>
      </div>
      <div style={{ display: 'flex', flexDirection: 'column', gap: 6, marginTop: 9 }}>
        {luan.loi.map((t, i) => (
          <p key={i} style={{ fontFamily: i === 1 ? "'Spectral', serif" : "'Be Vietnam Pro', sans-serif", fontSize: i === 1 ? 14 : 11.5, lineHeight: 1.6, color: i === 1 ? INK.text : INK.dim, margin: 0, textWrap: 'pretty' }}>{t}</p>
        ))}
      </div>
    </div>
  );
}

Object.assign(window, { TUONG_TRI, TRI_HANH, ttTuongQuan, ttLuanTuong, TuongTraLoi });
