/**
 * Generic AI insight endpoint — works for any tool that has a structured
 * "what we computed" + a user prompt.
 *
 * POST /api/ai/insight
 *   body: { topic: string, context: object, prompt?: string }
 *
 * Topics:
 *   - "dream"       — context = { keyword, meaning, lottery? }
 *   - "bat-tu"      — context = { pillars, fiveElements, dayMaster }
 *   - "i-ching"     — context = { original, changed?, lines }
 *   - "horoscope"   — context = { zodiac, date, score, ... }
 *   - "numerology"  — context = { lifePath, expression, soul, name }
 *
 * Returns SSE stream like /api/ai/chat. Auth not required for now —
 * Phase 3 will add per-user rate limiting.
 *
 * Why a separate endpoint vs reusing /api/ai/chat: chat builds a Tử-Vi
 * chart and feeds it into the prompt. These tools have their own
 * context shapes, so we keep the prompt builder + provider call
 * generic here.
 */
import { NextRequest } from "next/server";
import { getProvider } from "@/lib/ai/provider";

export const runtime = "nodejs";

type Body = {
  topic?: string;
  context?: Record<string, unknown>;
  prompt?: string;
};

const MAX_PROMPT = 800;
const ALLOWED_TOPICS = new Set([
  "dream",
  "bat-tu",
  "i-ching",
  "horoscope",
  "numerology",
  "compat-method",
  "naming",
]);

function sseEvent(payload: Record<string, unknown>): string {
  return `data: ${JSON.stringify(payload)}\n\n`;
}

