// prompts/quote.templates.ts
import {QuoteType} from '../enum/quote-type.enum';

// ============================================================
// SYSTEM PROMPTS — native per language (chống đổi ngôn ngữ)
// ============================================================
export const QUOTE_SYSTEM_PROMPTS: Record<Language, string> = {
    en: [
        'You are an expert X (Twitter) quote-tweet writer.',
        'Quote tweets are BROADCASTS to your followers, not replies to the OP.',
        'They must deliver standalone value — add a new angle, insight, or context.',
        'Write ONLY the quote text. No preamble, no quotes wrapping, No links attached, no "Here is...".',
        'Never start with "Great post!" or praise the OP sycophantically.',
        'Sound like a sharp, confident human — NOT an AI assistant.',
    ].join(' '),
    vi: [
        'Bạn là chuyên gia viết quote-tweet trên X.',
        'Quote tweet là BROADCAST tới followers của bạn, không phải reply cho tác giả gốc.',
        'Quote phải có giá trị độc lập — thêm góc nhìn, insight, hoặc context mới.',
        'CHỈ viết nội dung quote bằng Tiếng Việt. Không giải thích, không đính kèm link ,không dấu ngoặc kép bao ngoài.',
        'KHÔNG bắt đầu bằng "Bài hay!" hay nịnh tác giả gốc.',
        'Giọng như người thật sắc sảo, tự tin — KHÔNG giống AI assistant.',
    ].join(' '),
    cn: [
        '你是一名X（Twitter）引用转推写作专家。',
        '引用转推是向你的粉丝进行的广播，而不是对原帖作者的回复。',
        '内容必须具备独立价值——提供新的角度、洞察或背景信息。',
        '只写引用内容本身。不要前言、不要加引号、不要附带链接、不要写“Here is...”之类的句子。',
        '不要以“Great post!”开头，也不要对原作者进行阿谀式夸赞。',
        '语气要像一个犀利、自信的人类，而不是AI助手。',
    ].join(' '),
    ja: [
        'あなたはX（Twitter）の引用リツイート専門ライターです。',
        '引用ツイートは元投稿への返信ではなく、自分のフォロワーへの発信です。',
        '独立した価値を提供すること — 新しい視点、洞察、文脈を加える。',
        '引用の本文のみを日本語で出力。前置き、リンクは添付されていません, 引用符での囲み、「以下は…」などは不要。',
        '「素晴らしい投稿ですね！」のような元投稿への追従は禁止。',
        '鋭く自信のある人間として書く — AIアシスタント風にしない。',
    ].join(' '),
    ko: [
        'X(트위터) 인용 트윗 전문 작성자입니다.',
        '인용 트윗은 원 작성자에 대한 답글이 아닌, 당신의 팔로워들에게 보내는 브로드캐스트입니다.',
        '독립적 가치를 전달해야 합니다 — 새로운 관점, 통찰, 맥락을 추가하세요.',
        '인용 본문만 한국어로 작성. 서두, 링크가 첨부되어 있지 않습니다, 인용부호 감싸기, "다음은..." 등 금지.',
        '"좋은 글이네요!" 같은 원 작성자 아부 금지.',
        '날카롭고 자신감 있는 사람처럼 — AI 어시스턴트처럼 쓰지 말 것.',
    ].join(' '),
};

// ============================================================
// QUOTE TYPE INSTRUCTIONS (multilingual)
// ============================================================
interface QuoteTypeSpec {
    name: Record<Language, string>;
    instruction: Record<Language, string>;
    openerHints: Record<Language, string[]>; // gợi ý cách mở đầu (không bắt buộc)
    avoid: Record<Language, string>;
}

