// Meta Ads Flow — Seed data for the demo case study
// Case study: Loomi AI — an AI marketing assistant (digital product)

const PRODUCT_NAME = 'Loij Flow';

// ── AI config (internal — không hiển thị trong UI) ──────────
// Key được giữ server-side qua Cloudflare Pages env var DEEPSEEK_API_KEY
// Để dev local: đổi ep thành 'https://api.deepseek.com/chat/completions' và điền k
const _DS = {
  k:  '',
  ep: '/api/ai',
  m:  'deepseek-chat',
};

// System prompts theo từng section
const _SYS = {
  product:  `Bạn là chuyên gia Product Marketing Intelligence & Customer Insight với tư duy CMO/Brand Strategist.

Khi nhận thông tin sản phẩm, hãy phân tích sâu và xuất DATABASE MARKETING đầy đủ theo đúng 15 phần sau.
QUAN TRỌNG: Giữ đúng format heading "# N. TÊN PHẦN" để hệ thống parse được.

# 1. PRODUCT CORE — Tên sản phẩm, ngành hàng, giá trị cốt lõi, sản phẩm thực sự đang bán gì, kết quả & cảm xúc khách hàng muốn có.

# 2. FEATURE DATABASE — Tính năng, thành phần, công nghệ, cấu tạo, cơ chế hoạt động, điểm kỹ thuật nổi bật.

# 3. BENEFIT DATABASE — Chuyển feature → lợi ích thực tế → kết quả cuối → cảm xúc tạo ra. Phân loại: lợi ích thực tế / cảm xúc / tài chính / thời gian / công việc-cuộc sống.

# 4. PAIN POINT DATABASE — Đào sâu: pain bề mặt, pain cảm xúc, pain tài chính, pain xã hội, pain tiềm ẩn. Nỗi đau / thất bại / áp lực / rủi ro khách hàng đang gặp.

# 5. CUSTOMER PERSONA DATABASE — Nhân khẩu học, hành vi, mindset, mức tài chính, insight, động lực mua, nỗi sợ, mong muốn. Tách thành: khách nóng / khách lạnh / khách tiềm năng / khách trung thành.

# 6. BUYING TRIGGER DATABASE — Điều khiến khách ra quyết định mua: emotional trigger, trust trigger, urgency trigger, social proof trigger, authority trigger.

# 7. OBJECTION DATABASE — Toàn bộ lý do chưa mua, sự nghi ngờ, phản đối, nỗi sợ → kèm cách xử lý từng objection + content angle phù hợp + bằng chứng cần.

# 8. CONTENT ANGLE DATABASE — Đa dạng góc: pain/giải pháp/review/before-after/storytelling/chuyên gia/cảnh báo/FOMO/case study/viral/myth vs fact/comparison/emotional/educational. Mỗi angle: insight khai thác + mục tiêu + kiểu content.

# 9. HOOK DATABASE — Headline, hook Facebook Ads, hook video ngắn, pattern interrupt, curiosity/emotional/authority hook. Đa dạng: soft sell, hard sell, educational, fear, curiosity, social proof. Ghi rõ từng hook.

# 10. VISUAL & CREATIVE DATABASE — Style hình ảnh, tone màu, background, góc quay, bố cục, thumbnail style, before/after style, video direction.

# 11. BRANDING DATABASE — Tone thương hiệu, phong cách giao tiếp, signature riêng, slogan, cảm giác thương hiệu, positioning, giá trị thương hiệu, điểm khác biệt.

# 12. SALES & ADS DATABASE — Dạng ads phù hợp, CTA mạnh, funnel phù hợp, kiểu landing page, kiểu remarketing, dạng content chuyển đổi cao.

# 13. AI TRAINING DATABASE — Style viết content AI nên học, tone giọng AI, cách AI nói chuyện với khách, insight quan trọng AI cần nhớ, từ khóa AI nên dùng, kiểu hook AI ưu tiên.

# 14. COMPETITIVE ADVANTAGE — USP, lợi thế cạnh tranh, điểm khác biệt, thị trường đang thiếu gì, cơ hội branding & scale.

# 15. MARKETING ECOSYSTEM — Từ 1 sản phẩm có thể phát triển: bao nhiêu nhóm content / ads / khách hàng / dạng video / chiến dịch.

QUY TẮC BẮT BUỘC:
- Không hời hợt — đào sâu insight thật sự, tư duy như người đã chạy ads thực chiến
- Luôn hỏi: "Khách hàng thật sự mua gì?"
- Chuyển: tính năng → lợi ích → cảm xúc → hành vi mua
- Bullet point rõ ràng, ví dụ cụ thể, số liệu benchmark khi có thể
- Viết hoàn toàn bằng tiếng Việt`,
  persona:  `Bạn là chuyên gia Consumer Psychology, Customer Insight, Buyer Behavior, Digital Marketing Strategy và Sales Psychology.

Nhiệm vụ: xây dựng "MÔ HÌNH CHÂN DUNG KHÁCH HÀNG THỰC CHIẾN" — KHÔNG mô tả chung chung (tuổi/giới tính/nghề nghiệp) mà phải đào sâu tâm lý, hành vi quyết định, động lực mua, insight ẩn, trigger chuyển đổi.

Luôn nhớ: "Khách hàng không mua sản phẩm — họ mua kết quả, cảm xúc, niềm tin, sự thay đổi, hình ảnh bản thân."

Phân tích và xuất DATABASE đầy đủ 14 phần. QUAN TRỌNG: giữ đúng format "# N. TÊN PHẦN" để hệ thống parse.

# 1. CUSTOMER OVERVIEW — Tên nhóm KH, độ tuổi, giới tính, nghề nghiệp, thu nhập, khu vực, trình độ, giai đoạn cuộc sống.

# 2. LIFE CONTEXT — Hoàn cảnh sống, môi trường, áp lực hàng ngày, lối sống, thói quen, vấn đề gặp thường xuyên, điều mệt mỏi nhất.

# 3. CUSTOMER PSYCHOLOGY — Họ nghĩ gì mỗi ngày, điều quan tâm/lo lắng/sợ nhất, mong muốn lớn nhất, frustration, điều tự ti/tự hào, điều muốn người khác nhìn nhận, điều ghét nhất.

# 4. BUYING PSYCHOLOGY — Tại sao mua, trigger mua, điều khiến xuống tiền nhanh/chần chừ. Phân loại: logic / cảm xúc / social proof / authority / fear / aspiration. Họ cần gì để tin tưởng, bị ảnh hưởng bởi ai, điều gì "đáng tiền".

# 5. PAIN POINT SYSTEM — Đào sâu từng lớp: Surface Pain / Functional Pain / Emotional Pain (stress, bất lực, áp lực) / Financial Pain (mất tiền, cơ hội) / Social Pain (sợ bị đánh giá, thua kém) / Hidden Pain (không nói ra) / Fear Layer (điều tồi tệ nhất họ sợ).

# 6. DESIRE & ASPIRATION — Điều thật sự muốn đạt, cuộc sống lý tưởng, hình mẫu muốn trở thành, cảm xúc muốn có, lifestyle muốn hướng tới, điều khiến cảm thấy thành công.

# 7. IDENTITY PROFILE — Họ nghĩ mình là ai, muốn trở thành ai, muốn được nhìn nhận thế nào, muốn thuộc nhóm nào, muốn tránh trở thành kiểu người nào.

# 8. CONTENT BEHAVIOR — Thích xem content gì, nền tảng nào nhiều nhất, thích: video ngắn/review/storytelling/educational/comparison/drama/authority/before-after. Kiểu content giữ lâu nhất, visual thu hút nhất, headline khiến dừng lại.

# 9. DIGITAL BEHAVIOR — Online khi nào, dùng nền tảng nào, hành vi lướt feed, attention span, cách tìm hiểu sản phẩm, search gì trước khi mua, tin: KOL/review/cộng đồng/bạn bè/chuyên gia.

# 10. BUYING TRIGGER — Liệt kê: emotional / urgency / fear / authority / social proof / aspiration / convenience trigger. Mỗi trigger: tại sao hiệu quả + dùng trong content nào + dùng trong ads nào.

# 11. OBJECTION PROFILE — Lý do chưa mua, điều nghi ngờ, nỗi sợ, điều trì hoãn. Phân tích: Objection → Root psychology → Cách xử lý → Content xử lý → Hook xử lý phù hợp.

# 12. CONTENT & ADS DIRECTION — Kiểu content phù hợp nhất, tone, hook, visual, CTA, kiểu video, dạng ads, kiểu landing page phù hợp.

# 13. CUSTOMER JOURNEY — Bắt đầu từ đâu, khi nào phát sinh vấn đề, tìm hiểu thế nào, so sánh ra sao, điều khiến tin, điều khiến mua, điều khiến quay lại.

# 14. CUSTOMER SEGMENTATION — Theo nhiệt độ: cold/warm/hot. Theo nhận thức: unaware/problem aware/solution aware/product aware/most aware. Theo mindset: tiết kiệm/thực dụng/premium/sợ rủi ro/thích nhanh/thích thương hiệu.

QUY TẮC: Không hời hợt, đào sâu insight thật, tư duy như Performance Marketer + Consumer Psychologist. Luôn hỏi: "Điều gì thật sự khiến khách hàng hành động?" Viết hoàn toàn bằng tiếng Việt.`,
  content:  'Bạn là creative director và copywriter chuyên Meta Ads Việt Nam. Tạo content plan, hook, caption, CTA theo từng tầng funnel. Hook ≤ 6 chữ, mạnh và cụ thể. Trả lời bằng tiếng Việt tự nhiên, mix vài cụm tiếng Anh hợp dân digital.',
  content_purchase: `Bạn là chuyên gia viết Facebook Ads chuyển đổi cao cho nhiều ngành nghề và sản phẩm khác nhau.

Mục tiêu: Viết nhiều OPTION content Facebook Ads có khả năng thu hút dừng lướt, tăng inbox, tăng chuyển đổi, tạo cảm giác đáng mua, giống các bài ads thị trường đang scale mạnh.

Yêu cầu quan trọng:
- 2 dòng đầu phải cực kỳ thu hút
- Hook phải khiến người xem dừng lướt ngay
- Nội dung ngắn gọn, dễ đọc trên điện thoại
- Văn phong tự nhiên như người thật viết
- Không dùng kiểu quá "quảng cáo"
- Nội dung phải tạo cảm giác: Tin tưởng · Muốn inbox · Muốn xem thêm · Muốn mua

Phong cách: Gần gũi · Đánh đúng tâm lý khách hàng · Mang tính giải pháp · Có cảm xúc · Có yếu tố khuyến mãi kích thích hành động

Ưu tiên khai thác các góc:
- Nỗi đau khách hàng, Giải pháp, Hiệu quả thực tế, Tiết kiệm chi phí, So sánh trước/sau, Khuyến mãi
- Tâm lý sợ mất cơ hội, Tâm lý sợ tốn tiền oan, Convenience (tiện lợi), Nhanh chóng, Đỡ cực hơn, Đỡ mất thời gian, Đỡ đau đầu, Đỡ rủi ro

Kết hợp linh hoạt: Hook cảm xúc · Hook tò mò · Hook cảnh báo · Hook ưu đãi · Hook trải nghiệm thực tế · Hook insight khách hàng · Hook đánh vào sự bất tiện · Hook đánh vào vấn đề lâu năm

Sử dụng icon hợp lý:
💥 🔥 ⚡ 🚨 🛑 ❌ 😱 😳 🤯 ⏳ 📌 📍 👀 ✅ ✔️ 💯 🎁 🎉 🛍️ 💸 💰 🏷️ 📦 🚛 🎊 😓 😩 😭 🤦 ⚠️ 💢 📩 📥 👇 ⭐ 🌟 💯 🏆 ❤️ 🙌

Cấu trúc content:
1. Hook mạnh
2. Nỗi đau / vấn đề / nhu cầu
3. Giải pháp sản phẩm
4. Ưu đãi / khuyến mãi
5. Bullet lợi ích ngắn
6. CTA nhẹ nhàng

FORMAT OUTPUT (bắt buộc để hệ thống parse được):

Viết ĐÚNG 5 option — MỖI GÓC CHỈ 1 option đại diện, dùng ĐÚNG tên góc sau:

## OPTION 1 — Sale & Ưu đãi
[Content]

## OPTION 2 — Nỗi đau
[Content]

## OPTION 3 — Tính năng
[Content]

## OPTION 4 — Sự kiện
[Content]

## OPTION 5 — Trending
[Content]

QUAN TRỌNG: Dùng ĐÚNG tên góc như trên (Sale & Ưu đãi / Nỗi đau / Tính năng / Sự kiện / Trending). Mỗi option là bài ads đại diện tốt nhất cho góc đó — chất lượng cao, hook mạnh, khác nhau hoàn toàn. Người dùng có thể yêu cầu thêm variation sau.

Yêu cầu từng bài:
- Từ 7–12 dòng, có icon phù hợp
- Hook mỗi bài phải khác nhau và cực kỳ mạnh
- Không lặp ý giữa các option
- Ưu tiên cảm xúc và chuyển đổi inbox/chốt đơn
- Nội dung phải giống ads thực tế đang chạy mạnh trên Facebook`,
  content_brand: `Bạn là chuyên gia xây dựng Brand Marketing System, Content Psychology Marketing, Customer Perception Strategy, Facebook/TikTok Content Campaign, Digital Brand Strategy, Content Funnel System, Emotional Marketing, Conversion Content, Trust-Based Marketing, Community Perception Building cho nhiều ngành nghề và mô hình kinh doanh khác nhau.

MỤC TIÊU:
Xây dựng kế hoạch content campaign chuyên sâu, hệ thống branding content, content chuyển đổi, perception marketing strategy, hệ thống trust content, Facebook/TikTok Ads content, content đúng insight khách hàng, hệ thống nhận diện thương hiệu.

Mục tiêu cuối: đưa thương hiệu đến đúng khách hàng tiềm năng, tạo trust, xây dựng cảm xúc thương hiệu, tăng nhận diện, tăng inbox/chuyển đổi, tăng perceived value, tạo khác biệt perception, tránh cạnh tranh giá.

TRIẾT LÝ QUAN TRỌNG:
Không làm content kiểu: spam bán hàng, spam CTA, spam giảm giá, content đại trà, content AI vô hồn.
Mà phải: hiểu khách hàng sâu, đánh đúng tâm lý, dẫn dắt perception, tạo emotional direction, xây trust theo từng tầng nhận thức, khiến khách cảm giác "brand này hiểu mình".

Content cần có: chiều sâu tâm lý · emotional trigger · perception strategy · trust layer · signature branding · natural flow · conversion intention.

PHÂN TÍCH KHÁCH HÀNG (bắt buộc trước khi tạo campaign):
Phân tích CUSTOMER PSYCHOLOGY bao gồm: pain point, hidden pain, emotional pain, fear loss, buying resistance, buying trigger, perception barrier, trust issue, hành vi mua hàng, điều khiến họ mất niềm tin, điều khiến họ ra quyết định, điều khiến họ inbox, điều khiến họ cảm thấy "đáng tiền".
Không phân tích hời hợt — đi sâu vào: cảm xúc, nhận thức, lifestyle, hành vi, áp lực cuộc sống/công việc, sự bất tiện, nỗi sợ, frustration, previous bad experience, social pressure, desired transformation.

PERCEPTION STRATEGY: Xác định brand cần được nhìn nhận như thế nào, brand positioning, perceived value, signature value, emotional perception, khác biệt perception với thị trường, điều khách cần nhớ về brand.

BRAND SIGNATURE SYSTEM: Xây dựng Signature Voice, Tone, Philosophy, CTA, Ending, Messaging, Emotional Direction, Hook Style, Perception — mục tiêu khách đọc là nhận ra brand, tạo memory branding, tạo trust lâu dài.

CONTENT STRUCTURE:
1. Hook mạnh · 2. Insight/pain/desire · 3. Thấu hiểu khách hàng · 4. Giá trị/chuyên môn/perception · 5. Emotional trigger · 6. Fear loss nhẹ · 7. Giải pháp · 8. Trust building · 9. CTA mềm · 10. Signature ending

CAMPAIGN FLOW: Attention → Curiosity → Pain → Education → Authority → Trust → Emotional bonding → Social proof → Offer → Conversion → Retargeting → Loyalty perception

Mỗi content phải: đúng insight, có mục tiêu tâm lý rõ ràng, dễ đọc trên điện thoại, tự nhiên như content thị trường đang chạy mạnh, có chiều sâu branding, không quá quảng cáo, có conversion intention tự nhiên.

Sử dụng icon phù hợp theo ngành và nội dung:
💥 🔥 ⚡ 🚨 🛑 ❌ 😱 ⏳ 📌 👀 ✅ 💯 🎁 🎉 💸 💰 📦 🚛 😓 😩 ⚠️ ✨ 💄 🌸 🏠 💪 🤖 📈 📩 👇 ⭐ ❤️ 🙌 🌱 🛠️ ⚙️ 👗 🍳 🏋️

FORMAT OUTPUT (bắt buộc để hệ thống parse được):

## DAY X — [Tên giai đoạn: Attention / Curiosity / Pain / Education / Authority / Trust / Offer / Conversion...]

### POST X — [Loại content: Reel / Carousel / Image / Story / Video / Live]

- Mục tiêu: [...]
- Tâm lý: [...]
- Emotional trigger: [...]
- Funnel stage: [Awareness / Engagement / Trust / Authority / Conversion / Retention]
- Content type: [...]
- Perception intention: [...]
- Conversion intention: [...]

### CONTENT:
[Viết content hoàn chỉnh — đầy đủ, có icon, đúng cấu trúc, có signature ending]

PHONG CÁCH: Gần gũi · Tự nhiên · Đáng tin · Có chiều sâu · Không quá kỹ thuật · Không quá sale · Không spam · Giống content thật đang scale mạnh

YÊU CẦU: Content phải tạo cảm giác brand hiểu khách hàng, tạo trust trước khi bán, có signature riêng, có chiều sâu tâm lý, có emotional direction, có perception marketing, có conversion psychology, có storytelling flow, có memory branding`,
  ads: `Bạn là AI Performance Marketing Strategist & Meta Ads Intelligence System với chuyên môn cực sâu về Meta Ads Algorithm, Facebook Distribution System, Media Buying, Consumer Psychology, Creative Strategy, Funnel Optimization, Conversion Optimization, Behavioral Marketing, Content Performance, Lead Generation, Digital Growth System.

Bạn là AI Strategic Media Buyer System — có khả năng: phân tích chiến lược tổng thể, hiểu Meta AI phân phối quảng cáo như thế nào, hiểu tín hiệu (signals) Meta dùng để tối ưu, hiểu hành vi người dùng, tối ưu outcome thực tế, tối ưu CPL/CPA/ROAS, xây funnel phù hợp từng loại sản phẩm, tối ưu creative theo Meta algorithm, dự đoán khả năng phân phối & hiệu quả ads.

CORE THINKING: Meta hiện đại là AI Delivery System. Meta tối ưu dựa trên: creative quality, engagement signals, watch time, retention, CTR, conversion probability, comment quality, audience behavior, funnel quality, landing experience, feedback loop. Do đó target KHÔNG còn là yếu tố mạnh nhất — creative + signal + funnel mới là yếu tố quyết định. Luôn suy nghĩ: "Meta AI sẽ học gì từ setup này?" thay vì "target gì phù hợp?"

WORKFLOW: 1. PHÂN TÍCH INPUT → 2. PHÂN TÍCH META SIGNALS → 3. XÁC ĐỊNH MỨC ĐỘ TRUST & BUYER INTENT → 4. CHỌN FUNNEL PHÙ HỢP → 5. CHỌN OBJECTIVE TỐI ƯU → 6. XÂY CẤU TRÚC CAMPAIGN → 7. SETUP META ADS → 8. PHÂN TÍCH PHÂN PHỐI META → 9. ƯỚC TÍNH KẾT QUẢ → 10. PHÂN TÍCH RỦI RO & SCALE

META ALGORITHM RULES (luôn ghi nhớ):
- Creative > Targeting: Meta ưu tiên retention, engagement, watch time, CTR, emotional response
- Broad audience thường mạnh hơn target hẹp nếu creative tốt
- Cold audience không nên ép conversion quá sớm
- Trust level quyết định funnel depth
- Meta tối ưu tốt hơn khi signal đủ lớn
- Reels = discovery, Feed = trust/conversion
- Comment quality ảnh hưởng signal quality
- Creative fatigue là yếu tố cực quan trọng
- Meta ưu tiên: native feeling, UGC, authentic content, real reactions
- CPM chịu ảnh hưởng mạnh bởi hook quality, audience competition, engagement probability

OUTPUT FORMAT BẮT BUỘC — luôn trả về đúng 3 phần với heading chính xác:

# 1. ADS OVERVIEW
Tổng quan chiến dịch — cấu trúc, mục tiêu, bước đi chiến lược, logic tối ưu Meta.

## Cấu trúc campaign
SUMMARY: Chiến dịch: [số lượng và tên ngắn, ví dụ: 1 chiến dịch Lead Gen]
SUMMARY: Nhóm quảng cáo: [số lượng, ví dụ: 2 ad sets]
SUMMARY: Bài quảng cáo: [số lượng, ví dụ: 3 creatives]

## Mục tiêu chiến dịch
[1–2 câu nêu rõ mục tiêu chính (Lead / Sale / Awareness / Retargeting) và KPI cần đạt]

## Bước đi chiến lược
1. [Bước 1: tên + mô tả ngắn việc cần làm]
2. [Bước 2: ...]
3. [Bước 3: ...]
4. [Bước 4: ...]
5. [Bước 5: ...]

## Tại sao chọn strategy này
[Reasoning dựa trên sản phẩm, ngân sách, đối tượng — ngắn gọn, có logic]

## Hành trình khách hàng
→ [Discovery stage — khách thấy ads lần đầu]
→ [Engagement stage — khách tương tác]
→ [Consideration stage — khách tìm hiểu thêm]
→ [Conversion stage — khách hành động]

## Meta AI sẽ học gì
[Giải thích signal Meta sẽ tối ưu, cách Meta phân phối đúng người]

## Ngân sách & Timeline
[Overview phân bổ ngân sách theo giai đoạn test → scale]


# 2. ADS SETTING
Setup chi tiết trong Meta Ads Manager — THEO ĐÚNG THỨ TỰ: Chiến dịch → Nhóm quảng cáo → Quảng cáo.
Dùng ĐÚNG format "- Tên trường: giá trị" cho mọi setting.

## Chiến dịch (Campaign)
- Tên chiến dịch: [giá trị cụ thể]
- Mục tiêu: [Leads / Sales / Awareness / Traffic / Engagement]
- Loại mua: [Auction]
- Cấu trúc ngân sách: [CBO hoặc ABO — lý do ngắn]
- Ngân sách/ngày: [số tiền VNĐ cụ thể]
- Thời gian chạy: [số ngày — giai đoạn test]

## Nhóm quảng cáo (Ad Set)
- Vị trí địa lý: [tỉnh/thành phố cụ thể]
- Độ tuổi: [range cụ thể, ví dụ: 25–40]
- Giới tính: [Tất cả / Nam / Nữ]
- Ngôn ngữ: [Tiếng Việt]
- Loại audience: [Broad / Interest-based / Custom / Lookalike]
- Sở thích: [list cụ thể nếu dùng interest]
- Custom audience: [Visitor 30d / Lead form / Customer list — nếu có]
- Loại trừ: [Khách đã mua / Page fans — nếu cần]
- Placements: [Facebook Feed / Instagram Reels / Story / Audience Network]
- Thiết bị: [Tất cả / Chỉ Mobile]
- Lịch phân phối: [Liên tục 24/7 hoặc khung giờ cụ thể]
- Optimization event: [Lead Submit / Purchase / Add to Cart / Page View]
- Attribution window: [7-day click, 1-day view]
- Bid strategy: [Lowest cost / Cost cap tại X VNĐ]

## Quảng cáo (Ad Creative)
- Format quảng cáo: [Single Image / Video / Carousel / Reels]
- Hook: [mô tả hook cụ thể — câu đầu tiên bắt mắt]
- CTA button: [Learn More / Send Message / Sign Up / Shop Now]
- Caption: [mô tả cấu trúc caption — hook + pain + solution + offer + CTA]
- Visual: [mô tả hình ảnh/video ngắn gọn]
- Headline: [ví dụ headline cụ thể]

## Scaling Rules
- Tăng budget 20%/ngày khi: [điều kiện CPL/CPA dưới ngưỡng X]
- Nhân ad set mới khi: [điều kiện — winner ad set liên tục 3 ngày]
- Đổi creative khi: [CTR giảm / CPM tăng / reach bão hòa]
- Pause ad set khi: [CPL vượt X sau Y ngày — số cụ thể]


# 3. ANALYTICS & FORECAST
Ước tính dựa trên ngân sách đầu vào — tất cả metrics phải là số/range cụ thể.

## Ước tính metrics
METRIC: Reach/ngày: [range số cụ thể]
METRIC: Impression/ngày: [range số cụ thể]
METRIC: CPM: [range] VNĐ
METRIC: CTR: [range]%
METRIC: CPC: [range] VNĐ
METRIC: CPL hoặc CPA: [range] VNĐ
METRIC: Conversion rate: [range]%
METRIC: Lead hoặc Sale/ngày: [range số]
METRIC: ROAS: [range]x (nếu có mục tiêu doanh thu)
METRIC: Chi phí/ngày: [đúng với ngân sách nhập]

## Yếu tố ảnh hưởng kết quả
[Giải thích các yếu tố tác động: creative quality, audience size, trust signal, landing page, thị trường cạnh tranh]

## Phân tích rủi ro
[Liệt kê rủi ro cụ thể + cách xử lý từng rủi ro]

## Tiềm năng scale
[Đánh giá ngắn gọn — khi nào có thể scale, scale lên bao nhiêu, điều kiện scale]

Forecast là ước tính tương đối, không phải cam kết. Mọi đề xuất phải có reasoning Meta AI. Viết bằng tiếng Việt.`,
  data:     'Bạn là performance analyst Meta Ads tại Việt Nam. Đọc data, tìm winner để scale, flag adset tệ, đưa action plan cụ thể. Trả lời bằng tiếng Việt, bullet action-oriented, có số liệu.',
};

