/**
 * Màu sắc phong thuỷ — theo Mệnh ngũ hành của năm sinh.
 *
 * Quy tắc: Mệnh tương sinh là tốt, tương khắc là kỵ.
 *   Kim sinh Thuỷ, Thuỷ sinh Mộc, Mộc sinh Hoả, Hoả sinh Thổ, Thổ sinh Kim
 *   Kim khắc Mộc, Mộc khắc Thổ, Thổ khắc Thuỷ, Thuỷ khắc Hoả, Hoả khắc Kim
 *
 * Lookup mệnh từ năm sinh dùng bảng nạp âm Lục Thập Hoa Giáp đơn giản hoá:
 * mỗi cặp can-chi ứng một mệnh. Đây là lookup table, không phải tính toán
 * âm dương ngũ hành đầy đủ — đủ dùng cho tool màu sắc.
 *
 * Personalization: khi có gender → thêm cung mệnh Đông/Tây tứ mệnh, gợi ý
 * 4 hướng tốt để bố trí màu (theo Bát Trạch).
 */

export type Element = "Kim" | "Mộc" | "Thuỷ" | "Hoả" | "Thổ";

export type Application = "clothing" | "interior" | "vehicle" | "business" | "wedding";

export const APPLICATION_LABELS: Record<Application, string> = {
  clothing: "Trang phục",
  interior: "Nội thất",
  vehicle: "Xe cộ",
  business: "Kinh doanh / Logo",
  wedding: "Cưới hỏi",
};

// 60-year cycle, starting from 1924 (Giáp Tý). One entry per year.
// Source: bảng Nạp Âm Lục Thập Hoa Giáp (60 hoa giáp).
const NAP_AM_60: Element[] = [
  "Kim",
  "Kim",
  "Hoả",
  "Hoả",
  "Mộc",
  "Mộc", // 1924-1929
  "Thổ",
  "Thổ",
  "Kim",
  "Kim",
  "Hoả",
  "Hoả", // 1930-1935
  "Thuỷ",
  "Thuỷ",
  "Thổ",
  "Thổ",
  "Mộc",
  "Mộc", // 1936-1941
  "Thuỷ",
  "Thuỷ",
  "Kim",
  "Kim",
  "Mộc",
  "Mộc", // 1942-1947
  "Thổ",
  "Thổ",
  "Hoả",
  "Hoả",
  "Mộc",
  "Mộc", // 1948-1953
  "Kim",
  "Kim",
  "Hoả",
  "Hoả",
  "Thuỷ",
  "Thuỷ", // 1954-1959
  "Thổ",
  "Thổ",
  "Kim",
  "Kim",
  "Mộc",
  "Mộc", // 1960-1965
  "Thuỷ",
  "Thuỷ",
  "Thổ",
  "Thổ",
  "Hoả",
  "Hoả", // 1966-1971
  "Thuỷ",
  "Thuỷ",
  "Mộc",
  "Mộc",
  "Thổ",
  "Thổ", // 1972-1977
  "Hoả",
  "Hoả",
  "Thổ",
  "Thổ",
  "Mộc",
  "Mộc", // 1978-1983
];

const ELEMENT_HEX: Record<Element, { good: string[]; neutral: string[]; bad: string[] }> = {
  Kim: {
    good: ["Vàng", "Trắng", "Bạc", "Xám", "Ánh kim"],
    neutral: ["Nâu đất", "Be"],
    bad: ["Đỏ", "Hồng đậm", "Tím cháy", "Cam đỏ"],
  },
  Mộc: {
    good: ["Xanh lá", "Xanh đậm", "Đen", "Xanh navy"],
    neutral: ["Nâu nhạt"],
    bad: ["Trắng tinh", "Xám bạc", "Vàng kim"],
  },
  Thuỷ: {
    good: ["Đen", "Xanh navy", "Trắng", "Bạc"],
    neutral: ["Xanh lá nhạt"],
    bad: ["Vàng đất", "Nâu đậm", "Cam đất"],
  },
  Hoả: {
    good: ["Đỏ", "Hồng", "Tím", "Cam", "Xanh lá"],
    neutral: ["Vàng tươi"],
    bad: ["Đen", "Xanh navy", "Xanh tím than"],
  },
  Thổ: {
    good: ["Vàng đất", "Nâu", "Be", "Đỏ", "Cam đất"],
    neutral: ["Tím nhạt"],
    bad: ["Xanh lá", "Xanh đậm"],
  },
};

