/**
 * Số điện thoại / Số nói chung — phân tích theo 2 hệ:
 *   1. Tổng số rút gọn về 1-9 (hệ Pythagore)
 *   2. Cát-hung từng cặp 2 chữ số liền nhau (Bát Tinh — Hệ phái Đài Loan)
 *
 * Phân tích cá nhân hóa (optional):
 *   - Truyền year + gender → tính cung mệnh + nhóm Đông/Tây tứ mệnh
 *   - Mỗi cặp số map về 1 trong 8 quẻ Bát Tinh (Sinh Khí, Diên Niên...)
 *   - 4 quẻ cát + 4 quẻ hung là CỐ ĐỊNH với mọi mệnh, nhưng MỨC ĐỘ HỢP
 *     khác nhau theo cung mệnh (Đông tứ mệnh hợp Sinh Khí / Diên Niên /
 *     Thiên Y / Phục Vị mạnh, Tây tứ mệnh tương tự nhưng các con số khác)
 *   - Để giản lược, ta tính bonus điểm khi cặp số rơi vào quẻ MIỀU VƯỢNG
 *     theo nhóm Đông/Tây của cung mệnh
 *
 * Đây là tool dân gian, không có chuẩn quốc gia — kết quả mang tính
 * tham khảo.
 */

import { NUMBER_MEANINGS } from "@/lib/numerology";
import { computeCungMenh, getGroup, type Bagua, type Group } from "@/lib/feng-shui/bat-trach";

export type PairKind = {
  type: "Cát" | "Hung" | "Trung";
  fortune?: string; // Sinh Khí, Diên Niên...
  meaning: string;
};

export type PhoneAnalysis = {
  digits: string;
  total: number; // sum reduced to 1-9 or 11/22
  totalMeaning: { title: string; desc: string };
  pairs: Array<{
    pair: string;
    type: "Cát" | "Hung" | "Trung";
    fortune?: string;
    meaning: string;
    /** present only when personalization is enabled */
    matchesMenh?: boolean;
  }>;
  catScore: number; // 0-100, % cát trong tổng pairs
  /** Personalization fields — only present when birth info supplied */
  personalized?: {
    cungMenh: Bagua;
    group: Group;
    year: number;
    gender: "Nam" | "Nữ";
    /** Score 0-100 — mức độ hợp với mệnh người dùng */
    matchScore: number;
    /** Cụm cát hợp mệnh (Sinh Khí, Diên Niên... cụ thể với mệnh này) */
    auspiciousFortunes: string[];
    summary: string;
  };
};

/**
 * Bát Tinh — 80 cặp số 00-99 phân nhóm theo 8 quẻ.
 * Lưu ý: trong feng shui Bát Tinh, 4 quẻ cát và 4 quẻ hung là CỐ ĐỊNH
 * (không đổi theo mệnh) — đây là khác biệt với Bát Trạch hướng nhà.
 *
 * Tuy nhiên có TRƯỜNG PHÁI cá nhân hóa: ưu tiên các quẻ HỢP NHÓM của mệnh.
 * Đông tứ mệnh: Sinh Khí + Diên Niên (rất hợp)
 * Tây tứ mệnh: Thiên Y + Phục Vị (rất hợp)
 *  — Đây là cách đơn giản nhất để cá nhân hóa.
 */
type Fortune =
  | "Sinh Khí"
  | "Diên Niên"
  | "Thiên Y"
  | "Phục Vị"
  | "Tuyệt Mệnh"
  | "Ngũ Quỷ"
  | "Lục Sát"
  | "Họa Hại";