function systemPromptFor(topic: string, ctx: Record<string, unknown>): string {
  const base =
    "Bạn là chuyên gia tử vi, phong thủy, và thần số học người Việt. " +
    "Trả lời ngắn gọn (200-400 chữ), chia thành 2-3 đoạn rõ ràng. " +
    "Dùng ngôn ngữ Vietnamese trang trọng nhưng dễ hiểu, KHÔNG dùng markdown headers. " +
    "Nhấn mạnh đây là tham khảo văn hoá, không thay thế lời khuyên chuyên môn về y tế / pháp luật / tài chính. ";

  switch (topic) {
    case "dream":
      return (
        base +
        `Người dùng vừa tra một giấc mơ. Dữ liệu giấc mơ: ${JSON.stringify(ctx)}. ` +
        "Phân tích sâu hơn ý nghĩa giấc mơ này theo cả góc nhìn folklore Việt Nam và tâm lý hiện đại. " +
        "Gợi ý điều người mơ có thể đang lo lắng hoặc khao khát."
      );
    case "bat-tu":
      return (
        base +
        `Người dùng vừa lập Bát Tự. Dữ liệu 4 trụ: ${JSON.stringify(ctx)}. ` +
        "Luận sơ bộ ngũ hành cân bằng, nhật-chủ vượng/suy, và 1-2 lời khuyên về sự nghiệp / sức khoẻ phù hợp. " +
        "Không phán mệnh tuyệt đối."
      );
    case "i-ching":
      return (
        base +
        `Người dùng vừa gieo Kinh Dịch. Dữ liệu quẻ: ${JSON.stringify(ctx)}. ` +
        "Diễn giải ý nghĩa quẻ chính, hào động (nếu có), và quẻ biến trong ngữ cảnh đời sống hiện đại. " +
        "Đưa ra 1-2 hành động cụ thể người gieo nên cân nhắc."
      );
    case "horoscope":
      return (
        base +
        `Người dùng vừa xem tử vi. Dữ liệu: ${JSON.stringify(ctx)}. ` +
        "Mở rộng phần luận giải tổng quan thành nội dung chi tiết hơn, giữ tinh thần lạc quan nhưng thực tế. " +
        "Gợi ý 2-3 việc nên làm và 1 việc nên tránh trong khoảng thời gian này."
      );
    case "numerology":
      return (
        base +
        `Người dùng vừa tính thần số học. Dữ liệu: ${JSON.stringify(ctx)}. ` +
        "Phân tích sự cộng hưởng giữa Số chủ đạo, Số biểu cảm và Số linh hồn. " +
        "Chỉ ra điểm mạnh tiềm ẩn và bài học cuộc đời mà tổ hợp số này gợi ý."
      );
    case "naming": {
      // ctx: name, mode (person|company), birth?, year?, expression, soul, personality,
      //      element, lifePathMatch, totalScore, rating, pros[], cons[], suggestions[]
      const isCompany = ctx.mode === "company";
      const longBase =
        "Bạn là chuyên gia đặt tên người Việt, kết hợp Thần Số Học (Pythagore) " +
        "với Mệnh ngũ hành cổ truyền và âm vận tiếng Việt. " +
        "Trả lời 350-550 chữ, 3-4 đoạn, KHÔNG dùng markdown headers. " +
        (isCompany
          ? "Trình bày: (1) Đánh giá tên thương hiệu/công ty này (âm sắc thương hiệu, dễ đọc khi giao dịch quốc tế, " +
            "ấn tượng đầu tiên của khách hàng), (2) Phân tích Số biểu cảm và Soul Urge ảnh hưởng đến văn hoá doanh nghiệp, " +
            "(3) Cảnh báo rủi ro về phong thuỷ thương hiệu (xung Mệnh chủ doanh nghiệp / kỵ ngành nghề), " +
            "(4) Gợi ý 3 BIẾN THỂ tên thay thế cụ thể (vẫn giữ ý nghĩa) có Số biểu cảm 1/3/6/8/9 — kèm điểm mạnh từng tên. "
          : "Trình bày: (1) Đánh giá tên đặt cho con (âm sắc, dễ gọi yêu thương, hợp lứa tuổi từ bé đến lớn), " +
            "(2) Phân tích Số biểu cảm + Soul Urge + Personality phản ánh tính cách bé sẽ thể hiện ra ngoài, " +
            "(3) Cảnh báo nếu tên có lực cản với Số chủ đạo hoặc Mệnh ngũ hành cha mẹ kỳ vọng, " +
            "(4) Gợi ý 3 BIẾN THỂ tên thay thế cụ thể (giữ họ + tên đệm, đổi tên chính) có Số biểu cảm 1/3/6/8/9 — kèm ý nghĩa từng tên. ") +
        "Giọng ấm, không phán quyết tuyệt đối. Khẳng định đây là gợi ý tham khảo. ";

      return longBase + `Dữ liệu tên: ${JSON.stringify(ctx)}.`;
    }
    case "compat-method": {
      // ctx must include: methodKey, methodLabel, score, summary, details, self, partner
      // Optional: purpose = "business" (đối tác làm ăn) | undefined/marriage (mặc định)
      const methodKey = String(ctx.methodKey ?? "");
      const methodLabel = String(ctx.methodLabel ?? "phương pháp");
      const isBusiness = ctx.purpose === "business";
      const longBase =
        "Bạn là chuyên gia tử vi, phong thủy và quan hệ người Việt. " +
        "Trả lời dài và chi tiết (450-650 chữ), chia thành 3-4 đoạn rõ ràng. " +
        "Dùng tiếng Việt trang trọng nhưng dễ hiểu, KHÔNG dùng markdown headers. " +
        (isBusiness
          ? "Trình bày theo cấu trúc: (1) Phân tích sâu cách hệ thống này nhìn cặp ĐỐI TÁC kinh doanh, " +
            "(2) Chỉ ra điểm mạnh CỤ THỂ về vai trò phù hợp (đối ngoại / đối nội / tài chính / kỹ thuật), " +
            "(3) Chỉ ra rủi ro xung đột CỤ THỂ và cách hoá giải bằng cấu trúc hợp tác (% vốn, vai trò, hợp đồng), " +
            "(4) Lời khuyên hành động cho 6-12 tháng tới. "
          : "Trình bày theo cấu trúc: (1) Phân tích sâu cách hệ thống này nhìn cặp đôi, " +
            "(2) Chỉ ra điểm mạnh CỤ THỂ với tên người và ngày sinh, " +
            "(3) Chỉ ra rủi ro CỤ THỂ và cách hoá giải, " +
            "(4) Lời khuyên hành động cho 6 tháng tới. ") +
        "Nhấn mạnh đây là tham khảo, không phán quyết tuyệt đối. ";

      const variantPromptMarriage: Record<string, string> = {
        traditional:
          `Người dùng đang xem kết quả Tử Vi truyền thống Việt Nam (4 yếu tố Thiên Can - Địa Chi - Ngũ Hành Nạp Âm - Cung Phi Bát Trạch). ` +
          `Dữ liệu: ${JSON.stringify(ctx)}. ` +
          "Luận sâu từng yếu tố trong 4 sub-factors, giải thích chữ Hán nếu có, dẫn ví dụ về tam hợp/lục hợp/tứ hành xung và sinh-khắc ngũ hành. " +
          "Đối chiếu với kinh nghiệm dân gian Việt về cặp đôi cùng Cung Phi (Đông/Tây Tứ Mệnh) ảnh hưởng đến hướng nhà chung. " +
          "Gợi ý cụ thể về ngày tốt cưới hỏi và phong thuỷ phòng cưới phù hợp với 4 yếu tố này.",
        western:
          `Người dùng đang xem kết quả Cung Hoàng Đạo phương Tây (12 cung × 4 nguyên tố × 3 modality). ` +
          `Dữ liệu: ${JSON.stringify(ctx)}. ` +
          "Luận sâu cách 2 cung phương Tây tương tác qua Element (Lửa/Đất/Khí/Nước) và Modality (Khởi đầu/Cố định/Linh hoạt). " +
          "Đưa ra phân tích cảm xúc và giao tiếp dựa trên đặc trưng tâm lý phương Tây của 2 cung. " +
          "Liên hệ với kinh điển astrology như synastry và composite chart (giải thích đơn giản). " +
          "Gợi ý 3 hoạt động cụ thể giúp 2 cung này hoà hợp hơn (ví dụ: cách giao tiếp, phong cách hẹn hò, cách giải quyết xung đột).",
        "bat-tu":
          `Người dùng đang xem kết quả Bát Tự nhật chủ — phương pháp xem lá số 4 trụ cao cấp nhất. ` +
          `Dữ liệu: ${JSON.stringify(ctx)}. ` +
          "Luận sâu mối quan hệ giữa 2 Day Master (nhật-can): sinh, khắc, tỉ hoà, tiết khí. " +
          "Giải thích vai trò ngũ hành Dụng thần và Kỵ thần của từng người trong cặp đôi. " +
          "Phân tích xem ai là người 'cho' năng lượng, ai là người 'nhận' trong cặp này. " +
          "Đưa ra gợi ý phong thuỷ NHÀ Ở chung (hướng, màu sơn) sao cho dụng thần của cả hai đều được hỗ trợ. " +
          "Cảnh báo nếu có mâu thuẫn dụng thần (ví dụ vợ cần Hỏa nhưng chồng cần Thuỷ).",
        numerology:
          `Người dùng đang xem kết quả Thần Số Học Life Path (hệ Pythagore). ` +
          `Dữ liệu: ${JSON.stringify(ctx)}. ` +
          "Luận sâu ý nghĩa của 2 Life Path number kết hợp với nhau. Mô tả: (a) cách 2 con số này cộng hưởng hoặc xung đột, (b) bài học chung mà cặp đôi cần học (life lesson) thông qua mối quan hệ này, (c) chu kỳ 9 năm sẽ ảnh hưởng đến mối quan hệ ra sao. " +
          "Trích dẫn các nhà thần số học nổi tiếng (Dan Millman, Hans Decoz) khi diễn giải. " +
          "Gợi ý ngày kết hôn tốt theo personal year cycle.",
      };

      const variantPromptBusiness: Record<string, string> = {
        traditional:
          `Người dùng đang xem kết quả Tử Vi truyền thống cho HỢP TÁC KINH DOANH (Thiên Can - Địa Chi - Ngũ Hành Nạp Âm - Cung Phi Bát Trạch). ` +
          `Dữ liệu: ${JSON.stringify(ctx)}. ` +
          "Luận sâu mỗi yếu tố ảnh hưởng đến hợp tác làm ăn: Mệnh ai sinh / khắc ai (ai làm chủ - ai phụ tá), Cung Phi đồng hệ Đông/Tây Tứ Mệnh thì hướng VĂN PHÒNG nào hợp cả hai. " +
          "Cảnh báo các trường hợp Tứ Hành Xung trong kinh doanh (Dần-Thân-Tỵ-Hợi, Tý-Ngọ-Mão-Dậu, Thìn-Tuất-Sửu-Mùi) — dễ mâu thuẫn quyết định. " +
          "Gợi ý vai trò: ai phù hợp đối ngoại, ai phù hợp tài chính, ai phù hợp vận hành dựa trên Mệnh ngũ hành. " +
          "Khuyến nghị tỉ lệ góp vốn và cấu trúc cổ phần dựa trên cách hai bên cộng hưởng.",
        western:
          `Người dùng đang xem kết quả Cung Hoàng Đạo phương Tây cho cặp ĐỐI TÁC. ` +
          `Dữ liệu: ${JSON.stringify(ctx)}. ` +
          "Luận sâu cách 2 cung tương tác trong môi trường công việc qua Element (Lửa-quyết liệt / Đất-thực dụng / Khí-giao tiếp / Nước-trực giác) và Modality (Cardinal-khởi xướng / Fixed-bám đuổi / Mutable-thích ứng). " +
          "Phân vai theo phong cách lãnh đạo: ai là nhà sáng lập, ai là người vận hành, ai là người mở rộng thị trường. " +
          "Cảnh báo các xung đột phong cách (Fixed-Fixed dễ bế tắc thay đổi, Mutable-Mutable thiếu kỷ luật). " +
          "Gợi ý 3 nguyên tắc giao tiếp công việc giúp 2 cung này hoà hợp (cuộc họp định kỳ, kênh giao tiếp ưu tiên, cách ra quyết định).",
        "bat-tu":
          `Người dùng đang xem kết quả Bát Tự nhật chủ — áp dụng cho HỢP TÁC KINH DOANH. ` +
          `Dữ liệu: ${JSON.stringify(ctx)}. ` +
          "Luận sâu quan hệ 2 Day Master trong môi trường tài-quan: sinh-khắc-tỉ hoà ảnh hưởng dòng tiền và quyền lực ra sao. " +
          "Giải thích Dụng thần - Kỵ thần của mỗi người tác động lên lựa chọn ngành nghề chung. " +
          "Phân tích ai là 'tài tinh' của ai (mang lại may mắn tiền bạc) và ai là 'kỵ thần' (cần né). " +
          "Gợi ý phong thuỷ VĂN PHÒNG chung: hướng bàn làm việc, màu chủ đạo, vật phẩm kích hoạt tài lộc cho cả hai dụng thần. " +
          "Cảnh báo nếu dụng thần xung đột (ví dụ một người cần Hoả - một người cần Thuỷ → khó chọn ngành chung).",
        numerology:
          `Người dùng đang xem kết quả Thần Số Học Life Path cho cặp ĐỐI TÁC. ` +
          `Dữ liệu: ${JSON.stringify(ctx)}. ` +
          "Luận sâu cách 2 Life Path number cộng hưởng trong môi trường công việc: (a) phong cách quản trị của mỗi số, (b) bài học công việc mà cặp đôi cần học, (c) chu kỳ Personal Year ảnh hưởng đến giai đoạn nào nên tăng tốc / giai đoạn nào nên củng cố. " +
          "Trích dẫn các nhà thần số học nổi tiếng (Dan Millman, Hans Decoz) khi diễn giải. " +
          "Gợi ý NĂM TỐT để khởi nghiệp / mở chi nhánh / ký hợp đồng lớn dựa trên tổ hợp Personal Year của hai bên.",
      };

      const variantPrompt = isBusiness ? variantPromptBusiness : variantPromptMarriage;
      const fallback = isBusiness
        ? `Phương pháp: ${methodLabel}. Dữ liệu: ${JSON.stringify(ctx)}. Phân tích sâu phương pháp này áp dụng vào cặp đối tác kinh doanh.`
        : `Phương pháp: ${methodLabel}. Dữ liệu: ${JSON.stringify(ctx)}. Phân tích sâu phương pháp này áp dụng vào cặp đôi.`;

      return longBase + (variantPrompt[methodKey] ?? fallback);
    }
    default:
      return base;
  }
}

