/**
 * Tử Vi Số · Feng-shui room placement engine
 *
 * Builds per-room placement guidance from a Bát Trạch result. Each room
 * has a different priority among the 4 cát fortunes — e.g. the kitchen
 * stove is best on a HUNG direction firing AT a CÁT direction (toạ hung
 * hướng cát), while the bed should sit at a strong cát direction.
 *
 * Returned shape is intentionally narrow so the UI can render it as a
 * symmetrical room×direction matrix.
 */
import type { DirectionAnalysis, DirectionKey, FengShuiResult, Fortune } from "./bat-trach";

export type RoomKey =
  | "cua-chinh"
  | "phong-ngu"
  | "bep"
  | "ban-tho"
  | "ban-lam-viec"
  | "phong-khach"
  | "ve-sinh"
  | "kho-cau-thang";

export type RoomGuide = {
  key: RoomKey;
  /** Vietnamese display name */
  name: string;
  /** Short emoji-free icon glyph used by UI */
  glyph: string;
  /** What this room should "use" — the recommended fortune kind */
  prefer: Fortune[];
  /** What this room should "avoid" */
  avoid: Fortune[];
  /** Best 1-3 directions for this room (computed) */
  bestDirections: DirectionAnalysis[];
  /** Specific 1-3 directions to avoid for this room (computed) */
  worstDirections: DirectionAnalysis[];
  /** Plain-Vietnamese explanation of the rule */
  rationale: string;
  /** Vietnamese practical placement note */
  practicalNote: string;
};

/**
 * Per-room rules. Each room maps to a priority list of preferred /
 * avoided fortunes. We then intersect with the user's 8-direction table
 * to produce concrete suggestions.
 *
 * References:
 *   - Bát Trạch Minh Kính (cổ điển)
 *   - Vietnamese popular references (sách phong thủy nhà ở của Lê Quang
 *     Vĩnh, Nguyễn Mạnh Linh)
 */