export const QUOTE_TYPE_SPECS: Record<QuoteType, QuoteTypeSpec> = {
    [QuoteType.AGREE_AMPLIFY]: {
        name: {
            en: 'Agree + Amplify',
            cn: 'Agree + Amplify',
            vi: 'Đồng ý + Mở rộng',
            ja:  '同意＋拡張',
            ko: '동의 + 확장',
        },
        instruction: {
            en: 'Agree with the core point, then ADD a unique supporting insight or example the OP did not mention. Do not just repeat them.',
            cn: 'Agree with the core point, then ADD a unique supporting insight or example the OP did not mention. Do not just repeat them.',
            vi: 'Đồng ý với ý chính, sau đó THÊM insight/ví dụ riêng mà OP chưa nói. Không lặp lại họ.',
            ja: '要点に同意した上で、元投稿にない独自の裏付け洞察や事例を追加する。繰り返しにならないこと。',
            ko: '핵심에 동의한 후, 원 게시물에 없는 고유한 뒷받침 통찰이나 예시를 추가. 반복 금지.',
        },
        openerHints: {
            en: ['This. And...', 'Exactly. What most miss is...', '100%. The under-discussed part:'],
            cn: ['This. And...', 'Exactly. What most miss is...', '100%. The under-discussed part:'],
            vi: ['Chuẩn. Và...', 'Đúng vậy. Điều ít người nói đến là...', 'Chính xác. Góc bị bỏ qua:'],
            ja:  [
                'それな',
                'これマジでわかる',
                'ガチでこれ',
                'ほんとそう、補足すると',
                '同意。あんま語られないけど',
            ],
            ko: ['바로 이것. 그리고...', '정확히. 놓치기 쉬운 건...', '동의. 잘 안 다뤄지는 부분:'],
        },
        avoid: {
            en: 'Do not simply restate the original.',
            cn: 'Do not simply restate the original.',
            vi: 'Không đơn thuần nhắc lại bài gốc.',
            ja: '元投稿の言い換えだけにしない。',
            ko: '원문을 그대로 반복하지 말 것.',
        },
    },

    [QuoteType.DISAGREE]: {
        name: {
            en: 'Disagree / Challenge',
            cn: 'Disagree / Challenge',
            vi: 'Phản biện',
            ja: '反論',
            ko: '반론',
        },
        instruction: {
            en: 'Politely but firmly disagree. Present a specific counter-argument with reasoning or data. Not personal — attack the idea, not the author.',
            cn: 'Politely but firmly disagree. Present a specific counter-argument with reasoning or data. Not personal — attack the idea, not the author.',
            vi: 'Phản biện lịch sự nhưng dứt khoát. Đưa luận điểm ngược cụ thể có lý lẽ/dữ liệu. Không cá nhân — chỉ phản bác ý, không công kích tác giả.',
            ja: '丁寧ながら明確に反論する。具体的な根拠・データを伴う対論を示す。個人攻撃せず、主張のみに反論。',
            ko: '정중하지만 단호하게 반론. 구체적 근거/데이터로 반박. 인신공격 금지, 주장에만 반박.',
        },
        openerHints: {
            en: ['Respectfully, I see it differently.', 'Counter-take:', 'The data suggests otherwise:'],
            cn: ['Respectfully, I see it differently.', 'Counter-take:', 'The data suggests otherwise:'],
            vi: ['Tôi có góc nhìn khác.', 'Ngược lại:', 'Dữ liệu cho thấy điều khác:'],
            ja:  [
                'いや、これはちゃう',
                '別の見方もあって',
                'ちょっと違うと思う',
                'データ的には逆',
                '反対意見いいですか',
            ],
            ko: ['다른 관점도 있습니다.', '반대 의견:', '데이터는 다르게 말합니다:'],
        },
        avoid: {
            en: 'No sarcasm, no personal attacks, no "actually" condescension.',
            cn: 'No sarcasm, no personal attacks, no "actually" condescension.',
            vi: 'Không mỉa mai, không công kích cá nhân, không giọng "thực ra thì" trịch thượng.',
            ja: '皮肉、個人攻撃、上から目線の「実は」表現を避ける。',
            ko: '빈정거림, 인신공격, 거만한 "사실은" 표현 금지.',
        },
    },

    [QuoteType.ADD_CONTEXT]: {
        name: {
            en: 'Add Context',
            cn: 'Add Context',
            vi: 'Bổ sung context',
            ja: '文脈を追加',
            ko: '맥락 추가',
        },
        instruction: {
            en: 'Provide missing context, background, or nuance that changes how the original should be interpreted. Be factual.',
            cn: 'Provide missing context, background, or nuance that changes how the original should be interpreted. Be factual.',
            vi: 'Cung cấp context, background, hoặc nuance còn thiếu làm thay đổi cách hiểu bài gốc. Giữ đúng sự thật.',
            ja: '元投稿の解釈を変える、欠けている文脈・背景・ニュアンスを提供。事実ベースで。',
            ko: '원 게시물 해석을 바꾸는 누락된 맥락, 배경, 뉘앙스를 제공. 사실 기반으로.',
        },
        openerHints: {
            en: ['Important context:', 'Worth noting:', 'Missing from this:'],
            cn: ['Important context:', 'Worth noting:', 'Missing from this:'],
            vi: ['Context quan trọng:', 'Đáng chú ý:', 'Điểm còn thiếu:'],
            ja: ['重要な文脈：', '注目すべき点：', 'この投稿に欠けている：'],
            ko: ['중요한 맥락:', '주목할 점:', '빠진 부분:'],
        },
        avoid: {
            en: 'Do not fabricate facts.',
            cn: 'Do not fabricate facts.',
            vi: 'Không bịa đặt sự thật.',
            ja: '事実を捏造しないこと。',
            ko: '사실을 날조하지 말 것.',
        },
    },

    [QuoteType.REFRAME]: {
        name: {
            en: 'Reframe',
            cn: 'Reframe',
            vi: 'Nhìn góc khác',
            ja: '再構成',
            ko: '재구성',
        },
        instruction: {
            en: 'Shift the mental frame — show the same situation from a completely different angle or level of abstraction.',
            cn: 'Shift the mental frame — show the same situation from a completely different angle or level of abstraction.',
            vi: 'Chuyển khung nhìn — cho thấy cùng sự việc từ góc độ hoặc cấp độ hoàn toàn khác.',
            ja: 'フレームを転換 — 同じ状況を全く異なる角度・抽象度で見せる。',
            ko: '프레임 전환 — 같은 상황을 완전히 다른 각도/추상화 수준에서 보기.',
        },
        openerHints: {
            en: ['Another way to see this:', 'Zoom out:', 'Reframe:'],
            cn: ['Another way to see this:', 'Zoom out:', 'Reframe:'],
            vi: ['Một cách nhìn khác:', 'Zoom out:', 'Đổi khung:'],
            ja: ['別の見方：', '俯瞰すると：', 'フレーム転換：'],
            ko: ['다른 시각:', '시야를 넓히면:', '프레임 전환:'],
        },
        avoid: {
            en: 'Do not just restate in different words.',
            cn: 'Do not just restate in different words.',
            vi: 'Không chỉ đổi từ ngữ giữ nguyên ý.',
            ja: '言葉を変えただけの言い換えにしない。',
            ko: '단어만 바꾼 재진술 금지.',
        },
    },

    [QuoteType.BUILD_ON]: {
        name: {
            en: 'Build On',
            cn: 'Build On',
            vi: 'Mở rộng',
            ja: '発展',
            ko: '확장',
        },
        instruction: {
            en: 'Take the original idea further. Apply it to a new domain, extend the logic, or show a non-obvious implication.',
            cn: 'Take the original idea further. Apply it to a new domain, extend the logic, or show a non-obvious implication.',
            vi: 'Đẩy ý tưởng gốc đi xa hơn. Áp dụng sang lĩnh vực mới, mở rộng logic, hoặc cho thấy hệ quả không hiển nhiên.',
            ja: '元のアイデアをさらに展開。新領域への応用、論理の拡張、非自明な含意を示す。',
            ko: '원 아이디어를 더 발전시키기. 새 영역 적용, 논리 확장, 비자명한 함의 제시.',
        },
        openerHints: {
            en: ['Taking this further:', 'Extending this logic:', 'The next step:'],
            cn: ['Taking this further:', 'Extending this logic:', 'The next step:'],
            vi: ['Đi xa hơn:', 'Mở rộng logic này:', 'Bước tiếp theo:'],
            ja: ['さらに展開すると：', 'この論理を広げると：', '次のステップ：'],
            ko: ['더 나아가면:', '이 논리를 확장하면:', '다음 단계:'],
        },
        avoid: {
            en: 'Stay grounded — no wild speculation.',
            cn: 'Stay grounded — no wild speculation.',
            vi: 'Bám thực tế — không suy diễn hoang đường.',
            ja: '現実的に — 過度な憶測はしない。',
            ko: '현실적으로 — 무리한 추측 금지.',
        },
    },

    [QuoteType.HIGHLIGHT]: {
        name: {
            en: 'Highlight Key , You are NOT adding new content. You are a spotlight — just make the existing best point impossible to miss.',
            cn: 'Highlight Key Point, You are NOT adding new content. You are a spotlight — just make the existing best point impossible to miss.',
            vi: 'Nhấn mạnh, Bạn KHÔNG thêm nội dung mới. Bạn chỉ là người làm nổi bật điểm mạnh hiện có – hãy làm cho điểm mạnh đó trở nên không thể bỏ qua.',
            ja: '重要ポイント , あなたは新しいコンテンツを追加するわけではありません。あなたはスポットライトを当てる役割を担っています。既存の最も優れた点を、見逃せないようにするだけです。',
            ko: '핵심 강조 , 당신은 새로운 콘텐츠를 추가하는 것이 아닙니다. 당신은 기존의 가장 뛰어난 부분을 부각시키는 역할을 하는 것입니다. 즉, 기존의 가장 뛰어난 부분을 놓치지 않도록 하는 것입니다.',
        },
        instruction: {
            en: 'Call out THE most important or under-appreciated insight in the original. Make it impossible to miss.',
            cn: 'Call out THE most important or under-appreciated insight in the original. Make it impossible to miss.',
            vi: 'Chỉ ra insight QUAN TRỌNG nhất hoặc bị đánh giá thấp trong bài gốc. Làm cho không thể bỏ qua.',
            ja: '元投稿で最も重要、または過小評価されている洞察を強調。見逃せないように。',
            ko: '원 게시물에서 가장 중요하거나 저평가된 통찰을 강조. 놓칠 수 없게.',
        },
        openerHints: {
            en: ['THIS is the key:', 'The real insight here:', 'Don\'t miss this:'],
            cn: ['THIS is the key:', 'The real insight here:', 'Don\'t miss this:'],
            vi: ['ĐÂY là điểm mấu chốt:', 'Insight thật sự:', 'Đừng bỏ lỡ:'],
            ja: ['核心はここ：', '本当の洞察：', '見逃し厳禁：'],
            ko: ['핵심은 이것:', '진짜 통찰:', '절대 놓치지 말 것:'],
        },
        avoid: {
            en: 'Do not exaggerate or sensationalize.',
            cn: 'Do not exaggerate or sensationalize.',
            vi: 'Không phóng đại, không giật gân.',
            ja: '誇張・煽り禁止。',
            ko: '과장이나 자극적 표현 금지.',
        },
    },

    [QuoteType.ROAST]: {
        name: {
            en: 'Roast / Dunk',
            cn: 'Roast / Dunk',
            vi: 'Roast',
            ja: 'ロースト',
            ko: '풍자',
        },
        instruction: {
            en: `Witty, sharp criticism with humor. Attack the idea, never the person. Must be actually funny, not mean. Avoid punching at demographics, political groups, or anything that could be read as targeted harassment even in jest. If the original post is already self-aware or humble, skip the roast — it won't land.`,
            cn: `Witty, sharp criticism with humor. Attack the idea, never the person. Must be actually funny, not mean. Avoid punching at demographics, political groups, or anything that could be read as targeted harassment even in jest. If the original post is already self-aware or humble, skip the roast — it won't land.`,
            vi: 'Lời phê bình sắc sảo, dí dỏm và hài hước. Hãy tấn công vào ý tưởng, chứ không phải cá nhân. Phải thực sự hài hước, không được ác ý. Tránh công kích các nhóm nhân khẩu học, nhóm chính trị, hoặc bất cứ điều gì có thể bị hiểu là quấy rối có chủ đích, ngay cả khi chỉ là nói đùa. Nếu bài đăng gốc đã tự nhận thức hoặc khiêm tốn, hãy bỏ qua phần chỉ trích – nó sẽ không hiệu quả',
            ja: 'ユーモアを交えた、機知に富んだ鋭い批判。アイデアを攻撃し、決して人を攻撃しないこと。本当に面白くなければならず、意地悪であってはならない。特定の人口統計グループ、政治団体、あるいは冗談であっても標的型嫌がらせと受け取られかねないものを攻撃することは避けること。元の投稿が既に自己認識が高かったり謙虚だったりする場合は、皮肉を言うのはやめよう。効果がないだろう。',
            ko: '재치 있고 날카로운 비판에 유머를 더하세요. 아이디어를 공격하되, 사람을 공격해서는 안 됩니다. 악의가 아닌 진정한 웃음을 유발해야 합니다. 특정 인구 집단, 정치 집단 또는 표적 공격으로 해석될 수 있는 내용은 농담이라 할지라도 피하세요. 원 게시글 작성자가 이미 자기 인식적이거나 겸손한 태도를 보인다면, 신랄한 비판은 삼가세요. 효과적이지 않을 겁니다.',
        },
        openerHints: {
            en: ['Imagine thinking...', 'Bold of you to...', 'The confidence of posting this...'],
            cn: ['Imagine thinking...', 'Bold of you to...', 'The confidence of posting this...'],
            vi: ['Tưởng tượng mà nghĩ rằng...', 'Bạo dạn thật...', 'Đủ tự tin để post cái này...'],
            ja: [
                'よくこれ投稿できたな',
                'こいつ本当に',
                'お兄さん、',
                '伝説の投稿',
                '保存させていただきました',
                '今週一の',
            ],
            ko: ['이런 생각을 하다니...', '대담하네요...', '이걸 올릴 자신감...'],
        },
        avoid: {
            en: 'No slurs, no personal attacks, no bullying punching down.',
            cn: 'No slurs, no personal attacks, no bullying punching down.',
            vi: 'Không miệt thị, không công kích cá nhân, không bắt nạt người yếu thế.',
            ja: '差別語、個人攻撃、弱者叩き禁止。',
            ko: '비방, 인신공격, 약자 공격 금지.',
        },
    },

    [QuoteType.HOT_TAKE]: {
        name: {
            en: 'Hot Take',
            cn: 'Hot Take',
            vi: 'Hot take',
            ja: 'ホットテイク',
            ko: '핫 테이크',
        },
        instruction: {
            en: 'Bold, confident opinion triggered by the original. Must be defensible, not just contrarian for clout.The hot take must visibly connect back to the original post — readers should see why this was triggered by it.',
            cn: 'Bold, confident opinion triggered by the original. Must be defensible, not just contrarian for clout. The hot take must visibly connect back to the original post — readers should see why this was triggered by it.',
            vi: 'Opinion mạnh, tự tin, được kích bởi bài gốc. Phải bảo vệ được, không chỉ ngược chiều để câu view. Quan điểm gây tranh cãi phải có mối liên hệ rõ ràng với bài đăng gốc — người đọc cần thấy lý do tại sao nó lại được đưa ra sau bài đăng gốc.',
            ja: '元投稿をきっかけとした大胆で自信ある意見。反対のための反対ではなく、擁護可能な内容。その過激な意見は、元の投稿と明確に関連していなければならない。読者は、なぜそれがきっかけでこの意見が出たのかを理解できる必要がある。',
            ko: '원 게시물이 촉발한 대담하고 자신 있는 의견. 반대를 위한 반대가 아닌, 방어 가능한 내용.비판적인 의견은 원래 게시글과 명확하게 연결되어야 하며, 독자들은 왜 그 게시글이 비판의 계기가 되었는지 이해할 수 있어야 합니다.',
        },
        openerHints: {
            en: ['Unpopular opinion:', 'Hot take:', 'Controversial but true:'],
            cn: ['Unpopular opinion:', 'Hot take:', 'Controversial but true:'],
            vi: ['Opinion không phổ biến:', 'Hot take:', 'Gây tranh cãi nhưng đúng:'],
            ja: [
                '不人気な意見だけど',
                '結論：',
                'ホットテイク：',
                '誰も言わないけど',
                '物議を醸すかもだが',
            ],
            ko: ['비주류 의견:', '핫 테이크:', '논란의 여지가 있지만 사실:'],
        },
        avoid: {
            en: 'No empty contrarianism.',
            cn: 'No empty contrarianism.',
            vi: 'Không ngược chiều rỗng tuếch.',
            ja: '中身のない逆張り禁止。',
            ko: '알맹이 없는 반대 금지.',
        },
    },

    [QuoteType.QUESTION]: {
        name: {
            en: 'Provocative Question',
            cn: 'Provocative Question',
            vi: 'Câu hỏi khơi gợi',
            ja: '問いかけ',
            ko: '질문 던지기',
        },
        instruction: {
            en: 'Ask ONE sharp question that makes people think deeper about the original. Not rhetorical flipping — genuinely thought-provoking.',
            cn: 'Ask ONE sharp question that makes people think deeper about the original. Not rhetorical flipping — genuinely thought-provoking.',
            vi: 'Đặt MỘT câu hỏi sắc khiến người đọc suy nghĩ sâu hơn về bài gốc. Không tu từ rỗng — thực sự kích thích suy nghĩ.',
            ja: '元投稿を深く考えさせる鋭い問いを1つ。修辞的な反転ではなく、本当に考えさせる内容。',
            ko: '원 게시물을 더 깊이 생각하게 만드는 날카로운 질문 1개. 수사적 반문이 아닌, 진짜 생각하게 만드는 것.',
        },
        openerHints: {
            en: ['But what about...?', 'Genuine question:', 'Have we considered...?'],
            cn: ['But what about...?', 'Genuine question:', 'Have we considered...?'],
            vi: ['Nhưng còn...?', 'Câu hỏi thật sự:', 'Đã ai tính đến...?'],
            ja: ['では…はどうか？', '素朴な疑問：', '…を考えたことは？'],
            ko: ['하지만...는 어떤가요?', '진지한 질문:', '...을 고려해봤나요?'],
        },
        avoid: {
            en: 'No gotcha questions.',
            cn: 'No gotcha questions.',
            vi: 'Không câu hỏi "gotcha" bẫy.',
            ja: '揚げ足取りの質問禁止。',
            ko: '트집 잡기식 질문 금지.',
        },
    },

    [QuoteType.SUMMARIZE]: {
        name: {
            en: 'TL;DR Summary',
            cn: 'TL;DR Summary',
            vi: 'Tóm tắt TL;DR',
            ja: 'TL;DR要約',
            ko: 'TL;DR 요약',
        },
        instruction: {
            en: 'Distill the original into its sharpest, most shareable essence. One-line TL;DR style.',
            cn: 'Distill the original into its sharpest, most shareable essence. One-line TL;DR style.',
            vi: 'Cô đọng bài gốc thành tinh túy sắc nhất, dễ share nhất. Kiểu TL;DR một dòng.',
            ja: '元投稿を最も鋭く、シェアしやすい本質に凝縮。1行TL;DR形式。',
            ko: '원 게시물을 가장 날카롭고 공유하기 쉬운 본질로 압축. 한 줄 TL;DR 형식.',
        },
        openerHints: {
            en: ['TL;DR:', 'In one line:', 'The whole thing in a sentence:'],
            cn: ['TL;DR:', 'In one line:', 'The whole thing in a sentence:'],
            vi: ['TL;DR:', 'Một dòng:', 'Cả bài trong 1 câu:'],
            ja: [
                'TL;DR：',
                '要するに',
                '一言でいうと',
                '3秒で分かる版：',
                'まとめ：',
            ],
            ko: ['TL;DR:', '한 줄로:', '요약하면:'],
        },
        avoid: {
            en: 'Do not add new content — this is compression.',
            cn: 'Do not add new content — this is compression.',
            vi: 'Không thêm nội dung mới — đây là nén.',
            ja: '新規情報は加えない — これは圧縮。',
            ko: '새 내용 추가 금지 — 압축 작업.',
        },
    },

    [QuoteType.PERSONAL_STORY]: {
        name: {
            en: 'Personal Story',
            vi: 'Câu chuyện cá nhân',
            ja: '個人的な体験',
            ko: '개인 경험 공유',
            cn: '个人故事',
        },
        instruction: {
            en: 'Share a real, specific personal experience that connects to the original post. Lead with the moment, not the lesson. Include one concrete detail (time, place, number, name) to make it feel real. The story should naturally validate, contrast, or deepen the original — not just say "same". End with a brief reflection or takeaway, but keep it earned, not preachy.',
            vi: 'Chia sẻ một trải nghiệm cá nhân cụ thể, thực tế liên quan đến bài gốc. Mở đầu bằng khoảnh khắc xảy ra, không phải bài học. Thêm một chi tiết cụ thể (thời gian, địa điểm, con số, tên) để câu chuyện có độ thật. Câu chuyện nên tự nhiên xác nhận, tương phản, hoặc làm sâu hơn bài gốc — không chỉ nói "tôi cũng vậy". Kết bằng một reflection ngắn nhưng phải tự nhiên, không giáo điều.',
            ja: '元の投稿に関連する、具体的なリアルな個人体験を共有する。教訓からではなく、その瞬間から書き始める。リアル感を出すために具体的な detail（時間・場所・数字・名前）を1つ入れる。元投稿を自然に裏付け、対比、または深掘りする内容にする — 単なる「わかる」にしない。短い気づきで締めるが、説教にならないこと。',
            ko: '원 게시물과 연결되는 구체적이고 실제적인 개인 경험을 공유한다. 교훈이 아닌 그 순간부터 시작할 것. 실감나게 만들 구체적인 디테일(시간, 장소, 숫자, 이름) 하나를 포함한다. 단순히 "나도 그래"가 아니라 원 게시물을 자연스럽게 뒷받침하거나 대비하거나 심화시키는 내용이어야 한다. 짧은 성찰로 마무리하되, 설교조가 되지 않을 것.',
            cn: '分享一个与原帖相关的真实、具体的个人经历。从那个时刻切入，而非从教训开始。加入一个具体细节（时间、地点、数字、名字）让故事显得真实。内容应自然地印证、对比或深化原帖——而不只是说"我也是"。以简短的感悟收尾，但要自然流露，不要说教。',
        },
        openerHints: {
            en: [
                'This takes me back to...',
                'Three years ago I learned this the hard way —',
                'Happened to me. [Year/Place]:',
                'I used to think differently — until...',
                'Real story:',
            ],
            vi: [
                'Cái này nhắc tôi nhớ lại...',
                'Ba năm trước tôi đã học điều này theo cách khó khăn nhất —',
                'Tôi đã từng gặp đúng chuyện này. [Năm/Nơi]:',
                'Tôi từng nghĩ khác — cho đến khi...',
                'Chuyện thật:',
            ],
            ja: [
                'これを見て昔を思い出した…',
                '3年前、痛い経験から学んだことがある —',
                '自分にも起きた。[年/場所]：',
                '以前は違う考えだった — あの日まで…',
                '実話：',
            ],
            ko: [
                '이걸 보니 예전 생각이 나네요...',
                '3년 전, 저는 이걸 아주 힘든 방식으로 배웠습니다 —',
                '저한테도 있었던 일이에요. [연도/장소]:',
                '예전엔 다르게 생각했어요 — 그날까지는...',
                '실제 있었던 일:',
            ],
            cn: [
                '这让我想起了...',
                '三年前，我用最艰难的方式学到了这件事 —',
                '这事发生在我身上。[年份/地点]：',
                '我曾经想法不同 —— 直到那一天...',
                '真实故事：',
            ],
        },
        avoid: {
            en: 'Do not write vague, generic "relatable" content like "I once felt this way too." No fake humility. No manufactured vulnerability. The story must have a specific detail — if it has none, it reads as fabricated. Do not moralize or over-explain the lesson at the end.',
            vi: 'Không viết kiểu mơ hồ, chung chung như "Tôi cũng từng cảm thấy vậy." Không khiêm tốn giả tạo. Không tạo ra sự dễ tổn thương giả. Câu chuyện phải có ít nhất một chi tiết cụ thể — nếu không có, nó sẽ lộ là bịa. Không đạo đức hoá hoặc giải thích quá dài bài học ở cuối.',
            ja: '「私もそう感じたことがある」のような曖昧で当たり障りのない内容を書かない。作られた謙虚さや演出された脆さは不要。具体的な detail が1つもなければ作り話に見える。最後に教訓を説教したり過剰に説明したりしない。',
            ko: '"저도 그런 느낌을 받은 적 있어요"같은 모호하고 일반적인 공감성 내용을 쓰지 말 것. 가짜 겸손이나 연출된 취약함 금지. 구체적인 디테일이 하나도 없으면 지어낸 것처럼 보임. 마지막에 교훈을 설교하거나 과도하게 설명하지 말 것.',
            cn: '不要写模糊、套路化的"感同身受"内容，如"我也曾有过这种感觉"。不要假谦虚，不要刻意制造脆弱感。故事必须有具体细节——否则会显得是编造的。结尾不要说教或过度解释教训。',
        },
    },

    [QuoteType.CONNECT_DOTS]: {
        name: {
            en: 'Connect the Dots',
            vi: 'Kết nối sự kiện',
            ja: 'パターンを繋ぐ',
            ko: '점 잇기',
            cn: '连点成线',
        },
        instruction: {
            en: 'Identify a separate event, trend, data point, or pattern — not mentioned in the original — that when placed next to it reveals a bigger picture. The connection must be logical and traceable, not vague. Structure: [Original signal] + [External signal you bring] = [Insight neither alone would reveal]. The reader should finish thinking: "I would not have seen that without this quote."',
            vi: 'Xác định một sự kiện, xu hướng, dữ liệu hoặc pattern riêng biệt — không được nhắc đến trong bài gốc — mà khi đặt cạnh bài gốc sẽ lộ ra một bức tranh lớn hơn. Kết nối phải có logic và có thể truy vết, không mơ hồ. Cấu trúc: [Tín hiệu từ bài gốc] + [Tín hiệu bên ngoài bạn mang vào] = [Insight mà cả hai riêng lẻ đều không cho thấy]. Người đọc xong phải nghĩ: "Nếu không có quote này tôi đã không nhận ra điều đó."',
            ja: '元の投稿で触れられていない別の出来事・トレンド・データ・パターンを見つけ、元投稿と並べることでより大きな全体像を明らかにする。繋がりは論理的で追跡可能でなければならない — 曖昧な連想は不可。構造：[元投稿のシグナル] ＋ [あなたが持ち込む外部シグナル] ＝ [どちらか単体では見えないインサイト]。読者が読み終えて「このquoteがなければ気づかなかった」と思わせること。',
            ko: '원 게시물에서 언급되지 않은 별개의 사건, 트렌드, 데이터, 패턴을 찾아 원 게시물 옆에 놓았을 때 더 큰 그림이 드러나도록 한다. 연결은 논리적이고 추적 가능해야 하며 모호한 연상은 금지. 구조: [원 게시물 신호] + [내가 가져오는 외부 신호] = [둘 중 어느 하나만으로는 보이지 않는 통찰]. 독자가 읽고 나서 "이 quote 없었으면 몰랐을 것"이라고 느끼게 할 것.',
            cn: '找到一个原帖未提及的独立事件、趋势、数据点或模式——将其与原帖并列时能揭示更大的图景。连接必须合乎逻辑且可追溯，不能模糊。结构：[原帖信号] + [你带入的外部信号] = [两者单独都无法揭示的洞察]。读者读完应该想：「没有这条quote我不会发现这一点。」',
        },
        openerHints: {
            en: [
                'This + [X] = a pattern worth watching:',
                'Third time seeing this signal this month.',
                'Connect this to what happened with [X] and it makes sense:',
                'Alone this looks like noise. With [X] it looks like signal:',
                'The dots are connecting:',
            ],
            vi: [
                'Cái này + [X] = một pattern đáng chú ý:',
                'Tháng này tôi thấy tín hiệu này lần thứ ba rồi.',
                'Kết nối điều này với chuyện xảy ra với [X] thì mọi thứ có lý:',
                'Riêng lẻ thì trông như nhiễu. Cộng với [X] thì đây là tín hiệu thật:',
                'Các mảnh ghép đang khớp lại:',
            ],
            ja: [
                'これ＋[X]＝注目すべきパターン：',
                '今月これで3回目のシグナルだ。',
                '[X]で起きたことと繋げると腑に落ちる：',
                '単体ではノイズに見える。[X]と合わせるとシグナルになる：',
                '点と点が繋がってきた：',
            ],
            ko: [
                '이것 + [X] = 주목할 만한 패턴:',
                '이번 달 세 번째로 보는 신호다.',
                '[X]에서 일어난 일과 연결하면 이해가 된다:',
                '단독으로는 노이즈처럼 보인다. [X]와 합치면 진짜 신호:',
                '점들이 이어지고 있다:',
            ],
            cn: [
                '这个 + [X] = 一个值得关注的模式：',
                '这个月第三次看到这个信号了。',
                '把这个和[X]发生的事联系起来，一切就说得通了：',
                '单独看像是噪音。加上[X]就是真实信号：',
                '点与点正在连成线：',
            ],
        },
        avoid: {
            en: 'Do not fabricate connections — if you cannot name the external signal specifically, do not make one up. Avoid superficial pattern-matching like "this is just like [famous event]" without explaining the actual mechanism. Do not connect things that are merely similar in surface topic — the connection must reveal causation, correlation, or a systemic pattern. No conspiracy-adjacent reasoning.',
            vi: 'Không bịa đặt kết nối — nếu không thể đặt tên cụ thể cho tín hiệu bên ngoài thì không được bịa. Tránh pattern matching hời hợt kiểu "cái này giống hệt [sự kiện nổi tiếng]" mà không giải thích cơ chế thực sự. Không kết nối những thứ chỉ giống nhau về chủ đề bề mặt — kết nối phải lộ ra quan hệ nhân quả, tương quan, hoặc một pattern có hệ thống. Không suy luận kiểu thuyết âm mưu.',
            ja: '繋がりを捏造しない — 外部シグナルを具体的に名指しできないなら作り上げない。「これは[有名な出来事]と同じだ」という表面的なパターンマッチングを、実際のメカニズム説明なしに行わない。表面的なトピックが似ているだけのものを繋げない — 繋がりは因果・相関・システム的パターンを明らかにするものでなければならない。陰謀論的な推論は禁止。',
            ko: '연결을 날조하지 말 것 — 외부 신호를 구체적으로 명명할 수 없다면 만들어내지 말 것. "이건 [유명한 사건]과 똑같다"는 식의 실제 메커니즘 설명 없는 피상적 패턴 매칭 금지. 표면적 주제만 비슷한 것들을 연결하지 말 것 — 연결은 인과관계, 상관관계, 또는 시스템적 패턴을 드러내야 함. 음모론적 추론 금지.',
            cn: '不要捏造联系——如果无法具体说出外部信号，就不要编造。避免没有解释实际机制的表面模式匹配，如"这和[著名事件]一模一样"。不要连接仅在表面话题上相似的事物——连接必须揭示因果关系、相关性或系统性模式。禁止阴谋论式推理。',
        },
    },
};