const ELEMENT_DESC: Record<Element, string> = {
  Kim: "Mệnh Kim chuộng sự sang trọng, sắc bén, gọn gàng. Hợp với gam ánh kim và pastel sáng. Tránh đỏ rực vì Hoả khắc Kim.",
  Mộc: "Mệnh Mộc tươi mát, khao khát phát triển. Hợp xanh lá (chính mệnh) và đen-navy (Thuỷ sinh Mộc). Tránh trắng/bạc (Kim khắc Mộc).",
  Thuỷ: "Mệnh Thuỷ uyển chuyển, sâu lắng. Hợp đen-navy (chính mệnh) và trắng-bạc (Kim sinh Thuỷ). Tránh nâu-vàng đất (Thổ khắc Thuỷ).",
  Hoả: "Mệnh Hoả nồng nhiệt, sáng tạo. Hợp đỏ-cam-tím (chính mệnh) và xanh lá (Mộc sinh Hoả). Tránh đen-xanh tím than (Thuỷ khắc Hoả).",
  Thổ: "Mệnh Thổ vững chãi, đáng tin. Hợp vàng-nâu-be (chính mệnh) và đỏ-cam đất (Hoả sinh Thổ). Tránh xanh lá (Mộc khắc Thổ).",
};

/**
 * Application-specific guidance — cách dùng từng màu cho từng tình huống.
 * Trả về 1-3 gợi ý cụ thể theo (element × application).
 */