const PAIR_FORTUNE: Record<string, { fortune: Fortune; type: "Cát" | "Hung"; meaning: string }> = {
  // Sinh Khí (đại cát) — 14 41 67 76 39 93 28 82
  "14": { fortune: "Sinh Khí", type: "Cát", meaning: "Sinh Khí — quý nhân, thăng tiến" },
  "41": { fortune: "Sinh Khí", type: "Cát", meaning: "Sinh Khí — quý nhân, thăng tiến" },
  "67": { fortune: "Sinh Khí", type: "Cát", meaning: "Sinh Khí — quý nhân, thăng tiến" },
  "76": { fortune: "Sinh Khí", type: "Cát", meaning: "Sinh Khí — quý nhân, thăng tiến" },
  "39": { fortune: "Sinh Khí", type: "Cát", meaning: "Sinh Khí — quý nhân, thăng tiến" },
  "93": { fortune: "Sinh Khí", type: "Cát", meaning: "Sinh Khí — quý nhân, thăng tiến" },
  "28": { fortune: "Sinh Khí", type: "Cát", meaning: "Sinh Khí — quý nhân, thăng tiến" },
  "82": { fortune: "Sinh Khí", type: "Cát", meaning: "Sinh Khí — quý nhân, thăng tiến" },
  // Diên Niên (cát) — 19 91 87 78 43 34 26 62
  "19": { fortune: "Diên Niên", type: "Cát", meaning: "Diên Niên — tài lộc, sức khoẻ" },
  "91": { fortune: "Diên Niên", type: "Cát", meaning: "Diên Niên — tài lộc, sức khoẻ" },
  "87": { fortune: "Diên Niên", type: "Cát", meaning: "Diên Niên — tài lộc, sức khoẻ" },
  "78": { fortune: "Diên Niên", type: "Cát", meaning: "Diên Niên — tài lộc, sức khoẻ" },
  "43": { fortune: "Diên Niên", type: "Cát", meaning: "Diên Niên — tài lộc, sức khoẻ" },
  "34": { fortune: "Diên Niên", type: "Cát", meaning: "Diên Niên — tài lộc, sức khoẻ" },
  "26": { fortune: "Diên Niên", type: "Cát", meaning: "Diên Niên — tài lộc, sức khoẻ" },
  "62": { fortune: "Diên Niên", type: "Cát", meaning: "Diên Niên — tài lộc, sức khoẻ" },
  // Thiên Y (cát) — 13 31 68 86 49 94 27 72
  "13": { fortune: "Thiên Y", type: "Cát", meaning: "Thiên Y — quý nhân hỗ trợ" },
  "31": { fortune: "Thiên Y", type: "Cát", meaning: "Thiên Y — quý nhân hỗ trợ" },
  "68": { fortune: "Thiên Y", type: "Cát", meaning: "Thiên Y — quý nhân hỗ trợ" },
  "86": { fortune: "Thiên Y", type: "Cát", meaning: "Thiên Y — quý nhân hỗ trợ" },
  "49": { fortune: "Thiên Y", type: "Cát", meaning: "Thiên Y — quý nhân hỗ trợ" },
  "94": { fortune: "Thiên Y", type: "Cát", meaning: "Thiên Y — quý nhân hỗ trợ" },
  "27": { fortune: "Thiên Y", type: "Cát", meaning: "Thiên Y — quý nhân hỗ trợ" },
  "72": { fortune: "Thiên Y", type: "Cát", meaning: "Thiên Y — quý nhân hỗ trợ" },
  // Phục Vị (cát nhẹ) — số đôi
  "11": { fortune: "Phục Vị", type: "Cát", meaning: "Phục Vị — ổn định" },
  "22": { fortune: "Phục Vị", type: "Cát", meaning: "Phục Vị — ổn định" },
  "33": { fortune: "Phục Vị", type: "Cát", meaning: "Phục Vị — ổn định" },
  "44": { fortune: "Phục Vị", type: "Cát", meaning: "Phục Vị — ổn định" },
  "66": { fortune: "Phục Vị", type: "Cát", meaning: "Phục Vị — ổn định" },
  "77": { fortune: "Phục Vị", type: "Cát", meaning: "Phục Vị — ổn định" },
  "88": { fortune: "Phục Vị", type: "Cát", meaning: "Phục Vị — ổn định" },
  "99": { fortune: "Phục Vị", type: "Cát", meaning: "Phục Vị — ổn định" },
  // Tuyệt Mệnh (đại hung) — 12 21 89 98 47 74 36 63
  "12": { fortune: "Tuyệt Mệnh", type: "Hung", meaning: "Tuyệt Mệnh — đại hung, nên tránh" },
  "21": { fortune: "Tuyệt Mệnh", type: "Hung", meaning: "Tuyệt Mệnh — đại hung, nên tránh" },
  "89": { fortune: "Tuyệt Mệnh", type: "Hung", meaning: "Tuyệt Mệnh — đại hung, nên tránh" },
  "98": { fortune: "Tuyệt Mệnh", type: "Hung", meaning: "Tuyệt Mệnh — đại hung, nên tránh" },
  "47": { fortune: "Tuyệt Mệnh", type: "Hung", meaning: "Tuyệt Mệnh — đại hung, nên tránh" },
  "74": { fortune: "Tuyệt Mệnh", type: "Hung", meaning: "Tuyệt Mệnh — đại hung, nên tránh" },
  "36": { fortune: "Tuyệt Mệnh", type: "Hung", meaning: "Tuyệt Mệnh — đại hung, nên tránh" },
  "63": { fortune: "Tuyệt Mệnh", type: "Hung", meaning: "Tuyệt Mệnh — đại hung, nên tránh" },
  // Ngũ Quỷ — 18 81 97 79 46 64 32 23
  "18": { fortune: "Ngũ Quỷ", type: "Hung", meaning: "Ngũ Quỷ — hao tài, thị phi" },
  "81": { fortune: "Ngũ Quỷ", type: "Hung", meaning: "Ngũ Quỷ — hao tài, thị phi" },
  "97": { fortune: "Ngũ Quỷ", type: "Hung", meaning: "Ngũ Quỷ — hao tài, thị phi" },
  "79": { fortune: "Ngũ Quỷ", type: "Hung", meaning: "Ngũ Quỷ — hao tài, thị phi" },
  "46": { fortune: "Ngũ Quỷ", type: "Hung", meaning: "Ngũ Quỷ — hao tài, thị phi" },
  "64": { fortune: "Ngũ Quỷ", type: "Hung", meaning: "Ngũ Quỷ — hao tài, thị phi" },
  "32": { fortune: "Ngũ Quỷ", type: "Hung", meaning: "Ngũ Quỷ — hao tài, thị phi" },
  "23": { fortune: "Ngũ Quỷ", type: "Hung", meaning: "Ngũ Quỷ — hao tài, thị phi" },
  // Lục Sát — 17 71 29 92 38 83
  "17": { fortune: "Lục Sát", type: "Hung", meaning: "Lục Sát — tranh chấp, kiện tụng" },
  "71": { fortune: "Lục Sát", type: "Hung", meaning: "Lục Sát — tranh chấp, kiện tụng" },
  "29": { fortune: "Lục Sát", type: "Hung", meaning: "Lục Sát — tranh chấp, kiện tụng" },
  "92": { fortune: "Lục Sát", type: "Hung", meaning: "Lục Sát — tranh chấp, kiện tụng" },
  "38": { fortune: "Lục Sát", type: "Hung", meaning: "Lục Sát — tranh chấp, kiện tụng" },
  "83": { fortune: "Lục Sát", type: "Hung", meaning: "Lục Sát — tranh chấp, kiện tụng" },
  // Họa Hại — 16 61 24 42 37 73
  "16": { fortune: "Họa Hại", type: "Hung", meaning: "Họa Hại — vướng mắc, bệnh vặt" },
  "61": { fortune: "Họa Hại", type: "Hung", meaning: "Họa Hại — vướng mắc, bệnh vặt" },
  "24": { fortune: "Họa Hại", type: "Hung", meaning: "Họa Hại — vướng mắc, bệnh vặt" },
  "42": { fortune: "Họa Hại", type: "Hung", meaning: "Họa Hại — vướng mắc, bệnh vặt" },
  "37": { fortune: "Họa Hại", type: "Hung", meaning: "Họa Hại — vướng mắc, bệnh vặt" },
  "73": { fortune: "Họa Hại", type: "Hung", meaning: "Họa Hại — vướng mắc, bệnh vặt" },
};