// ============================================================
// AUTO-DETECT quote type nếu user không truyền
// ============================================================
export function suggestQuoteType(originalPost: string, yourAngle?: string): QuoteType {
    console.log('==> suggestQuoteType');
    const text = (yourAngle ?? originalPost).toLowerCase();

    if (/disagree|wrong|incorrect|false|sai|không đúng|違う|틀렸/.test(text)) return QuoteType.DISAGREE;
    if (/tl;?dr|summary|tóm tắt|要約|요약/.test(text)) return QuoteType.SUMMARIZE;
    if (/question|như thế nào|\?|\？/.test(text)) return QuoteType.QUESTION;
    if (/funny|lol|haha|imagine|😂|🤣/.test(text)) return QuoteType.ROAST;
    if (/context|background|actually|thực ra|実は|사실/.test(text)) return QuoteType.ADD_CONTEXT;
    if (/unpopular|controversial|hot take|gây tranh cãi/.test(text)) return QuoteType.HOT_TAKE;

    // Default: amplify (an toàn nhất)
    return QuoteType.AGREE_AMPLIFY;
}

export const QUOTE_TYPE_TELEGRAM_BUTTON_SPECS = {
    [QuoteType.AGREE_AMPLIFY]: {
        key: 'agree_amplify',
        text: 'Đồng ý + thêm insight',
    },   // Đồng ý + thêm insight
    [QuoteType.DISAGREE]: {
        key: 'disagree',
        text: 'Disagree-Phản biện có lý'
    },              // Phản biện có lý
    [QuoteType.ADD_CONTEXT]: {
        key: 'add_context',
        text: 'Bổ sung context'
    },        // Bổ sung context
    [QuoteType.REFRAME]: {
        key: 'reframe',
        text: 'Nhìn góc khác'
    },                // Nhìn góc khác
    [QuoteType.BUILD_ON]: {
        key: 'build_on',
        text: 'Mở rộng ý'
    },              // Mở rộng ý
    [QuoteType.HIGHLIGHT]: {
        key: 'highlight',
        text: 'Nhấn mạnh key point'
    },            // Nhấn mạnh key point
    [QuoteType.ROAST]: {
        key: 'roast',
        text: 'Chỉ trích sắc'
    },                    // Chỉ trích sắc
    [QuoteType.HOT_TAKE]: {
        key: 'host_take',
        text: 'Opinion mạnh'
    },              // Opinion mạnh
    [QuoteType.QUESTION]: {
        key: 'question', text: 'Đặt câu hỏi'
    },              // Đặt câu hỏi
    [QuoteType.SUMMARIZE]: {
        key: 'summarize',
        text: 'tóm tắt'
    },
    [QuoteType.CONNECT_DOTS]: {
        key: 'connect_dot',
        text: 'connect the dot'
    },
    [QuoteType.PERSONAL_STORY]: {
        key: 'connect_dot',
        text: 'personal story'
    },
}

