/**
 * Huyền Không phi tinh (玄空飛星) — Flying Star Feng Shui annual chart.
 *
 * Mỗi năm (mốc Lập Xuân ~4/2), một sao trong Cửu Tinh nhập trung cung.
 * Các sao còn lại bay theo trật tự Lạc Thư (Lo Shu magic square):
 *   4 9 2
 *   3 5 7
 *   8 1 6
 * Khi sao N nhập trung cung thay cho 5: gridValue[i] = ((loShu[i] - 5 + N - 1) mod 9) + 1
 *
 * Year cycle (giảm 1 mỗi năm, 1 → 9):
 *   2024 → 3 nhập trung
 *   2025 → 2 nhập trung
 *   2026 → 1 nhập trung
 *   2027 → 9 nhập trung
 */

export type Direction =
  | "Tây Bắc"
  | "Bắc"
  | "Đông Bắc"
  | "Tây"
  | "Trung cung"
  | "Đông"
  | "Tây Nam"
  | "Nam"
  | "Đông Nam";

export type StarNumber = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;

export type StarTone = "great" | "good" | "neutral" | "bad" | "very-bad";

export type StarInfo = {
  number: StarNumber;
  name: string; // Hán Việt
  fullName: string; // Cửu Tinh
  element: "Kim" | "Mộc" | "Thủy" | "Hỏa" | "Thổ";
  tone: StarTone;
  meaning: string;
  cure: string; // hóa giải / kích hoạt
};

export type FlyingStarCell = {
  direction: Direction;
  star: StarInfo;
  /** vị trí trong grid 3x3 (row 0=Bắc/top khi vẽ theo hướng phong thủy, nhưng la bàn TQ thường vẽ Nam ở trên) */
  gridIndex: number; // 0..8 theo layout 3x3 row-major với Nam ở TRÊN (chuẩn la bàn TQ phong thủy)
};

export type FlyingStarChart = {
  year: number;
  centerStar: StarNumber;
  /** 9 ô theo thứ tự gridIndex 0..8, layout Nam-trên (la bàn phong thủy) */
  cells: FlyingStarCell[];
};

const STAR_TABLE: Record<StarNumber, StarInfo> = {
  1: {
    number: 1,
    name: "Nhất Bạch",
    fullName: "Nhất Bạch Tham Lang Tinh",
    element: "Thủy",
    tone: "good",
    meaning:
      "Sao tài lộc nhỏ, văn chương, danh vọng học thuật. Vào nhà ở thì hanh thông sự nghiệp, đặc biệt có lợi cho học sinh, người làm nghề viết, thi cử.",
    cure: "Kích hoạt: đặt bể cá, đài phun nước nhỏ, vật trang trí màu xanh dương / đen tại hướng có sao này.",
  },
  2: {
    number: 2,
    name: "Nhị Hắc",
    fullName: "Nhị Hắc Cự Môn Tinh",
    element: "Thổ",
    tone: "very-bad",
    meaning:
      "Sao bệnh tật, đặc biệt ảnh hưởng phụ nữ và người già. Hướng có sao 2 trong năm dễ phát sinh bệnh dạ dày, tiêu hóa, nội tiết.",
    cure: "Hóa giải: treo chuông gió 6 ống bằng kim loại (đồng/inox), tránh đặt giường ngủ, không động thổ tại đây trong năm.",
  },
  3: {
    number: 3,
    name: "Tam Bích",
    fullName: "Tam Bích Lộc Tồn Tinh",
    element: "Mộc",
    tone: "bad",
    meaning:
      "Sao thị phi, kiện tụng, tranh cãi. Hướng có sao 3 dễ sinh mâu thuẫn vợ chồng, kiện cáo, mất bạn bè.",
    cure: "Hóa giải: dùng vật trang trí màu đỏ / hồng (hỏa khắc mộc), tránh đặt bàn làm việc đối diện cửa.",
  },
  4: {
    number: 4,
    name: "Tứ Lục",
    fullName: "Tứ Lục Văn Xương Tinh",
    element: "Mộc",
    tone: "good",
    meaning:
      "Sao văn xương — học hành, thi cử, công danh. Đặt bàn học, bàn làm việc trí óc tại hướng có sao 4 sẽ phát huy trí tuệ, dễ đạt thành tích.",
    cure: "Kích hoạt: đặt 4 cây bút lông / bút mực, tháp văn xương, tre trúc nhỏ. Tránh: kim loại sắc nhọn (kim khắc mộc).",
  },
  5: {
    number: 5,
    name: "Ngũ Hoàng",
    fullName: "Ngũ Hoàng Liêm Trinh Tinh",
    element: "Thổ",
    tone: "very-bad",
    meaning:
      "Sao đại hung — tai họa nặng nhất Cửu Tinh: tai nạn, phá tài, kiện tụng lớn, bệnh nan y. Tuyệt đối tránh động thổ, sửa chữa, đặt bếp tại hướng này trong năm.",
    cure: "Hóa giải: treo chuông đồng 6 ống, đặt hồ lô đồng, vòng tì hưu kim loại. Để hướng này YÊN TĨNH cả năm.",
  },
  6: {
    number: 6,
    name: "Lục Bạch",
    fullName: "Lục Bạch Vũ Khúc Tinh",
    element: "Kim",
    tone: "good",
    meaning:
      "Sao quan lộc, võ chức, quyền lực. Hướng có sao 6 phù hợp đặt két sắt, bàn lãnh đạo, vật phẩm phong thủy biểu trưng quyền lực.",
    cure: "Kích hoạt: vật phẩm màu trắng / vàng kim, kim loại quý. Tránh: hỏa khí (lò nướng, lò sưởi).",
  },
  7: {
    number: 7,
    name: "Thất Xích",
    fullName: "Thất Xích Phá Quân Tinh",
    element: "Kim",
    tone: "bad",
    meaning:
      "Sao đào hoa tà, trộm cắp, thị phi tình ái. Vào thời vận 9 (2024-2043), sao 7 đã thoái khí, hung tính tăng. Hướng có sao 7 dễ mất của, ngoại tình.",
    cure: "Hóa giải: vật trang trí màu xanh dương (thủy tiết kim), tránh gương lớn, đồ kim loại sáng bóng tại hướng này.",
  },
  8: {
    number: 8,
    name: "Bát Bạch",
    fullName: "Bát Bạch Tả Phụ Tinh",
    element: "Thổ",
    tone: "great",
    meaning:
      "Sao đại tài — vượng tài cát tinh số một thời vận hiện tại. Hướng có sao 8 phát tài, phát quý, đại lợi đầu tư bất động sản, kinh doanh.",
    cure: "Kích hoạt: đặt két sắt, ngọc thạch, gốm sứ, tì hưu, vật phong thủy chiêu tài. Sống/làm việc tại hướng này.",
  },
  9: {
    number: 9,
    name: "Cửu Tử",
    fullName: "Cửu Tử Hữu Bật Tinh",
    element: "Hỏa",
    tone: "great",
    meaning:
      "Sao hỉ khánh — hôn nhân, thăng chức, sinh quý tử. Trong thời vận 9 hiện tại (2024-2043), sao 9 là đương vận, cát tinh hàng đầu.",
    cure: "Kích hoạt: đèn chiếu sáng rực rỡ, vật trang trí màu đỏ / tím, hoa tươi, lò sưởi.",
  },
};

