/**
 * Daily / yearly horoscope per zodiac.
 *
 * 12 zodiac × N theme each. Generated content — không phải prediction
 * thật mà là gợi ý mang tính tham khảo dựa trên vibration con giáp.
 */

import { ZODIAC, type ZodiacAnimal, type ZodiacEntry } from "@/lib/zodiac";

export type DailyHoroscope = {
  zodiac: ZodiacEntry;
  date: string; // ISO date
  overall: string;
  career: string;
  love: string;
  health: string;
  luckyColor: string;
  luckyNumber: number;
  scoreOverall: number; // 0-100
};

const COLORS = [
  "Đỏ",
  "Cam",
  "Vàng",
  "Xanh lá",
  "Xanh dương",
  "Tím",
  "Hồng",
  "Trắng",
  "Xám",
  "Nâu",
  "Đen",
  "Bạc",
];

/** Deterministic pseudo-random bằng hash(date + slug) — cùng input cho cùng output. */
function seededRandom(seed: string, mod: number): number {
  let h = 0;
  for (const c of seed) h = (h * 31 + c.charCodeAt(0)) | 0;
  return Math.abs(h) % mod;
}

const DAILY_OVERALL_TEMPLATES: Record<ZodiacAnimal, string[]> = {
  ty: [
    "Trí tuệ và sự linh hoạt giúp bạn nắm bắt cơ hội. Một quyết định nhỏ hôm nay có thể mở đường lớn ngày mai.",
    "Năng lượng giao tiếp tăng cao — cuộc trò chuyện ngắn có thể dẫn đến kết nối quan trọng.",
    "Cẩn trọng với chi tiêu nhỏ, dễ rơi vào bẫy 'mua thêm chút nữa'.",
  ],
  suu: [
    "Sự bền bỉ của bạn được chú ý. Tiếp tục công việc đã làm, không cần đột phá hôm nay.",
    "Một người lớn tuổi hoặc người có kinh nghiệm sẽ cho lời khuyên giá trị.",
    "Đừng vội kết luận — chậm lại và thu thập thêm thông tin.",
  ],
  dan: [
    "Năng lượng dồi dào, thích hợp cho các quyết định mạnh mẽ. Đừng để cơ hội trôi đi.",
    "Đối thủ hoặc thử thách xuất hiện — đây là cơ hội thể hiện bản lĩnh.",
    "Chú ý lời nói: thẳng thắn nhưng đừng làm tổn thương người khác.",
  ],
  mao: [
    "Trực giác chính xác hôm nay — tin vào cảm giác đầu tiên.",
    "Một mối quan hệ cũ có thể quay lại. Cân nhắc kỹ trước khi mở cửa.",
    "Thời gian một mình giúp bạn sạc lại năng lượng. Đừng ngại từ chối.",
  ],
  thin: [
    "Ngày của tham vọng. Đặt mục tiêu lớn và bước đầu tiên ngay hôm nay.",
    "Sự công nhận có thể đến từ nguồn không ngờ — sẵn sàng đón nhận.",
    "Tránh kiêu ngạo trong giao tiếp. Người khác cũng có giá trị.",
  ],
  ti: [
    "Sự sâu sắc của bạn giải mã được tình huống phức tạp. Đừng vội nói ra.",
    "Trực giác cảnh báo về một người không đáng tin — hãy lắng nghe.",
    "Đầu tư trí tuệ vào việc học hoặc nghiên cứu sẽ mang lại lợi ích lâu dài.",
  ],
  ngo: [
    "Năng lượng phiêu lưu — thích hợp cho chuyến đi ngắn hoặc trải nghiệm mới.",
    "Đừng để sự bốc đồng dẫn dắt quyết định tài chính hôm nay.",
    "Một cuộc gặp ngẫu nhiên có thể chuyển thành tình cảm. Mở lòng nhưng tỉnh táo.",
  ],
  mui: [
    "Sự dịu dàng và nghệ thuật của bạn được trân trọng. Tham gia hoạt động sáng tạo.",
    "Gia đình cần sự hiện diện của bạn — gọi điện hoặc về thăm.",
    "Học cách nói 'không' khi cần — không phải mọi yêu cầu đều xứng đáng.",
  ],
  than: [
    "Khả năng giải quyết vấn đề lên cao. Sếp / khách hàng sẽ ấn tượng.",
    "Tránh đa nhiệm — chọn một việc và làm cho xong.",
    "Hài hước là vũ khí — dùng để xoa dịu căng thẳng nơi công sở.",
  ],
  dau: [
    "Sự chỉn chu của bạn tạo khác biệt. Người khác sẽ phụ thuộc vào bạn.",
    "Một sai sót nhỏ phát hiện sớm sẽ cứu cả dự án. Kiểm tra lại.",
    "Đừng phán xét người khác quá nhanh — hãy hỏi trước khi kết luận.",
  ],
  tuat: [
    "Lòng trung thành được đền đáp hôm nay. Một đồng nghiệp đứng về phía bạn.",
    "Bảo vệ người yếu hơn là sứ mệnh tự nhiên — nhưng đừng quên chăm sóc bản thân.",
    "Tránh tranh cãi nguyên tắc với người không có cùng giá trị.",
  ],
  hoi: [
    "Sự chân thành của bạn thu hút quý nhân. Đừng giấu cảm xúc thật.",
    "Một bữa ăn ngon hoặc niềm vui nhỏ chính là điều bạn cần — không có tội.",
    "Tránh đầu tư vào lời mời 'làm giàu nhanh' — bạn dễ bị thuyết phục.",
  ],
};

