/**
 * Cung Hoàng Đạo (Western Zodiac) — 12 cung tính theo dương lịch.
 */

export type WesternSign =
  | "bach-duong"
  | "kim-nguu"
  | "song-tu"
  | "cu-giai"
  | "su-tu"
  | "xu-nu"
  | "thien-binh"
  | "ho-cap"
  | "nhan-ma"
  | "ma-ket"
  | "bao-binh"
  | "song-ngu";

export type WesternEntry = {
  slug: WesternSign;
  name: string;
  english: string;
  symbol: string; // Unicode glyph
  // Date range (month-day inclusive)
  start: { month: number; day: number };
  end: { month: number; day: number };
  element: "Lửa" | "Đất" | "Khí" | "Nước";
  modality: "Khởi đầu" | "Cố định" | "Linh hoạt";
  ruler: string;
  traits: string[];
  strengths: string[];
  weaknesses: string[];
  description: string;
  loveHint: string;
};

export const WESTERN: WesternEntry[] = [
  {
    slug: "bach-duong",
    name: "Bạch Dương",
    english: "Aries",
    symbol: "♈",
    start: { month: 3, day: 21 },
    end: { month: 4, day: 19 },
    element: "Lửa",
    modality: "Khởi đầu",
    ruler: "Sao Hỏa",
    traits: ["dũng cảm", "tự tin", "nhiệt huyết", "thẳng thắn"],
    strengths: ["chủ động khởi xướng", "không sợ thử thách", "truyền năng lượng"],
    weaknesses: ["nóng vội", "thiếu kiên nhẫn", "hơi vị kỷ"],
    description:
      "Bạch Dương là chiến binh khởi đầu của vòng cung. Họ thích hành động hơn kế hoạch dài, dẫn dắt bằng năng lượng thuần khiết và lòng can đảm.",
    loveHint:
      "Hợp Sư Tử – Nhân Mã (cùng nguyên tố Lửa). Cần đối tác hiểu sự năng động và đôi khi thất thường.",
  },
  {
    slug: "kim-nguu",
    name: "Kim Ngưu",
    english: "Taurus",
    symbol: "♉",
    start: { month: 4, day: 20 },
    end: { month: 5, day: 20 },
    element: "Đất",
    modality: "Cố định",
    ruler: "Sao Kim",
    traits: ["bền bỉ", "yêu cái đẹp", "thực tế", "tận hưởng"],
    strengths: ["kiên định", "đáng tin", "biết hưởng thụ tinh tế"],
    weaknesses: ["bảo thủ", "lười thay đổi", "hay chiếm hữu"],
    description:
      "Kim Ngưu xây dựng từng chút một. Họ trân trọng vật chất, nghệ thuật, và sự ổn định. Một khi yêu là yêu sâu, một khi tin là tin lâu.",
    loveHint:
      "Hợp Xử Nữ – Ma Kết (Đất). Cần đối tác chia sẻ giá trị về tổ ấm và an toàn tài chính.",
  },
  {
    slug: "song-tu",
    name: "Song Tử",
    english: "Gemini",
    symbol: "♊",
    start: { month: 5, day: 21 },
    end: { month: 6, day: 20 },
    element: "Khí",
    modality: "Linh hoạt",
    ruler: "Sao Thủy",
    traits: ["tò mò", "nhanh trí", "nói chuyện hay", "đa nhiệm"],
    strengths: ["thích nghi cao", "học nhanh", "kết nối xã hội tốt"],
    weaknesses: ["thiếu kiên định", "hời hợt", "hay đổi ý"],
    description:
      "Song Tử là cầu nối giữa các thế giới — ý tưởng, con người, văn hóa. Trí tuệ là vũ khí. Cần một mục tiêu đủ lớn để cố định sự chú ý.",
    loveHint:
      "Hợp Thiên Bình – Bảo Bình (Khí). Cần đối tác kích thích trí tuệ và cho không gian tự do.",
  },
  {
    slug: "cu-giai",
    name: "Cự Giải",
    english: "Cancer",
    symbol: "♋",
    start: { month: 6, day: 21 },
    end: { month: 7, day: 22 },
    element: "Nước",
    modality: "Khởi đầu",
    ruler: "Mặt Trăng",
    traits: ["nhạy cảm", "gắn bó", "trực giác", "gia đình"],
    strengths: ["thấu cảm sâu", "trung thành", "biết chăm sóc"],
    weaknesses: ["hay giận dỗi", "khó buông", "phòng thủ quá mức"],
    description:
      "Cự Giải mang năng lượng nuôi dưỡng và bảo vệ. Họ yêu sâu, nhớ lâu, và xây tổ ấm như một sứ mệnh.",
    loveHint: "Hợp Bọ Cạp – Song Ngư (Nước). Cần đối tác trân trọng cảm xúc và sự bền vững.",
  },
  {
    slug: "su-tu",
    name: "Sư Tử",
    english: "Leo",
    symbol: "♌",
    start: { month: 7, day: 23 },
    end: { month: 8, day: 22 },
    element: "Lửa",
    modality: "Cố định",
    ruler: "Mặt Trời",
    traits: ["tự hào", "rộng lượng", "lãnh đạo", "ấm áp"],
    strengths: ["sức cuốn hút lớn", "trung thành với người thân", "tự tin"],
    weaknesses: ["kiêu ngạo", "cần được chú ý", "đôi khi diva"],
    description:
      "Sư Tử là vua của 12 cung. Họ tỏa sáng tự nhiên, dẫn dắt bằng sức nóng. Khi yêu, họ yêu rực rỡ và muốn người yêu được nhìn nhận.",
    loveHint: "Hợp Bạch Dương – Nhân Mã (Lửa). Cần đối tác đủ tự tin để đứng cạnh, không bị lu mờ.",
  },
  {
    slug: "xu-nu",
    name: "Xử Nữ",
    english: "Virgo",
    symbol: "♍",
    start: { month: 8, day: 23 },
    end: { month: 9, day: 22 },
    element: "Đất",
    modality: "Linh hoạt",
    ruler: "Sao Thủy",
    traits: ["chỉn chu", "phân tích", "thực tế", "phục vụ"],
    strengths: ["chú ý chi tiết", "kỷ luật cao", "đáng tin"],
    weaknesses: ["cầu toàn", "hay lo", "khó hài lòng"],
    description:
      "Xử Nữ tinh ý đến từng centimet. Họ làm việc giỏi nhất khi có hệ thống và mục tiêu rõ. Yêu thầm lặng nhưng bằng hành động cụ thể.",
    loveHint: "Hợp Kim Ngưu – Ma Kết (Đất). Cần đối tác trân trọng sự tinh tế và không gian riêng.",
  },
  {
    slug: "thien-binh",
    name: "Thiên Bình",
    english: "Libra",
    symbol: "♎",
    start: { month: 9, day: 23 },
    end: { month: 10, day: 22 },
    element: "Khí",
    modality: "Khởi đầu",
    ruler: "Sao Kim",
    traits: ["công bằng", "thẩm mỹ", "ngoại giao", "duyên dáng"],
    strengths: ["khéo dàn xếp", "tinh tế", "biết cảm thông"],
    weaknesses: ["do dự", "tránh xung đột", "hay phụ thuộc ý kiến người khác"],
    description:
      "Thiên Bình tìm sự cân bằng trong mọi thứ. Họ là sứ giả hòa giải bẩm sinh, có gu thẩm mỹ cao và yêu cái đẹp.",
    loveHint: "Hợp Song Tử – Bảo Bình (Khí). Cần đối tác chia sẻ giá trị thẩm mỹ và sự công bằng.",
  },
  {
    slug: "ho-cap",
    name: "Bọ Cạp",
    english: "Scorpio",
    symbol: "♏",
    start: { month: 10, day: 23 },
    end: { month: 11, day: 21 },
    element: "Nước",
    modality: "Cố định",
    ruler: "Sao Diêm Vương / Sao Hỏa",
    traits: ["mãnh liệt", "sâu sắc", "chiến lược", "bí ẩn"],
    strengths: ["ý chí thép", "trực giác cao", "trung thành tuyệt đối"],
    weaknesses: ["hay ghen", "thù dai", "kiểm soát"],
    description:
      "Bọ Cạp là bậc thầy của chiều sâu. Họ không sợ bóng tối, vì thế hiểu con người hơn các cung khác. Yêu cuồng nhiệt và đòi hỏi sự thật tuyệt đối.",
    loveHint: "Hợp Cự Giải – Song Ngư (Nước). Cần đối tác đủ vững để đối diện sự mãnh liệt.",
  },
  {
    slug: "nhan-ma",
    name: "Nhân Mã",
    english: "Sagittarius",
    symbol: "♐",
    start: { month: 11, day: 22 },
    end: { month: 12, day: 21 },
    element: "Lửa",
    modality: "Linh hoạt",
    ruler: "Sao Mộc",
    traits: ["phiêu lưu", "lạc quan", "thẳng thắn", "triết học"],
    strengths: ["tự do tinh thần", "ham học hỏi", "truyền cảm hứng"],
    weaknesses: ["thiếu tế nhị", "khó cam kết", "hay phóng đại"],
    description:
      "Nhân Mã sống vì hành trình, không vì điểm đến. Họ là cung khám phá — du lịch, triết học, ý nghĩa cuộc sống. Yêu là yêu trong tự do.",
    loveHint:
      "Hợp Bạch Dương – Sư Tử (Lửa). Cần đối tác không ràng buộc về không gian và lịch trình.",
  },
  {
    slug: "ma-ket",
    name: "Ma Kết",
    english: "Capricorn",
    symbol: "♑",
    start: { month: 12, day: 22 },
    end: { month: 1, day: 19 },
    element: "Đất",
    modality: "Khởi đầu",
    ruler: "Sao Thổ",
    traits: ["kỷ luật", "tham vọng", "nghiêm túc", "trách nhiệm"],
    strengths: ["bền chí phi thường", "biết kế hoạch dài hạn", "đáng tin"],
    weaknesses: ["bi quan", "lạnh lùng", "đặt việc lên trên"],
    description:
      "Ma Kết là CEO của vòng cung. Họ hiểu giá trị của thời gian và sự kiên nhẫn. Thành công đến muộn nhưng vững bền.",
    loveHint: "Hợp Kim Ngưu – Xử Nữ (Đất). Cần đối tác chia sẻ tham vọng và biết chờ đợi.",
  },
  {
    slug: "bao-binh",
    name: "Bảo Bình",
    english: "Aquarius",
    symbol: "♒",
    start: { month: 1, day: 20 },
    end: { month: 2, day: 18 },
    element: "Khí",
    modality: "Cố định",
    ruler: "Sao Thiên Vương / Sao Thổ",
    traits: ["độc lập", "sáng tạo", "nhân văn", "khác biệt"],
    strengths: ["tư duy đột phá", "tầm nhìn xa", "không bị ràng buộc bởi quy tắc"],
    weaknesses: ["xa cách", "khó hiểu", "đôi lúc lập dị"],
    description:
      "Bảo Bình nhìn thấy thế giới khác với mọi người. Họ vì cộng đồng, vì ý tưởng lớn, đôi khi quên mất cá nhân ngay cạnh.",
    loveHint: "Hợp Song Tử – Thiên Bình (Khí). Cần đối tác cho tự do tư duy và chia sẻ tầm nhìn.",
  },
  {
    slug: "song-ngu",
    name: "Song Ngư",
    english: "Pisces",
    symbol: "♓",
    start: { month: 2, day: 19 },
    end: { month: 3, day: 20 },
    element: "Nước",
    modality: "Linh hoạt",
    ruler: "Sao Hải Vương / Sao Mộc",
    traits: ["mộng mơ", "thấu cảm", "nghệ sĩ", "tâm linh"],
    strengths: ["lòng từ bi", "trực giác sâu", "sáng tạo nghệ thuật"],
    weaknesses: ["dễ lạc lối", "trốn tránh thực tế", "hay tự lừa dối"],
    description:
      "Song Ngư cảm nhận mọi thứ — niềm vui, nỗi buồn, năng lượng phòng. Là cung kết thúc của vòng, họ mang sự khôn ngoan và lòng trắc ẩn của tất cả 11 cung trước.",
    loveHint: "Hợp Cự Giải – Bọ Cạp (Nước). Cần đối tác đủ vững để giữ chân khi họ trôi.",
  },
];