export async function POST(req: NextRequest) {
  let body: Body;
  try {
    body = (await req.json()) as Body;
  } catch {
    return new Response(JSON.stringify({ error: "Invalid JSON body" }), {
      status: 400,
      headers: { "Content-Type": "application/json" },
    });
  }

  const { topic, context, prompt } = body;
  if (!topic || !ALLOWED_TOPICS.has(topic)) {
    return new Response(JSON.stringify({ error: "Topic không hợp lệ." }), {
      status: 400,
      headers: { "Content-Type": "application/json" },
    });
  }
  if (!context || typeof context !== "object") {
    return new Response(JSON.stringify({ error: "Thiếu context dữ liệu." }), {
      status: 400,
      headers: { "Content-Type": "application/json" },
    });
  }

  const userPrompt = (prompt ?? "Phân tích giúp tôi.").slice(0, MAX_PROMPT);
  const sys = systemPromptFor(topic, context);

  const provider = await getProvider();
  const encoder = new TextEncoder();

  const stream = new ReadableStream<Uint8Array>({
    async start(controller) {
      controller.enqueue(encoder.encode(sseEvent({ provider: provider.name })));
      try {
        // Use the lower-level streamMessages API — these tools have their
        // own context shape (dream / bat-tu / i-ching / horoscope / numerology)
        // and don't need the Tử Vi chart prompt builder.
        for await (const chunk of provider.streamMessages([
          { role: "system", content: sys },
          { role: "user", content: userPrompt },
        ])) {
          controller.enqueue(encoder.encode(sseEvent({ delta: chunk })));
        }
        controller.enqueue(encoder.encode(sseEvent({ done: true })));
      } catch (e) {
        const msg = e instanceof Error ? e.message : "AI provider failed";
        controller.enqueue(encoder.encode(sseEvent({ error: msg })));
      } finally {
        controller.close();
      }
    },
  });

  return new Response(stream, {
    headers: {
      "Content-Type": "text/event-stream; charset=utf-8",
      "Cache-Control": "no-cache, no-transform",
      Connection: "keep-alive",
      "X-Accel-Buffering": "no",
    },
  });
}
