/**
 * Numerology — hệ Pythagore.
 * - Số chủ đạo (Life Path): rút từ ngày sinh đầy đủ về 1-9 + master 11/22/33.
 * - Số biểu cảm (Expression): từ tên đầy đủ.
 * - Số linh hồn (Soul Urge): từ nguyên âm trong tên.
 *
 * Vì tên Việt có dấu, ta normalize Unicode trước khi map A-Z.
 */

const PYTHAGORAS: Record<string, number> = {
  A: 1,
  J: 1,
  S: 1,
  B: 2,
  K: 2,
  T: 2,
  C: 3,
  L: 3,
  U: 3,
  D: 4,
  M: 4,
  V: 4,
  E: 5,
  N: 5,
  W: 5,
  F: 6,
  O: 6,
  X: 6,
  G: 7,
  P: 7,
  Y: 7,
  H: 8,
  Q: 8,
  Z: 8,
  I: 9,
  R: 9,
};

const VOWELS = new Set(["A", "E", "I", "O", "U", "Y"]);

const MASTER = new Set([11, 22, 33]);

function reduce(n: number): number {
  while (n > 9 && !MASTER.has(n)) {
    n = String(n)
      .split("")
      .reduce((s, c) => s + Number(c), 0);
  }
  return n;
}

function normalize(name: string): string {
  return name
    .normalize("NFD")
    .replace(/[\u0300-\u036f]/g, "") // strip diacritics
    .replace(/đ/gi, "d")
    .toUpperCase()
    .replace(/[^A-Z]/g, "");
}

export function lifePath(year: number, month: number, day: number): number {
  const sum =
    String(year)
      .split("")
      .reduce((s, c) => s + Number(c), 0) +
    String(month)
      .split("")
      .reduce((s, c) => s + Number(c), 0) +
    String(day)
      .split("")
      .reduce((s, c) => s + Number(c), 0);
  return reduce(sum);
}

export function expressionNumber(fullName: string): number {
  const clean = normalize(fullName);
  let total = 0;
  for (const c of clean) total += PYTHAGORAS[c] ?? 0;
  return reduce(total);
}

export function soulUrge(fullName: string): number {
  const clean = normalize(fullName);
  let total = 0;
  for (const c of clean) {
    if (VOWELS.has(c)) total += PYTHAGORAS[c] ?? 0;
  }
  return reduce(total);
}

/**
 * Personality (số nhân cách) — chỉ tính phụ âm, phản ánh ấn tượng đầu tiên với người khác.
 */
export function personalityNumber(fullName: string): number {
  const clean = normalize(fullName);
  let total = 0;
  for (const c of clean) {
    if (!VOWELS.has(c)) total += PYTHAGORAS[c] ?? 0;
  }
  return reduce(total);
}

/**
 * Birthday number (số ngày sinh) — single digit của ngày sinh, không đụng tháng/năm.
 * Quy ước numerology: nếu ngày 11/22, giữ master.
 */
export function birthdayNumber(day: number): number {
  if (day === 11 || day === 22) return day;
  return reduce(
    String(day)
      .split("")
      .reduce((s, c) => s + Number(c), 0)
  );
}

/**
 * Maturity number (số trưởng thành) — life path + expression.
 * Hoạt động mạnh sau tuổi 35, mô tả mục tiêu trưởng thành.
 */
export function maturityNumber(lp: number, expr: number): number {
  return reduce(lp + expr);
}

/**
 * Personal Year (số chu kỳ năm) — vibration của một năm cụ thể với một người.
 * Công thức: month-of-birth + day-of-birth + reduce(year).
 */
export function personalYear(birthMonth: number, birthDay: number, calendarYear: number): number {
  const yearSum = String(calendarYear)
    .split("")
    .reduce((s, c) => s + Number(c), 0);
  const monthSum = String(birthMonth)
    .split("")
    .reduce((s, c) => s + Number(c), 0);
  const daySum = String(birthDay)
    .split("")
    .reduce((s, c) => s + Number(c), 0);
  return reduce(yearSum + monthSum + daySum);
}

/**
 * Personal Year forecast — gợi ý theme & lời khuyên cho từng số 1-9.
 */