/** Lookup by month/day. Handles Capricorn wrap-around (Dec 22 → Jan 19). */
export function westernFromDate(month: number, day: number): WesternEntry {
  for (const sign of WESTERN) {
    const { start, end } = sign;
    if (start.month === end.month) {
      if (month === start.month && day >= start.day && day <= end.day) return sign;
    } else if (start.month < end.month) {
      // Same year, e.g. Aries Mar 21 - Apr 19
      if (
        (month === start.month && day >= start.day) ||
        (month === end.month && day <= end.day) ||
        (month > start.month && month < end.month)
      ) {
        return sign;
      }
    } else {
      // Wraps year boundary, e.g. Capricorn Dec 22 - Jan 19
      if (
        (month === start.month && day >= start.day) ||
        (month === end.month && day <= end.day) ||
        month > start.month ||
        month < end.month
      ) {
        return sign;
      }
    }
  }
  return WESTERN[0];
}

const BY_SLUG = new Map(WESTERN.map((w) => [w.slug, w]));
export function westernBySlug(slug: string): WesternEntry | undefined {
  return BY_SLUG.get(slug.toLowerCase() as WesternSign);
}

// =============================================================
// Western zodiac compatibility — element + modality
// =============================================================

const ELEMENT_AFFINITY: Record<string, Record<string, number>> = {
  // Same element = strong, complementary (Lửa-Khí, Đất-Nước) = balanced, opposite = challenging
  Lửa: { Lửa: 80, Khí: 75, Đất: 40, Nước: 35 },
  Đất: { Đất: 80, Nước: 75, Lửa: 40, Khí: 35 },
  Khí: { Khí: 80, Lửa: 75, Nước: 40, Đất: 35 },
  Nước: { Nước: 80, Đất: 75, Khí: 40, Lửa: 35 },
};