const ROOM_RULES: Array<Omit<RoomGuide, "bestDirections" | "worstDirections">> = [
  {
    key: "cua-chinh",
    name: "Cửa chính",
    glyph: "⛩",
    prefer: ["Sinh Khí", "Diên Niên", "Thiên Y"],
    avoid: ["Tuyệt Mệnh", "Ngũ Quỷ"],
    rationale:
      "Cửa chính đón khí — phải mở về hướng cát mạnh nhất để hút Sinh Khí (tài lộc, công danh) hoặc Diên Niên (bình an, hôn nhân).",
    practicalNote:
      "Tốt nhất là Sinh Khí. Nếu không thể, dùng Diên Niên hoặc Thiên Y. Tuyệt đối tránh Tuyệt Mệnh và Ngũ Quỷ — đây là những hướng phá tài và mang thị phi.",
  },
  {
    key: "phong-ngu",
    name: "Phòng ngủ chủ",
    glyph: "🛏",
    prefer: ["Diên Niên", "Thiên Y", "Phục Vị"],
    avoid: ["Lục Sát", "Họa Hại"],
    rationale:
      "Đầu giường phải tựa vào Diên Niên (hôn nhân hoà thuận) hoặc Thiên Y (sức khỏe). Phục Vị giúp giấc ngủ ổn định.",
    practicalNote:
      "Đặt giường ở hướng Diên Niên để vợ chồng êm ấm; quay đầu giường về phía Thiên Y nếu hay đau ốm. Tránh Lục Sát (cãi vã) và Họa Hại (bệnh tật).",
  },
  {
    key: "bep",
    name: "Bếp nấu",
    glyph: "🔥",
    // Bếp theo nguyên tắc \"toạ hung hướng cát\": miệng bếp HƯỚNG về cát.
    // Engine UI treats this entry as \"miệng bếp hướng tới\" — the prefer
    // list mirrors auspicious; the avoid list (vị trí đặt) ngược lại.
    prefer: ["Sinh Khí", "Thiên Y", "Diên Niên"],
    avoid: ["Sinh Khí", "Thiên Y", "Diên Niên"], // bếp ĐẶT không nên ở chỗ cát
    rationale:
      "Nguyên tắc “toạ hung hướng cát”: thân bếp ĐẶT trên hướng hung (ép chế hung khí), nhưng MIỆNG bếp QUAY về hướng cát để đón Sinh Khí / Thiên Y vào thức ăn.",
    practicalNote:
      "Tay nắm bếp / núm điều khiển hướng về Sinh Khí (giàu sang) hoặc Thiên Y (khỏe mạnh). Đặt thân bếp ở vị trí Họa Hại / Lục Sát để dập hung khí.",
  },
  {
    key: "ban-tho",
    name: "Bàn thờ",
    glyph: "🕯",
    prefer: ["Phục Vị", "Thiên Y", "Sinh Khí"],
    avoid: ["Tuyệt Mệnh", "Ngũ Quỷ", "Lục Sát"],
    rationale:
      "Bàn thờ cần khí trang nghiêm, ổn định — Phục Vị mang sự an nhiên, Thiên Y mang phúc, Sinh Khí mang vượng khí dòng họ.",
    practicalNote:
      "Đặt bàn thờ tại hướng Phục Vị, lưng tựa tường vững. Tuyệt đối tránh: trên đầu là vệ sinh, sau lưng là bếp, đối diện cửa chính.",
  },
  {
    key: "ban-lam-viec",
    name: "Bàn làm việc",
    glyph: "📚",
    prefer: ["Sinh Khí", "Phục Vị", "Diên Niên"],
    avoid: ["Ngũ Quỷ", "Tuyệt Mệnh"],
    rationale:
      "Khi ngồi làm việc, mặt nên hướng về Sinh Khí (sáng tạo, tài lộc) hoặc Phục Vị (tập trung, ít sai sót).",
    practicalNote:
      "Lưng tựa tường, mặt hướng cát. Tránh ngồi quay lưng ra cửa (hung) và không ngồi đối thẳng cửa nhà vệ sinh.",
  },
  {
    key: "phong-khach",
    name: "Phòng khách",
    glyph: "🛋",
    prefer: ["Sinh Khí", "Diên Niên", "Phục Vị"],
    avoid: ["Tuyệt Mệnh", "Ngũ Quỷ"],
    rationale:
      "Phòng khách là không gian giao đãi, cần đón Sinh Khí và Diên Niên để gia đình hoà khí, khách quý đến nhà.",
    practicalNote:
      "Sofa chính tựa lưng vào hướng Sinh Khí, đối diện cửa nhưng không đối thẳng. Có thể dùng cây xanh kích hoạt Sinh Khí.",
  },
  {
    key: "ve-sinh",
    name: "Phòng vệ sinh",
    glyph: "🚿",
    prefer: ["Tuyệt Mệnh", "Ngũ Quỷ", "Lục Sát", "Họa Hại"],
    avoid: ["Sinh Khí", "Diên Niên", "Thiên Y", "Phục Vị"],
    rationale:
      "Vệ sinh là nơi xả uế khí, dùng để “đè” các hướng hung. Đặt ở hướng cát sẽ làm tổn hại khí tốt của nhà.",
    practicalNote:
      "Tốt nhất đặt ở Tuyệt Mệnh hoặc Ngũ Quỷ — giúp dập hung khí. Tuyệt đối tránh đặt ở chính giữa nhà hoặc trên đầu bàn thờ.",
  },
  {
    key: "kho-cau-thang",
    name: "Kho · cầu thang",
    glyph: "🧰",
    prefer: ["Họa Hại", "Lục Sát"],
    avoid: ["Sinh Khí", "Diên Niên"],
    rationale:
      "Kho và chân cầu thang “chiếm” diện tích — đặt ở hướng hung để ngăn hung khí phát tán.",
    practicalNote:
      "Cầu thang KHÔNG được bắt đầu ngay đối diện cửa chính (xộc khí ra ngoài). Đặt kho ở Họa Hại / Lục Sát.",
  },
];

/**
 * Pick directions matching a fortune list, ordered by the original
 * `goodDirections` / `badDirections` ranking already computed in result.
 */
function pickByFortunes(all: DirectionAnalysis[], fortunes: Fortune[]): DirectionAnalysis[] {
  // De-dup while preserving order
  const seen = new Set<DirectionKey>();
  const out: DirectionAnalysis[] = [];
  for (const f of fortunes) {
    for (const d of all) {
      if (d.fortune === f && !seen.has(d.direction)) {
        seen.add(d.direction);
        out.push(d);
      }
    }
  }
  return out;
}

export function buildRoomPlacement(result: FengShuiResult): RoomGuide[] {
  // Concatenate good + bad directions in their pre-sorted order so we have
  // one source-of-truth for `pickByFortunes`.
  const allOrdered = [...result.goodDirections, ...result.badDirections];
  return ROOM_RULES.map((r) => {
    // Special-case the kitchen: \"prefer\" tells us where to point the
    // stove mouth (cát), \"avoid\" tells us where the body of the stove
    // SHOULD sit (hung). Encode by inverting `avoid` into hung-fortunes.
    const avoidList: Fortune[] =
      r.key === "bep"
        ? (["Tuyệt Mệnh", "Ngũ Quỷ", "Lục Sát", "Họa Hại"].filter(
            (f) => !r.prefer.includes(f as Fortune)
          ) as Fortune[])
        : r.avoid;
    return {
      ...r,
      bestDirections: pickByFortunes(allOrdered, r.prefer).slice(0, 3),
      worstDirections: pickByFortunes(allOrdered, avoidList).slice(0, 3),
    };
  });
}