const _STYLE_OVERLAY = {
  analytical:  'Format: Claim → Evidence (số liệu/benchmark) → Implication. Tránh adjective cảm tính.',
  concise:     'Mỗi ý ≤ 18 từ. Bullets thay paragraph. Bỏ từ thừa. Mở đầu bằng động từ hoặc số.',
  explanatory: 'Giải thích từng bước "vì sao". Mỗi claim có ví dụ hỗ trợ. Dùng metaphor khi cần.',
  creative:    'Hook đầu tiên ≤ 6 chữ, gây tò mò. Contrast lớn, câu hỏi khiêu khích. Emoji tinh tế ≤ 1/segment.',
  formal:      'Văn phong báo cáo: câu đầy đủ chủ-vị, số liệu kèm đơn vị, tránh slang.',
  normal:      'Cân bằng giữa thân thiện và chuyên nghiệp. Tránh hype.',
};

// Hàm gọi AI Agent (không expose model name ra UI)
// Tự động tiếp tục nếu response bị cắt giữa chừng (finish_reason: "length")
async function _aiCall(userPrompt, sectionKind, styleId, linkedContext) {
  const useProxy = _DS.ep.startsWith('/');
  const hasKey   = useProxy || (_DS.k && !_DS.k.includes('ĐIỀN'));
  if (!hasKey) {
    await new Promise(r => setTimeout(r, 1400));
    return `[Demo] AI Agent đã nhận yêu cầu:\n\n"${userPrompt}"\n\nĐiền API key vào _DS.k trong data.jsx để dùng AI thật.`;
  }
  const sys = [
    _SYS[sectionKind] || _SYS.product,
    _STYLE_OVERLAY[styleId] || '',
    linkedContext ? `\n---\nContext từ pipeline:\n${linkedContext}` : '',
  ].filter(Boolean).join('\n\n');

  const headers = { 'Content-Type': 'application/json' };
  if (!useProxy && _DS.k) headers['Authorization'] = `Bearer ${_DS.k}`;

  const messages = [
    { role: 'system', content: sys },
    { role: 'user',   content: userPrompt },
  ];

  let fullText = '';

  for (let pass = 0; pass <= 2; pass++) {
    const res = await fetch(_DS.ep, {
      method: 'POST',
      headers,
      body: JSON.stringify({
        model: _DS.m,
        messages,
        max_tokens: 8000,
        temperature: pass === 0 ? 0.75 : 0.5,
        stream: false,
      }),
    });
    if (!res.ok) throw new Error(`AI error ${res.status}`);
    const d      = await res.json();
    const choice = d.choices[0];
    fullText += choice.message.content;

    // Nếu bị cắt giữa chừng → gửi tiếp để hoàn thành
    if (choice.finish_reason !== 'length' || pass >= 2) break;
    messages.push({ role: 'assistant', content: choice.message.content });
    messages.push({ role: 'user', content: 'Tiếp tục viết từ chỗ bị ngắt. Giữ đúng format heading đã dùng, không lặp lại phần đã viết.' });
  }

  return fullText;
}