const MODALITY_AFFINITY: Record<string, Record<string, number>> = {
  // Different modality = balanced. Same modality = either too similar (cardinal) or too stuck (fixed)
  "Khởi đầu": { "Khởi đầu": 50, "Cố định": 70, "Linh hoạt": 65 },
  "Cố định": { "Khởi đầu": 70, "Cố định": 55, "Linh hoạt": 75 },
  "Linh hoạt": { "Khởi đầu": 65, "Cố định": 75, "Linh hoạt": 60 },
};

export type WesternCompat = {
  selfSlug: WesternSign;
  partnerSlug: WesternSign;
  selfName: string;
  partnerName: string;
  elementScore: number;
  modalityScore: number;
  totalScore: number; // 0-100
  rating: "rất hợp" | "hợp" | "trung tính" | "thử thách";
  notes: string[];
};

export function westernCompat(
  selfSlug: WesternSign,
  partnerSlug: WesternSign
): WesternCompat | null {
  const self = westernBySlug(selfSlug);
  const partner = westernBySlug(partnerSlug);
  if (!self || !partner) return null;

  const elementScore = ELEMENT_AFFINITY[self.element]?.[partner.element] ?? 50;
  const modalityScore = MODALITY_AFFINITY[self.modality]?.[partner.modality] ?? 50;
  const totalScore = Math.round(elementScore * 0.65 + modalityScore * 0.35);

  let rating: WesternCompat["rating"] = "trung tính";
  if (totalScore >= 75) rating = "rất hợp";
  else if (totalScore >= 60) rating = "hợp";
  else if (totalScore >= 45) rating = "trung tính";
  else rating = "thử thách";

  const notes: string[] = [];
  if (self.element === partner.element) {
    notes.push(
      `Cùng nhóm ${self.element} — chia sẻ năng lượng cốt lõi, dễ hiểu nhau nhưng có thể thiếu cân bằng.`
    );
  } else if (
    (self.element === "Lửa" && partner.element === "Khí") ||
    (self.element === "Khí" && partner.element === "Lửa") ||
    (self.element === "Đất" && partner.element === "Nước") ||
    (self.element === "Nước" && partner.element === "Đất")
  ) {
    notes.push(
      `${self.element} + ${partner.element} là cặp bổ trợ — Khí thổi Lửa, Nước nuôi Đất, mang lại động lực và hỗ trợ cho nhau.`
    );
  } else {
    notes.push(
      `${self.element} + ${partner.element} thuộc nhóm khác cấu trúc — cần thời gian để hiểu cách nhau hoạt động.`
    );
  }

  if (self.modality === partner.modality) {
    if (self.modality === "Khởi đầu") {
      notes.push(
        `Cả hai đều "Khởi đầu" — đầy năng lượng nhưng dễ tranh quyền lãnh đạo, cần thoả thuận vai trò sớm.`
      );
    } else if (self.modality === "Cố định") {
      notes.push(`Cả hai đều "Cố định" — bền chí nhưng khó đổi ý, cần luyện cách lắng nghe.`);
    } else {
      notes.push(`Cả hai đều "Linh hoạt" — cuộc sống vui và đa dạng nhưng đôi khi thiếu cam kết.`);
    }
  }

  return {
    selfSlug,
    partnerSlug,
    selfName: self.name,
    partnerName: partner.name,
    elementScore,
    modalityScore,
    totalScore,
    rating,
    notes,
  };
}