export function dailyHoroscope(slug: ZodiacAnimal, dateISO: string): DailyHoroscope {
  const z = ZODIAC.find((x) => x.slug === slug)!;
  const seed = `${slug}-${dateISO}`;

  const overallList = DAILY_OVERALL_TEMPLATES[slug];
  const overall = overallList[seededRandom(seed + "o", overallList.length)];

  const careers = [
    "Tập trung vào dự án dài hạn, tránh xáo trộn lịch trình.",
    "Một cuộc họp ngắn có thể quyết định hướng đi tuần tới.",
    "Networking online hôm nay hiệu quả hơn bình thường.",
    "Đặt deadline cho chính mình và tuân thủ nghiêm ngặt.",
    "Đối tác cũ có thể quay lại với đề nghị mới.",
  ];
  const loves = [
    "Người yêu cần sự hiện diện hơn là quà tặng. Dành thời gian chất lượng.",
    "Một cuộc trò chuyện thẳng thắn giải tỏa hiểu lầm tích tụ.",
    "Đối với người độc thân: ánh nhìn tình cờ có thể mở chương mới.",
    "Đừng nhắn tin nhiều — đôi khi im lặng nói lên nhiều hơn.",
    "Quá khứ có thể quay lại — quyết định tỉnh táo, không cảm tính.",
  ];
  const healths = [
    "Giấc ngủ là thứ cần ưu tiên hôm nay. Đừng thức quá khuya.",
    "Hoạt động ngoài trời giúp tâm trí sáng. 30 phút đi bộ là đủ.",
    "Tránh đồ ăn lạ hoặc thử thực đơn mới — dạ dày nhạy cảm.",
    "Stress đang tích tụ. Thiền 10 phút hoặc viết nhật ký giúp giải toả.",
    "Uống đủ nước — bạn đang quên việc này nhiều ngày qua.",
  ];

  const sc = 50 + seededRandom(seed + "s", 41); // 50-90
  const lucky = seededRandom(seed + "n", 9) + 1; // 1-9
  const color = COLORS[seededRandom(seed + "c", COLORS.length)];

  return {
    zodiac: z,
    date: dateISO,
    overall,
    career: careers[seededRandom(seed + "ca", careers.length)],
    love: loves[seededRandom(seed + "lo", loves.length)],
    health: healths[seededRandom(seed + "he", healths.length)],
    luckyColor: color,
    luckyNumber: lucky,
    scoreOverall: sc,
  };
}

export type YearlyHoroscope = {
  zodiac: ZodiacEntry;
  year: number;
  summary: string;
  career: string;
  love: string;
  wealth: string;
  health: string;
  bestMonths: number[];
  worstMonths: number[];
  scoreOverall: number;
};