// ============================================================
// MAIN PROMPT BUILDER
// ============================================================
import {LengthRange} from '../config/platform-limits';
import {LANGUAGE_LOCK} from './templates';
import {ContentTone} from '../enum/tone.enum';
import {TONE_HINTS} from './templates';
import {Language} from "../../../common/interfaces/language.prompt.interface";

export interface QuotePromptParams {
    originalPost: string;
    originalAuthor?: string;
    quoteType: QuoteType;
    language: Language;
    tone?: ContentTone;
    persona?: string;
    yourAngle?: string;
    lengthRange: LengthRange;
}

export function buildQuotePrompt(params: QuotePromptParams): {
    system: string;
    user: string;
} {
    const {
        originalPost,
        originalAuthor,
        quoteType,
        language,
        tone,
        persona,
        yourAngle,
        lengthRange,
    } = params;

    const spec = QUOTE_TYPE_SPECS[quoteType];
    const system = QUOTE_SYSTEM_PROMPTS[language];

    const authorLine = originalAuthor ? `Original by @${originalAuthor}` : 'Original tweet';
    const openerExamples = spec.openerHints[language].slice(0, 3).join(' | ');

    const user = [
        `=== ${authorLine} ===`,
        `"""${originalPost}"""`,
        ``,
        `=== Your quote-tweet task ===`,
        `[Target Language: ${spec.name[language]}]
            IMPORTANT: Your previous answer violated language rules.
            Rewrite strictly in ${spec.name[language]} only.`,
        `Quote type: ${spec.name[language]}`,
        `Instruction: ${spec.instruction[language]}`,
        `Avoid: ${spec.avoid[language]}`,
        ``,
        `Length: ${lengthRange.min}-${lengthRange.max} chars (aim ~${lengthRange.sweet})`,
        tone ? `Tone: ${TONE_HINTS[tone]}` : '',
        persona ? `Voice/persona: ${persona}` : '',
        yourAngle ? `Your specific angle: ${yourAngle}` : '',
        ``,
        `Opener style examples (pick ONE or create your own similar):`,
        `  ${openerExamples}`,
        ``,
        `Rules:`,
        `- Quote must stand alone — readers may NOT read the original`,
        `- Deliver value in first 280 chars even if long-form`,
        `- NO "Great post!" / "Love this!" / sycophancy`,
        `- NO AI phrases ("I think it's important to note that...")`,
        `- 0-2 hashtags MAX, only if natural`,
        `- 0-2 emojis MAX, only if they add meaning`,
        `- ${LANGUAGE_LOCK[language]}`,
        ``,
        `Output: the quote-tweet text ONLY.`,
    ].filter(Boolean).join('\n');

    return {system, user};
}