const APPLICATION_GUIDE: Record<Element, Record<Application, string[]>> = {
  Kim: {
    clothing: [
      "Áo công sở: trắng, ghi sáng, vàng nhạt — toát sự sang trọng và quyết đoán.",
      "Phụ kiện: trang sức ánh kim, đồng hồ bạc/vàng. Tránh đỏ rực ở chính diện.",
      "Tóc: nâu sáng / vàng đồng hợp khí. Tránh nhuộm đỏ tím chói.",
    ],
    interior: [
      "Tường khách: trắng kem / xám sáng làm chủ đạo, điểm xuyết kim loại (đèn, khung tranh).",
      "Phòng ngủ: be hoặc xám pearl giúp ngủ sâu. Tránh sơn đỏ hồng.",
      "Bếp: ốp lát đá trắng vân xám đẹp + bền cho mệnh Kim.",
    ],
    vehicle: [
      "Xe trắng — phổ biến và rất hợp mệnh Kim, dễ bán lại.",
      "Xe bạc/xám titan đẳng cấp, hợp doanh nhân.",
      "Tránh đỏ rực, cam cháy — dễ va chạm theo phong thuỷ Hoả khắc Kim.",
    ],
    business: [
      "Logo: trắng + bạc + xám titan tạo cảm giác công nghệ, chuyên nghiệp.",
      "Văn phòng nên dùng accent ánh kim (đèn, biển hiệu) thay vì đỏ.",
      "Đồng phục công ty: trắng / xám / be hợp tinh thần Kim.",
    ],
    wedding: [
      "Áo cưới trắng / kem / vàng champagne hợp nhất.",
      "Trang sức đính hôn nên là vàng tây hoặc bạch kim (Kim sinh Kim).",
      "Trang trí tiệc dùng phụ liệu ánh kim (đèn vàng, ribbon bạc).",
    ],
  },
  Mộc: {
    clothing: [
      "Trang phục xanh lá đậm / navy là cốt lõi, mang cảm giác tươi mới và bền.",
      "Đen + xanh đen làm áo khoác mùa lạnh — Thuỷ sinh Mộc.",
      "Tránh áo trắng tinh, đặc biệt là chất liệu sáng bóng (Kim khắc Mộc).",
    ],
    interior: [
      "Phòng làm việc sơn xanh rêu / xanh ngọc giúp tập trung.",
      "Bố trí cây xanh sống ở góc Đông Nam (cung Mộc).",
      "Sàn gỗ tự nhiên + nội thất gỗ đậm là lựa chọn lý tưởng.",
    ],
    vehicle: [
      "Xe xanh rêu / xanh navy — không phổ biến nhưng cực hợp mệnh.",
      "Xe đen ổn định và sang trọng cho mệnh Mộc.",
      "Tránh xe trắng kem hoặc bạc bóng (Kim khắc Mộc).",
    ],
    business: [
      "Logo: xanh lá + đen tạo cảm giác bền vững, chuyên nghiệp.",
      "Phù hợp ngành: nông nghiệp, giáo dục, môi trường, tài chính.",
      "Tránh dùng trắng kim loại làm màu chính cho thương hiệu.",
    ],
    wedding: [
      "Áo cưới xanh ngọc / xanh navy là lựa chọn độc đáo, hợp mệnh.",
      "Hoa cưới nên dùng xanh lá (eucalyptus, dương xỉ) làm nền.",
      "Tránh phong cách metallic (bạc / trắng bóng) làm chủ đạo.",
    ],
  },
  Thuỷ: {
    clothing: [
      "Đen + navy là lựa chọn không bao giờ sai cho mệnh Thuỷ.",
      "Phối thêm trắng / bạc làm điểm nhấn — Kim sinh Thuỷ.",
      "Tránh nâu đất / vàng cháy ở chính diện áo (Thổ khắc Thuỷ).",
    ],
    interior: [
      "Phòng tắm và bếp dùng tone xanh đen / xám đậm rất hợp.",
      "Hồ cá hoặc bể nước nhỏ ở hướng Bắc kích hoạt mệnh Thuỷ.",
      "Tránh tường nâu đất hoặc gạch terracotta áp đảo.",
    ],
    vehicle: [
      "Xe đen / xanh navy — cực hợp mệnh Thuỷ, phong thái chững chạc.",
      "Xe trắng cũng phù hợp (Kim sinh Thuỷ).",
      "Tránh xe nâu đất, beige cháy.",
    ],
    business: [
      "Logo: navy + bạc cho ngành công nghệ, tài chính, vận tải.",
      "Văn phòng dùng tone xanh đen kết hợp đèn ánh trắng.",
      "Tránh accent nâu đất sậm trong nhận diện thương hiệu.",
    ],
    wedding: [
      "Áo cưới navy / đen pha xanh — phong cách hiện đại, hợp mệnh.",
      "Trang trí dùng xanh ngọc + bạc làm chủ đạo.",
      "Tránh tone nâu đất / terracotta cho hoa và backdrop.",
    ],
  },
  Hoả: {
    clothing: [
      "Đỏ và cam là màu chủ đạo — tự tin, năng lượng cao.",
      "Phối thêm xanh lá làm điểm nhấn — Mộc sinh Hoả.",
      "Tránh đen / navy phủ kín toàn thân (Thuỷ khắc Hoả).",
    ],
    interior: [
      "Phòng khách sơn đỏ rượu / cam đất tạo không khí ấm cúng.",
      "Bếp dùng tone đỏ + cam (Hoả tự sinh) — kích hoạt vận khí.",
      "Tránh dùng xanh đen làm tone chủ đạo phòng ngủ.",
    ],
    vehicle: [
      "Xe đỏ — biểu tượng kinh điển của mệnh Hoả, năng lượng mạnh.",
      "Xe cam / hồng đậm cũng rất hợp.",
      "Tránh xe đen kim loại bóng làm tone chính.",
    ],
    business: [
      "Logo: đỏ tươi + vàng tạo cảm giác nhiệt huyết, mời gọi.",
      "Phù hợp ngành: F&B, giải trí, thời trang, marketing.",
      "Tránh tone xanh đen trầm cho thương hiệu chính.",
    ],
    wedding: [
      "Áo dài cưới đỏ truyền thống — đúng tinh thần mệnh Hoả.",
      "Backdrop dùng đỏ + vàng champagne tạo cảm giác lễ hội.",
      "Tránh tone đen pha xanh navy cho không gian tiệc.",
    ],
  },
  Thổ: {
    clothing: [
      "Áo nâu đất / vàng nâu / beige là lựa chọn nền tảng.",
      "Phối thêm đỏ / cam làm điểm nhấn — Hoả sinh Thổ.",
      "Tránh xanh lá đậm phủ kín (Mộc khắc Thổ).",
    ],
    interior: [
      "Tường tone đất nung, nâu vàng tạo cảm giác vững chãi.",
      "Sàn gạch nung / đá tự nhiên rất hợp mệnh Thổ.",
      "Tránh sơn xanh lá ở phòng làm việc và phòng ngủ.",
    ],
    vehicle: [
      "Xe nâu / vàng đất / beige — không phổ biến nhưng cực hợp.",
      "Xe đỏ rượu cũng tốt (Hoả sinh Thổ).",
      "Tránh xe xanh lá đậm.",
    ],
    business: [
      "Logo: nâu + vàng đất phù hợp ngành bất động sản, xây dựng, gốm sứ.",
      "Văn phòng dùng nội thất gỗ nâu, đèn vàng ấm.",
      "Tránh sử dụng xanh lá làm tone chính.",
    ],
    wedding: [
      "Áo cưới tone be / vàng champagne / nâu nhạt rất hợp.",
      "Backdrop dùng đất nung + lụa vàng cho không gian sang trọng.",
      "Tránh tone xanh lá rừng làm chủ đạo.",
    ],
  },
};