const YEARLY_SUMMARY: Record<ZodiacAnimal, (year: number) => string> = {
  ty: (y) =>
    `Năm ${y} mang đến cơ hội mở rộng mạng lưới quan hệ. Tý có khả năng nắm bắt thời cơ tốt — đặc biệt giữa năm khi sao Thiên Cơ chiếu cung sự nghiệp.`,
  suu: (y) =>
    `Năm ${y} là năm gặt hái sau những cố gắng dài. Sửu cần kiên định với kế hoạch đã đặt — không nên thay đổi giữa chừng.`,
  dan: (y) =>
    `Năm ${y} có nhiều biến động cho Dần, nhưng đều dẫn đến kết quả lớn. Dám nghĩ dám làm là chìa khóa.`,
  mao: (y) =>
    `Năm ${y} cần sự khéo léo. Mão nên dùng ngoại giao thay vì đối đầu — đặc biệt trong nửa cuối năm.`,
  thin: (y) =>
    `Năm ${y} đầy tham vọng cho Thìn. Có cơ hội thăng tiến hoặc khởi nghiệp — đừng bỏ lỡ.`,
  ti: (y) => `Năm ${y} thuận lợi cho học tập, đầu tư trí tuệ. Tỵ nên tránh quyết định cảm tính.`,
  ngo: (y) =>
    `Năm ${y} mang nhiều chuyến đi và trải nghiệm mới cho Ngọ. Cẩn thận chi tiêu vào những thú vui ngắn hạn.`,
  mui: (y) =>
    `Năm ${y} chú trọng gia đình và nghệ thuật. Mùi có thể tìm thấy đam mê mới hoặc khôi phục đam mê cũ.`,
  than: (y) =>
    `Năm ${y} thuận lợi cho công nghệ và sáng tạo. Thân nên chọn 1-2 dự án để dồn sức thay vì nhiều thứ một lúc.`,
  dau: (y) =>
    `Năm ${y} đề cao sự chỉn chu. Dậu được tin tưởng giao việc quan trọng. Đừng tự gây áp lực quá mức.`,
  tuat: (y) =>
    `Năm ${y} thử thách lòng trung thành của Tuất. Đứng vững với người thân — họ sẽ đứng vững với bạn.`,
  hoi: (y) =>
    `Năm ${y} mang nhiều niềm vui giản dị cho Hợi. Cẩn trọng với tình cảm và đầu tư mới — đừng để lòng tốt bị lợi dụng.`,
};

export function yearlyHoroscope(slug: ZodiacAnimal, year: number): YearlyHoroscope {
  const z = ZODIAC.find((x) => x.slug === slug)!;
  const seed = `${slug}-y${year}`;
  const careers = [
    "Sự nghiệp lên dốc đều đặn. Tháng 4-7 có cơ hội thăng tiến.",
    "Khởi nghiệp khả thi nửa đầu năm. Nửa cuối tập trung vận hành.",
    "Có thể chuyển công ty hoặc đổi vị trí — chuẩn bị CV từ đầu năm.",
    "Networking và xây dựng thương hiệu cá nhân là ưu tiên.",
    "Học thêm kỹ năng mới — chứng chỉ hoặc khóa học trong nước.",
  ];
  const loves = [
    "Năm tốt cho hôn nhân. Cặp đôi đã yêu lâu nên tiến tới.",
    "Người độc thân gặp người phù hợp qua bạn bè / công việc.",
    "Cẩn trọng với mối quan hệ tình cảm cũ — đừng nhìn lại quá lâu.",
    "Sự nghiệp lấn át tình cảm — cân bằng ngay từ tháng 3.",
    "Năm phù hợp để sinh con / lập gia đình.",
  ];
  const wealth = [
    "Đầu tư trung hạn (1-3 năm) phù hợp. Tránh đầu cơ ngắn hạn.",
    "Bất động sản có cơ hội — tham khảo kỹ trước khi xuống tiền.",
    "Tiết kiệm 30% thu nhập — năm sau cần quỹ dự phòng.",
    "Có thu nhập phụ ngoài lương chính. Phát triển nó.",
    "Tránh cho vay người thân số tiền lớn — dễ mất cả tiền lẫn quan hệ.",
  ];
  const healths = [
    "Chú ý hệ tiêu hoá. Ăn đúng giờ, hạn chế đồ chiên rán.",
    "Năm cần vận động — chọn 1 môn thể thao bạn thích và duy trì.",
    "Sức khoẻ tinh thần là ưu tiên. Đừng ngại tìm tư vấn nếu cần.",
    "Khám sức khoẻ định kỳ 6 tháng/lần. Phát hiện sớm là lợi thế.",
    "Giấc ngủ chất lượng quan trọng hơn số giờ ngủ.",
  ];

  const monthsAll = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
  const shuffled = [...monthsAll].sort(() => seededRandom(seed + "m", 100) - 50);
  const bestMonths = shuffled.slice(0, 3).sort((a, b) => a - b);
  const worstMonths = shuffled.slice(3, 5).sort((a, b) => a - b);

  return {
    zodiac: z,
    year,
    summary: YEARLY_SUMMARY[slug](year),
    career: careers[seededRandom(seed + "ca", careers.length)],
    love: loves[seededRandom(seed + "lo", loves.length)],
    wealth: wealth[seededRandom(seed + "we", wealth.length)],
    health: healths[seededRandom(seed + "he", healths.length)],
    bestMonths,
    worstMonths,
    scoreOverall: 55 + seededRandom(seed + "s", 36), // 55-90
  };
}