export const PERSONAL_YEAR_GUIDE: Record<number, { theme: string; advice: string }> = {
  1: {
    theme: "Khởi đầu mới",
    advice: "Năm bắt đầu chu kỳ 9 năm. Tốt để khởi nghiệp, học kỹ năng mới, lập kế hoạch dài hạn.",
  },
  2: {
    theme: "Hợp tác và kiên nhẫn",
    advice: "Năm xây dựng mối quan hệ. Đừng vội. Lắng nghe đối tác. Tài chính nên phòng thủ.",
  },
  3: {
    theme: "Sáng tạo và biểu đạt",
    advice:
      "Năm thể hiện cá tính. Marketing, viết, nghệ thuật, mạng xã hội đều thuận. Cẩn thận chi tiêu cảm xúc.",
  },
  4: {
    theme: "Nền tảng và kỷ luật",
    advice:
      "Năm xây dựng. Tập trung công việc, tiết kiệm, sức khoẻ. Khó có biến động lớn — chấp nhận chậm.",
  },
  5: {
    theme: "Thay đổi và tự do",
    advice:
      "Năm cơ động. Du lịch, đổi việc, mở rộng đều thuận. Cẩn trọng cam kết hôn nhân/khoản vay lớn.",
  },
  6: {
    theme: "Gia đình và trách nhiệm",
    advice:
      "Năm tổ ấm. Cưới hỏi, sinh con, mua nhà, chăm sóc cha mẹ đều rơi vào năm này. Cân bằng cho-nhận.",
  },
  7: {
    theme: "Nội tâm và học hỏi",
    advice:
      "Năm chiêm nghiệm. Học sâu, tu tập, khám phá tâm linh. Tài chính nên giữ kín, tránh đầu tư rủi ro.",
  },
  8: {
    theme: "Thành tựu vật chất",
    advice:
      "Năm thu hoạch và quyền lực. Tốt cho sự nghiệp, đầu tư, kinh doanh lớn. Coi chừng kiêu căng.",
  },
  9: {
    theme: "Hoàn tất và buông bỏ",
    advice:
      "Năm cuối chu kỳ. Kết thúc dự án, cắt bỏ điều không cần. Không nên khởi đầu lớn — chuẩn bị cho năm 1 tiếp theo.",
  },
};

export const NUMBER_MEANINGS: Record<number, { title: string; desc: string }> = {
  1: {
    title: "Người dẫn đầu",
    desc: "Số 1 là khởi đầu — độc lập, sáng tạo, tiên phong. Mạnh ở vai trò leader. Yếu khi phải thỏa hiệp.",
  },
  2: {
    title: "Người hòa giải",
    desc: "Số 2 cân bằng và hợp tác. Nhạy cảm cao, ngoại giao giỏi. Cần học cách tự tin và đặt giới hạn.",
  },
  3: {
    title: "Người sáng tạo",
    desc: "Số 3 là biểu đạt — nghệ thuật, ngôn ngữ, niềm vui. Tỏa năng lượng. Dễ phân tâm.",
  },
  4: {
    title: "Người xây dựng",
    desc: "Số 4 là nền móng — kỷ luật, thực tế, đáng tin. Vận hành xuất sắc. Đôi khi bảo thủ.",
  },
  5: {
    title: "Người tự do",
    desc: "Số 5 thay đổi và phiêu lưu. Đa năng, hấp dẫn. Cần học cách cam kết.",
  },
  6: {
    title: "Người chăm sóc",
    desc: "Số 6 là tổ ấm và trách nhiệm. Yêu thương sâu, có gu thẩm mỹ. Hay ôm việc người khác.",
  },
  7: {
    title: "Nhà tư tưởng",
    desc: "Số 7 nội tâm và tâm linh. Phân tích sâu, độc lập. Có thể quá xa cách.",
  },
  8: {
    title: "Người làm chủ vật chất",
    desc: "Số 8 quyền lực và phong phú. Tham vọng cao. Cần cân bằng tinh thần và vật chất.",
  },
  9: {
    title: "Người nhân đạo",
    desc: "Số 9 vì cộng đồng, lý tưởng cao. Trí tuệ và lòng từ bi. Hay quên bản thân.",
  },
  11: {
    title: "Master 11 — Người truyền cảm hứng",
    desc: "Trực giác cực mạnh, thiên hướng tâm linh. Áp lực rất lớn. Nếu vượt qua sẽ trở thành người dẫn đường.",
  },
  22: {
    title: "Master 22 — Kiến trúc sư bậc thầy",
    desc: "Kết hợp tầm nhìn (11) và thực tiễn (4). Có thể xây dựng những thứ vĩ đại. Đòi hỏi kỷ luật phi thường.",
  },
  33: {
    title: "Master 33 — Bậc thầy chữa lành",
    desc: "Kết hợp 11 và 22 ở mức cao nhất. Sống vì người khác, lan tỏa tình yêu và sự hiểu biết. Hiếm gặp.",
  },
};