/**
 * Layout 3x3 với Nam ở TRÊN (chuẩn la bàn phong thủy Trung Hoa).
 * gridIndex 0=ĐN, 1=Nam, 2=TN, 3=Đông, 4=Trung cung, 5=Tây, 6=ĐB, 7=Bắc, 8=TB
 * Lạc Thư base (khi sao 5 nhập trung):
 *   ĐN=4  Nam=9  TN=2
 *   Đông=3 Trung=5 Tây=7
 *   ĐB=8  Bắc=1  TB=6
 */
const LO_SHU_BASE: number[] = [4, 9, 2, 3, 5, 7, 8, 1, 6];
const DIRECTIONS_GRID: Direction[] = [
  "Đông Nam",
  "Nam",
  "Tây Nam",
  "Đông",
  "Trung cung",
  "Tây",
  "Đông Bắc",
  "Bắc",
  "Tây Bắc",
];

/**
 * Tính sao nhập trung cung của năm theo lịch lập xuân.
 * Năm Y → centerStar = ((11 - Y) mod 9) hoặc 9 nếu kết quả là 0.
 * Cách khác đơn giản: 2024→3, 2025→2, 2026→1, 2027→9, 2028→8...
 */
export function centerStarOfYear(year: number): StarNumber {
  // (2024 - year + 3) mod 9, mapping 0→9
  const raw = (((2024 - year + 3) % 9) + 9) % 9;
  const result = raw === 0 ? 9 : raw;
  return result as StarNumber;
}

/**
 * Build chart cho năm.
 * Khi sao N nhập trung cung thay cho 5: cellStar = ((loShuValue - 5 + N - 1) mod 9) + 1
 * Tương đương: ((loShuValue + N - 6) mod 9) + 1
 */
export function buildFlyingStarChart(year: number): FlyingStarChart {
  const centerStar = centerStarOfYear(year);
  const cells: FlyingStarCell[] = LO_SHU_BASE.map((base, i) => {
    const offset = (((base - 5 + centerStar - 1) % 9) + 9) % 9;
    const starNum = (offset + 1) as StarNumber;
    return {
      direction: DIRECTIONS_GRID[i],
      gridIndex: i,
      star: STAR_TABLE[starNum],
    };
  });
  return { year, centerStar, cells };
}

/** Helper: lookup ô theo hướng */
export function findCellByDirection(
  chart: FlyingStarChart,
  direction: Direction
): FlyingStarCell | undefined {
  return chart.cells.find((c) => c.direction === direction);
}

/** Lấy thông tin sao theo số */
export function getStarInfo(num: StarNumber): StarInfo {
  return STAR_TABLE[num];
}