/**
 * Cung mệnh Bát Trạch (Đông/Tây tứ mệnh) → 4 hướng tốt.
 * Các hướng này dùng để bố trí màu chính trong nhà / văn phòng.
 */
type CungMenh = "Khảm" | "Cấn" | "Chấn" | "Tốn" | "Ly" | "Khôn" | "Đoài" | "Càn";
type ManhGroup = "Đông Tứ Mệnh" | "Tây Tứ Mệnh";

const CUNG_GROUP: Record<CungMenh, ManhGroup> = {
  Khảm: "Đông Tứ Mệnh",
  Ly: "Đông Tứ Mệnh",
  Chấn: "Đông Tứ Mệnh",
  Tốn: "Đông Tứ Mệnh",
  Cấn: "Tây Tứ Mệnh",
  Khôn: "Tây Tứ Mệnh",
  Càn: "Tây Tứ Mệnh",
  Đoài: "Tây Tứ Mệnh",
};

const GOOD_DIRECTIONS: Record<ManhGroup, string[]> = {
  "Đông Tứ Mệnh": ["Bắc", "Nam", "Đông", "Đông Nam"],
  "Tây Tứ Mệnh": ["Đông Bắc", "Tây Nam", "Tây", "Tây Bắc"],
};

/**
 * Compute cung mệnh theo Lạc Thư + giới tính.
 * Công thức rút gọn: tổng các chữ số năm âm lịch (rút về 1 chữ số),
 * nam và nữ đếm ngược / đếm xuôi từ điểm xuất phát khác nhau.
 */