/**
 * Best and worst matches for a given sign — top 4 most compatible + 4 least.
 */
export function westernMatches(slug: WesternSign): {
  best: { slug: WesternSign; name: string; symbol: string; score: number }[];
  worst: { slug: WesternSign; name: string; symbol: string; score: number }[];
} {
  const others = WESTERN.filter((w) => w.slug !== slug);
  const ranked = others
    .map((w) => {
      const c = westernCompat(slug, w.slug);
      return {
        slug: w.slug,
        name: w.name,
        symbol: w.symbol,
        score: c?.totalScore ?? 0,
      };
    })
    .sort((a, b) => b.score - a.score);
  return {
    best: ranked.slice(0, 4),
    worst: ranked.slice(-4).reverse(),
  };
}

/**
 * Domain hints — career / finance / health stub theo element.
 * Generic for now; can be replaced with per-sign details later.
 */
const ELEMENT_DOMAIN: Record<string, { career: string; finance: string; health: string }> = {
  Lửa: {
    career:
      "Hợp ngành đòi năng lượng cao và sáng tạo: marketing, truyền thông, sales, sáng nghiệp. Sợ công việc lặp đi lặp lại trong văn phòng kín.",
    finance:
      "Tiêu thoải mái, dễ vay nợ tiêu dùng. Cần lập quỹ tiết kiệm tự động và tránh đầu tư cảm xúc.",
    health:
      "Cẩn thận tim mạch, áp huyết cao và giấc ngủ. Tập thể thao đều giúp xả năng lượng đúng cách.",
  },
  Đất: {
    career:
      "Hợp ngành cần kỷ luật và độ chính xác: tài chính, kế toán, kỹ thuật, nông nghiệp, bất động sản. Phát triển ổn định theo thời gian.",
    finance:
      "Có thiên hướng tích luỹ và đầu tư bền vững. Tránh quá dè dặt — đa dạng hoá danh mục để chống lạm phát.",
    health:
      "Lưu ý tiêu hoá, xương khớp, đường huyết. Vận động nhẹ nhàng đều đặn quan trọng hơn tập nặng cuối tuần.",
  },
  Khí: {
    career:
      "Hợp ngành cần giao tiếp và linh hoạt: viết lách, giáo dục, công nghệ, tư vấn, truyền thông. Sợ công việc cô lập.",
    finance:
      "Tiêu cho trải nghiệm và học hành nhiều. Cần kỷ luật phân bổ thu nhập cho mục tiêu dài hạn.",
    health: "Cẩn thận hệ hô hấp và thần kinh. Thiền và yoga giúp cân bằng đầu óc bay nhảy.",
  },
  Nước: {
    career:
      "Hợp ngành cần đồng cảm và sáng tạo: nghệ thuật, tâm lý, y tế, chăm sóc, nghiên cứu sâu. Cần ranh giới vì dễ kiệt sức cảm xúc.",
    finance:
      "Có duyên với tiền nhưng cũng dễ cho mượn / chi cho người khác. Học nói &lsquo;không&rsquo; với nhu cầu tài chính của người thân.",
    health: "Lưu ý hệ tiết niệu, thận, hệ miễn dịch. Bơi lội và liệu pháp nước rất hợp.",
  },
};

export function westernDomainHint(slug: WesternSign): {
  career: string;
  finance: string;
  health: string;
} {
  const sign = westernBySlug(slug);
  if (!sign) return { career: "", finance: "", health: "" };
  return ELEMENT_DOMAIN[sign.element] ?? { career: "", finance: "", health: "" };
}