/**
 * Quẻ phù hợp với mỗi nhóm mệnh.
 *
 * Đông tứ mệnh (Khảm/Ly/Chấn/Tốn): rất hợp với Sinh Khí (mộc) + Diên Niên (kim);
 *   tốt nhì với Thiên Y (thổ) + Phục Vị.
 * Tây tứ mệnh (Càn/Đoài/Cấn/Khôn): rất hợp với Thiên Y + Phục Vị (thổ kim);
 *   tốt nhì với Sinh Khí + Diên Niên.
 *
 * Đây là rút gọn — trường phái khắt khe sẽ tính theo cung mệnh cụ thể, nhưng
 * cách phân nhóm Đông/Tây đã đủ chính xác cho 80% use case.
 */
const BEST_FORTUNES: Record<Group, Fortune[]> = {
  "Đông Tứ Mệnh": ["Sinh Khí", "Diên Niên", "Thiên Y", "Phục Vị"],
  "Tây Tứ Mệnh": ["Thiên Y", "Phục Vị", "Sinh Khí", "Diên Niên"],
};

export type AnalyzeOptions = {
  birthYear?: number;
  gender?: "Nam" | "Nữ";
};

export function analyzePhoneNumber(input: string, opts?: AnalyzeOptions): PhoneAnalysis | null {
  const digits = input.replace(/\D/g, "");
  if (digits.length < 4) return null;

  // Total reduce
  const sum = digits.split("").reduce((s, c) => s + Number(c), 0);
  let total = sum;
  while (total > 9 && total !== 11 && total !== 22) {
    total = String(total)
      .split("")
      .reduce((s, c) => s + Number(c), 0);
  }

  // Personalization (optional)
  let personalized: PhoneAnalysis["personalized"] = undefined;
  let bestFortunes: Fortune[] | null = null;
  if (opts?.birthYear && opts.gender) {
    try {
      const cungMenh = computeCungMenh(opts.birthYear, opts.gender);
      const group = getGroup(cungMenh);
      bestFortunes = BEST_FORTUNES[group];
      personalized = {
        cungMenh,
        group,
        year: opts.birthYear,
        gender: opts.gender,
        matchScore: 0, // filled below
        auspiciousFortunes: [...bestFortunes],
        summary: "",
      };
    } catch {
      // invalid year/gender combination — silently skip personalization
    }
  }

  // Pairs
  const pairs: PhoneAnalysis["pairs"] = [];
  for (let i = 0; i < digits.length - 1; i++) {
    const p = digits.slice(i, i + 2);
    const entry = PAIR_FORTUNE[p];
    if (entry) {
      const matchesMenh = bestFortunes
        ? bestFortunes.includes(entry.fortune as Fortune)
        : undefined;
      pairs.push({
        pair: p,
        type: entry.type,
        fortune: entry.fortune,
        meaning: entry.meaning,
        ...(matchesMenh !== undefined ? { matchesMenh } : {}),
      });
    } else {
      pairs.push({
        pair: p,
        type: "Trung",
        meaning: "Bình thường — không cát không hung đặc biệt",
        ...(bestFortunes ? { matchesMenh: false } : {}),
      });
    }
  }

  const catCount = pairs.filter((p) => p.type === "Cát").length;
  const catScore = pairs.length > 0 ? Math.round((catCount / pairs.length) * 100) : 0;

  // Compute matchScore — weighted by fortune ranking within the menh group
  if (personalized && bestFortunes) {
    let weighted = 0;
    let maxWeighted = 0;
    for (const pair of pairs) {
      maxWeighted += 4; // best possible weight
      if (pair.fortune) {
        const idx = bestFortunes.indexOf(pair.fortune as Fortune);
        if (idx >= 0) {
          weighted += 4 - idx; // rank 0 → 4 points, rank 3 → 1 point
        } else {
          // hung quẻ — subtract a smaller penalty
          weighted += 0;
        }
      } else {
        weighted += 1; // trung
      }
    }
    personalized.matchScore = Math.round((weighted / maxWeighted) * 100);

    // Build summary
    const top = bestFortunes[0];
    const second = bestFortunes[1];
    const cungLabel = personalized.cungMenh;
    const groupLabel = personalized.group;
    const score = personalized.matchScore;
    let assessment = "";
    if (score >= 75) {
      assessment = "rất hợp với mệnh của bạn";
    } else if (score >= 60) {
      assessment = "khá hợp với mệnh";
    } else if (score >= 45) {
      assessment = "tạm chấp nhận";
    } else {
      assessment = "không thực sự hợp với mệnh";
    }
    personalized.summary = `Bạn cung ${cungLabel} thuộc ${groupLabel} — số này ${assessment}. Các cặp số quẻ ${top} và ${second} là tốt nhất cho bạn (đã đánh dấu sao ★ ở dưới).`;
  }

  return {
    digits,
    total,
    totalMeaning: NUMBER_MEANINGS[total] ?? { title: `Số ${total}`, desc: "" },
    pairs,
    catScore,
    personalized,
  };
}