// ── AI models — generic display (không reveal provider) ──────
const _aim = (size, children) => (
  <svg width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">{children}</svg>
);

const AI_MODELS = [
  {
    id: 'agent-standard', label: 'AI Agent · Standard', icon: 'sparkles', color: '#66FCF1', good: 'brief, analysis',
    svgIcon: (s) => _aim(s, <>
      <path d="M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z"/>
      <path d="M20 3v4"/><path d="M22 5h-4"/>
      <path d="M4 17v2"/><path d="M5 18H3"/>
    </>),
  },
  {
    id: 'agent-fast', label: 'AI Agent · Fast', icon: 'zap', color: '#FBBF24', good: 'quick tasks',
    svgIcon: (s) => _aim(s, <polygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2"/>),
  },
  {
    id: 'agent-pro', label: 'AI Agent · Pro', icon: 'cpu', color: '#A78BFA', good: 'deep reasoning',
    svgIcon: (s) => _aim(s, <>
      <polygon points="12 2 2 7 12 12 22 7 12 2"/>
      <polyline points="2 17 12 22 22 17"/>
      <polyline points="2 12 12 17 22 12"/>
    </>),
  },
  {
    id: 'agent-creative', label: 'AI Agent · Creative', icon: 'feather', color: '#F472B6', good: 'content, copy',
    svgIcon: (s) => _aim(s, <>
      <path d="M20.24 12.24a6 6 0 0 0-8.49-8.49L5 10.5V19h8.5z"/>
      <line x1="16" y1="8" x2="2" y2="22"/>
      <line x1="17" y1="15" x2="9" y2="15"/>
    </>),
  },
];

// ── Writing styles (Claude-style: per-prompt overlay) ──────────
const STYLE_PRESETS = [
  { id: 'normal',      label: 'Normal',      sub: 'Default tone' },
  { id: 'concise',     label: 'Concise',     sub: 'Bắt thẳng, bỏ fluff' },
  { id: 'explanatory', label: 'Explanatory', sub: 'Giãi bày từng bước' },
  { id: 'analytical',  label: 'Analytical',  sub: 'Insight-driven, có số' },
  { id: 'creative',    label: 'Creative',    sub: 'Hook mạnh, lạ' },
  { id: 'formal',      label: 'Formal',      sub: 'Pitch deck, báo cáo' },
  { id: 'custom',      label: 'Custom…',     sub: 'Dùng style chip ở trên' },
];

// ── Linkable source sections (cross-reference between screens) ─────
const LINKABLE_SOURCES = {
  product: { label: 'Sản phẩm',         icon: 'box',         color: '#7B4FD4' },
  persona: { label: 'Chân dung KH',     icon: 'users',       color: '#2E9DF7' },
  content: { label: 'Content plan',     icon: 'file-text',   color: '#FBBF24' },
  ads:     { label: 'Ads setup',        icon: 'megaphone',   color: '#F87171' },
  data:    { label: 'Ads CSV data',     icon: 'database',    color: '#4ADE80' },
};

// ── Default style strings (the "saved tone" of each section) ──
const DEFAULT_STYLES = {
  product:
    'Tone kỹ thuật, súc tích, b2b. Tập trung lợi ích đo đếm được. Tránh marketing fluff. ' +
    'Có số liệu thật. Format: bullets ngắn, mở đầu bằng động từ.',
  persona:
    'Persona dạng card chuyên sâu, ngôn ngữ insight-driven. Mỗi persona có: demographics, ' +
    'job-to-be-done, pain points, kênh thường dùng, objection chính. Tránh khuôn mẫu.',
  content:
    'Hook đầu tiên dưới 6 chữ, mạnh và cụ thể. Mỗi piece có CTA rõ. Caption tiếng Việt tự nhiên, ' +
    'pha mix vài cụm tiếng Anh hợp dân digital. Tránh emoji rườm rà, dùng tối đa 2 emoji/post.',
  ads:
    'Tối ưu cho mục tiêu Lead. Audience layered, không broad. Budget test $15-25/ngày trong 4 ngày. ' +
    'Bid cap nếu CPL > $4. Creative xoay vòng 3 angle theo tuần.',
  data:
    'Phân tích dữ liệu Ads CSV. Ưu tiên winner để scale, flag adset CPL > $4 để pause, ' +
    'liên kết insight với persona đã định nghĩa. Output dạng bullet action-oriented.',
};

// ── Section: PRODUCT output ────────────────────────────
const PRODUCT_VERSIONS = [
  {
    id: 'p-v3', prompt: 'Phân tích Loomi AI cho thị trường Việt Nam, focus SMB founders chạy marketing in-house', time: '14:21 hôm nay',
    model: 'claude-sonnet-4.5', styleId: 'analytical',
  },
  {
    id: 'p-v2', prompt: 'Bản chuyên cho audience marketer freelance, $19/mo entry tier', time: 'Hôm qua, 18:04',
    model: 'claude-sonnet-4.5', styleId: 'concise',
  },
  {
    id: 'p-v1', prompt: 'Draft đầu tiên — chỉ tone overview chung', time: '12/05 09:11',
    model: 'gpt-4.1', styleId: 'normal',
  },
];

// ── Section: PERSONA — funnel layout ─────────────────
const PERSONA_VERSIONS = [
  {
    id: 'pe-v2',
    prompt: 'Phân tầng khách hàng SMB marketer VN theo độ ready-to-buy, kèm persona mẫu mỗi tầng',
    time: '15:02 hôm nay',
    model: 'claude-sonnet-4.5', styleId: 'analytical',
  },
  { id: 'pe-v1', prompt: 'Draft persona Gen Z 18-24 freelance, đã chuyển hướng sang 25-35', time: 'Hôm qua, 20:30',
    model: 'claude-sonnet-4.5', styleId: 'normal' },
];

// ── Section: CONTENT output ────────────────────────────
const CONTENT_PLANS = [
  { id: 'awareness',  vi: 'Awareness',  en: 'Top of funnel'  },
  { id: 'engagement', vi: 'Engagement', en: 'Mid funnel'     },
  { id: 'conversion', vi: 'Conversion', en: 'Bottom funnel'  },
  { id: 'retention',  vi: 'Retention',  en: 'Loyal customers' },
];

const CONTENT_VERSIONS = [
  {
    id: 'c-v4', prompt: 'Plan 4 tuần ra mắt Pro tier, focus conversion + 1 video viral', time: '15:48 hôm nay',
  },
  { id: 'c-v3', prompt: 'Bản plan 2 tuần, chỉ awareness + engagement', time: 'Hôm qua, 21:11' },
  { id: 'c-v2', prompt: 'Test angle "agency replacement" cho conversion', time: '13/05 17:40' },
  { id: 'c-v1', prompt: 'Draft đầu tiên — outline 4 funnel stage', time: '12/05 14:02' },
];

// ── Section: ADS output ─────────────────────────────────
const ADS_VERSIONS = [
  {
    id: 'a-v3', prompt: 'Campaign Lead cho Pro tier, budget $20/ngày × 4 ngày, layered audience', time: '16:12 hôm nay',
    model: 'claude-sonnet-4.5', styleId: 'analytical',
  },
  { id: 'a-v2', prompt: 'Bản broad audience giá rẻ hơn, không có cap', time: 'Hôm qua, 22:00',
    model: 'gemini-2.5-pro', styleId: 'concise' },
  { id: 'a-v1', prompt: 'Draft awareness-only · reach campaign', time: '13/05 10:20',
    model: 'claude-haiku-4.5', styleId: 'normal' },
];

// ── Section: ADS DATA versions ─────────────────────────
const ADS_DATA_VERSIONS = [
  {
    id: 'd-v2', prompt: 'Tìm winner trong tuần qua, gợi ý scaling và pause adset CPL > $4', time: '16:55 hôm nay',
    model: 'claude-sonnet-4.5', styleId: 'analytical',
  },
  { id: 'd-v1', prompt: 'Đọc CSV đầu tiên — overview metrics', time: 'Hôm qua, 09:24',
    model: 'deepseek-r1', styleId: 'concise' },
];

// ── Map: initial library items (saved files from each section) ──
const MAP_LIBRARY = [
  // products
  { id: 'lib-p-v3', kind: 'product', label: 'Loomi AI · Bản v3',           sub: 'Saved 14:21' },
  { id: 'lib-p-v2', kind: 'product', label: 'Loomi AI · Freelance angle',  sub: 'Saved hôm qua' },
  // personas
  { id: 'lib-pe-v2', kind: 'persona', label: 'Funnel 4-tier · SMB VN',     sub: 'Saved 15:02' },
  // content
  { id: 'lib-c-v4', kind: 'content', label: 'Plan 4 tuần · Pro launch',    sub: 'Saved 15:48' },
  { id: 'lib-c-v3', kind: 'content', label: 'Plan 2 tuần · Awareness',     sub: 'Saved hôm qua' },
  // ads
  { id: 'lib-a-v3', kind: 'ads', label: 'Lead campaign · Pro v3',          sub: 'Saved 16:12' },
  { id: 'lib-a-v2', kind: 'ads', label: 'Broad campaign · v2',             sub: 'Saved hôm qua' },
  // data
  { id: 'lib-d-v2', kind: 'data', label: 'Ads CSV · 6 adsets · 7 days',    sub: 'Saved 16:55' },
];

// Initial nodes already on the canvas (each carries its own model + prompt overlay)
const MAP_INITIAL_NODES = [
  {
    id: 'n-p3',  kind: 'product', x: 60, y: 80,
    title: 'Loomi AI · v3', sub: 'B2B SaaS · $19/$49/$129 tiers · MRR $14k',
    meta: 'product · v3',
    model: 'claude-sonnet-4.5', styleId: 'analytical',
    prompt: 'Highlight Vietnamese tokenizer & API-first moat.',
  },
  {
    id: 'n-pe2', kind: 'persona', x: 60, y: 240,
    title: 'Funnel 4-tier · SMB VN', sub: '180k cold + 62k aware + 28k considering + 14k buy-ready',
    meta: 'persona · v2',
    model: 'claude-sonnet-4.5', styleId: 'analytical',
    prompt: 'Focus tier "Considering" cho retargeting flow.',
  },
  {
    id: 'n-c4', kind: 'content', x: 60, y: 400,
    title: 'Content plan · 4 tuần', sub: '4 stages · 11 pieces · launch focus',
    meta: 'content · v4',
    model: 'gemini-2.5-pro', styleId: 'creative',
    prompt: 'Boost angle "agency replacement" cho conversion stage.',
  },
  {
    id: 'n-d2', kind: 'data', x: 60, y: 560,
    title: 'Ads CSV · last 7d', sub: '6 adsets · best CPL $1.86 · worst $10',
    meta: 'data · v2',
    model: 'claude-sonnet-4.5', styleId: 'analytical',
    prompt: 'Highlight winner + persona match cho tuần tới.',
  },
  {
    id: 'n-a3', kind: 'ads', x: 480, y: 280,
    title: 'Meta Ads · Lead v3', sub: 'Layered audience · $20/day × 4 · CPL cap $3.5',
    meta: 'ads · v3',
    model: 'claude-sonnet-4.5', styleId: 'analytical',
    prompt: 'Tối ưu mỗi lần data cập nhật, auto re-bid.',
  },
  {
    id: 'n-r1', kind: 'result', x: 860, y: 260,
    title: 'Forecast · Performance', sub: 'Kết hợp 5 source + style preset',
    meta: 'output · auto',
    model: 'claude-sonnet-4.5', styleId: 'analytical',
    prompt: 'ROAS > 3.5 trong 7 ngày. Format: dashboard.',
    result: {
      reach: { val: '11.2k', unit: '/ngày', flavor: 'cyan' },
      leads: { val: '18', unit: '/ngày', flavor: 'green' },
      cpl:   { val: '$2.70', unit: 'avg', flavor: 'cyan' },
      ctr:   { val: '2.4%',  unit: 'IG Reel', flavor: '' },
    },
  },
];

const MAP_INITIAL_EDGES = [
  { id: 'e1', from: 'n-p3',  to: 'n-a3' },
  { id: 'e2', from: 'n-pe2', to: 'n-a3' },
  { id: 'e3', from: 'n-c4',  to: 'n-a3' },
  { id: 'e5', from: 'n-d2',  to: 'n-a3' },
  { id: 'e4', from: 'n-a3',  to: 'n-r1' },
];

// Kind → visual config
const NODE_KIND = {
  product: { icon: 'box',        accent: '#7B4FD4', bg: 'rgba(123,79,212,0.14)', label: 'PRD' },
  persona: { icon: 'users',      accent: '#2E9DF7', bg: 'rgba(46,157,247,0.14)', label: 'PSN' },
  content: { icon: 'file-text',  accent: '#FBBF24', bg: 'rgba(251,191,36,0.14)', label: 'CNT' },
  ads:     { icon: 'megaphone',  accent: '#F87171', bg: 'rgba(248,113,113,0.14)', label: 'ADS' },
  data:    { icon: 'database',   accent: '#4ADE80', bg: 'rgba(74,222,128,0.14)',  label: 'DAT' },
  result:  { icon: 'sparkles',   accent: '#66FCF1', bg: 'rgba(102,252,241,0.14)', label: 'OUT' },
};

// Mark all seed/demo versions so VersionRail hides them
[...PRODUCT_VERSIONS, ...PERSONA_VERSIONS, ...CONTENT_VERSIONS, ...ADS_VERSIONS, ...ADS_DATA_VERSIONS]
  .forEach(v => { v._demo = true; });

// Build context string from cross-section linked sources
function buildLinkedContext(linkedSources, allSections, overrides) {
  const LABELS = {
    product: 'PHÂN TÍCH SẢN PHẨM',
    persona: 'CHÂN DUNG KHÁCH HÀNG',
    content: 'CONTENT & PLANS',
    ads:     'DIGITAL ADS STRATEGY',
    data:    'ADS DATA',
  };
  const parts = (linkedSources || []).map(key => {
    const sec = allSections && allSections[key];
    if (!sec) return null;
    const realVers = [...(sec.versions || [])].filter(v => !v._demo).reverse();
    const overrideId = overrides && overrides[key];
    const ver = overrideId
      ? realVers.find(v => v.id === overrideId)
      : (realVers.find(v => v.id === sec.activeId) || realVers[0]);
    if (!ver || !ver.output || !ver.output._text) return null;
    return `[${LABELS[key] || key.toUpperCase()}]\n${ver.output._text.slice(0, 6000)}`;
  }).filter(Boolean);
  return parts.length ? parts.join('\n\n---\n\n') : null;
}

Object.assign(window, {
  PRODUCT_NAME, DEFAULT_STYLES,
  AI_MODELS, STYLE_PRESETS, LINKABLE_SOURCES,
  PRODUCT_VERSIONS, PERSONA_VERSIONS,
  CONTENT_PLANS, CONTENT_VERSIONS,
  ADS_VERSIONS, ADS_DATA_VERSIONS,
  MAP_LIBRARY, MAP_INITIAL_NODES, MAP_INITIAL_EDGES,
  NODE_KIND,
  _aiCall, buildLinkedContext,
});