function computeCungMenh(year: number, gender: "Nam" | "Nữ"): CungMenh {
  const sumDigits = (n: number): number => {
    let s = 0;
    while (n > 0) {
      s += n % 10;
      n = Math.floor(n / 10);
    }
    return s > 9 ? sumDigits(s) : s;
  };
  const reduced = sumDigits(year);
  // Nam: 11 - reduced (mod 9); Nữ: 4 + reduced (mod 9)
  const idx = gender === "Nam" ? (((11 - reduced) % 9) + 9) % 9 : ((4 + reduced) % 9) % 9;
  // Map idx → Cung (Lạc Thư): 1=Khảm, 2=Khôn, 3=Chấn, 4=Tốn, 6=Càn, 7=Đoài, 8=Cấn, 9=Ly
  // 5 (trung cung) không có cung — nam dùng Khôn, nữ dùng Cấn.
  const map: Record<number, CungMenh> = {
    1: "Khảm",
    2: "Khôn",
    3: "Chấn",
    4: "Tốn",
    6: "Càn",
    7: "Đoài",
    8: "Cấn",
    9: "Ly",
  };
  if (idx === 5 || idx === 0) {
    return gender === "Nam" ? "Khôn" : "Cấn";
  }
  return map[idx] ?? "Khảm";
}

export function elementFromYear(year: number): Element {
  // 1924 = Giáp Tý → index 0 of 60-year cycle
  const idx = (((year - 1924) % 60) + 60) % 60;
  return NAP_AM_60[idx];
}

export type ColorAdvice = {
  element: Element;
  description: string;
  good: string[];
  neutral: string[];
  bad: string[];
  application?: {
    key: Application;
    label: string;
    tips: string[];
  };
  personalized?: {
    cung: CungMenh;
    group: ManhGroup;
    goodDirections: string[];
    summary: string;
  };
};

export function colorAdvice(
  year: number,
  opts?: { gender?: "Nam" | "Nữ"; application?: Application }
): ColorAdvice {
  const el = elementFromYear(year);
  const palette = ELEMENT_HEX[el];
  const result: ColorAdvice = {
    element: el,
    description: ELEMENT_DESC[el],
    good: palette.good,
    neutral: palette.neutral,
    bad: palette.bad,
  };

  if (opts?.application) {
    result.application = {
      key: opts.application,
      label: APPLICATION_LABELS[opts.application],
      tips: APPLICATION_GUIDE[el][opts.application],
    };
  }

  if (opts?.gender) {
    const cung = computeCungMenh(year, opts.gender);
    const group = CUNG_GROUP[cung];
    const goodDirections = GOOD_DIRECTIONS[group];
    result.personalized = {
      cung,
      group,
      goodDirections,
      summary: `Bạn thuộc cung ${cung} (${group}). Bố trí màu hợp mệnh ở các hướng: ${goodDirections.join(", ")}. Trong nhà, hãy đặt vật phẩm/đồ nội thất màu hợp mệnh ở những hướng này để kích hoạt vận khí mạnh nhất.`,
    };
  }

  return result;
}

/** Hex swatches for UI rendering — first 3 of each band. */
export const SWATCHES: Record<string, string> = {
  Vàng: "#F4C430",
  Trắng: "#F8F8F4",
  Bạc: "#C0C0C0",
  Xám: "#9B9B9B",
  "Ánh kim": "#D4AF37",
  "Xanh lá": "#3FAE5A",
  "Xanh đậm": "#1F6F3A",
  Đen: "#1A1A1A",
  "Xanh navy": "#0E2746",
  Đỏ: "#D43F3F",
  Hồng: "#E97AA0",
  Tím: "#7B3FAA",
  Cam: "#E27A2A",
  "Hồng đậm": "#C53A6A",
  "Tím cháy": "#5A1F66",
  "Cam đỏ": "#E03A1A",
  "Vàng tươi": "#FFD93D",
  "Vàng đất": "#C39B3A",
  Nâu: "#7A4F2A",
  "Nâu đất": "#6E4A2A",
  "Nâu nhạt": "#A87A4A",
  "Nâu đậm": "#5A3A1A",
  Be: "#E8D9B8",
  "Tím nhạt": "#B89AD4",
  "Cam đất": "#B86A2A",
  "Trắng tinh": "#FFFFFF",
  "Xám bạc": "#B8B8B8",
  "Vàng kim": "#E5B83A",
  "Xanh lá nhạt": "#7AC68A",
  "Xanh tím than": "#1A2A4A",
};
