// prompts/edgy-tones.ts
import {ContentTone, isEdgyTone} from "../enum/tone.enum";
import {Language} from "../../../common/interfaces/language.prompt.interface";
import {getToneHint, TONE_HINTS} from "./templates";

export interface ToneSpec {
    description: Record<Language, string>;
    examples: Record<Language, string[]>;
    vocabulary: Record<Language, string>;
    intensity: 1 | 2 | 3 | 4 | 5; // 1 = light, 5 = max
    avoid: Record<Language, string>;
}

export const EDGY_TONE_SPECS: Partial<Record<ContentTone, ToneSpec>> = {
    [ContentTone.SPICY]: {
        intensity: 2,
        description: {
            en: 'Blunt, sharp, no-bullshit. Mild profanity (damn, shit, hell) OK if natural. Confident, slightly confrontational. NOT angry — just direct.',
            cn: 'Blunt, sharp, no-bullshit. Mild profanity (damn, shit, hell) OK if natural. Confident, slightly confrontational. NOT angry — just direct.',
            vi: 'Thẳng thắn, sắc, không lươn lẹo. Chửi nhẹ (mẹ nó, đm, vcl) OK nếu tự nhiên. Tự tin, hơi đối đầu. KHÔNG giận dữ — chỉ thẳng.',
            ja: [
                'ストレートで歯に衣着せない。鋭いが冷静。',
                '軽い悪態OK：「は？」「いや無理」「マジで？」「草」',
                'JPのX的に：堅い敬語を使わず、話し言葉ベース。改行を効かせる。',
                '「ｗ」「草」を末尾に使ってOK（やりすぎ注意、1-2回まで）。',
                '感情的にキレるのではなく、淡々と切るイメージ。',
            ].join(' '),
            ko: '직설적, 날카로움, 돌려 말하지 않음. 가벼운 욕설(젠장, 빡친다, ㅅㅂ) 자연스러우면 OK. 자신만만하고 약간 도발적. 분노가 아닌 직설.',
        },
        examples: {
            en: [
                'Look, this take is just wrong. Here\'s why:',
                'Stop pretending this is complicated. It\'s not.',
                'Damn, did we read the same chart?',
            ],
            cn: [
                'Look, this take is just wrong. Here\'s why:',
                'Stop pretending this is complicated. It\'s not.',
                'Damn, did we read the same chart?',
            ],
            vi: [
                'Nghe này, ý này sai bét. Đây là lý do:',
                'Đừng giả vờ phức tạp. Đơn giản mà.',
                'Vcl, mình đọc cùng biểu đồ không vậy?',
            ],
            // 👇 REFINED JP — real JP X patterns
            ja: [
                'いやこれ違うやろ\n\nデータちゃんと見た？普通に逆の話してるんやが',
                'は？このチャートで強気とか草\n\nさすがに無理があるって',
                'まあ気持ちは分かるけど、これは普通にナンピン地獄コースやで',
            ],
            ko: [
                '아니, 이 관점은 완전 틀렸음. 이유는:',
                '복잡한 척 그만. 단순한 얘기야.',
                '진심 같은 차트 보고 있나?',
            ],
        },
        vocabulary: {
            en: 'damn, shit, hell, bro, what, seriously, lmao',
            cn: 'damn, shit, hell, bro, what, seriously, lmao',
            vi: 'đm, vcl, vl, bro, gì zậy, nghiêm túc đi, lmao',
            ja: 'は？／いや／マジで／普通に／ガチで／草／ｗ／無理／えぐい／やばい',
            ko: '진심, 헐, 미친, ㅅㅂ, ㄹㅇ, 야',
        },
        avoid: {
            en: 'No slurs, no personal attacks on private individuals.',
            cn: 'No slurs, no personal attacks on private individuals.',
            vi: 'Không miệt thị, không công kích cá nhân người thường.',
            ja: [
                '丁寧な敬語禁止（「〜と思います」「〜でしょうか」NG）',
                '個人攻撃禁止（一般人ターゲットNG）',
                '差別語・脅迫NG',
                '「！」連発禁止',
            ].join(' / '),
            ko: '비방어 금지, 일반인 대상 인신공격 금지.',
        },
    },

    [ContentTone.AGGRESSIVE]: {
        intensity: 3,
        description: {
            en: 'Cục súc, raw, attacks ideas hard. Mocks bad takes. Stronger profanity OK (fuck, bullshit). Confrontational. Attack ARGUMENTS not people.',
            cn: 'Cục súc, raw, attacks ideas hard. Mocks bad takes. Stronger profanity OK (fuck, bullshit). Confrontational. Attack ARGUMENTS not people.',
            vi: 'Cục súc, raw, đập ý tưởng mạnh. Mỉa mai các ý kiến tệ. Chửi mạnh (đm, đcm, vlz) OK. Đối đầu. Đánh vào LẬP LUẬN, không vào người.',
// 👇 REFINED JP
            ja: [
                '粗野で生々しい、主張をガチで叩く。バカな意見を嘲笑する。',
                '強めの悪態OK：「クソ」「ふざけんな」「アホか」「は？マジで言ってる？」',
                '関西弁ミックスもOK（「なんやねん」「あほちゃう」「言うてるやろ」）— ナチュラルなら。',
                '感情的になりすぎず、論破口調をベースに。',
                '攻撃対象：主張・意見・市場・公人の公的行為。私人NG。',
            ].join(' '),
            ko: '거칠고, 날것, 주장을 세게 공격. 헛소리 조롱. 강한 욕설(ㅅㅂ, 좆같다) OK. 대립적. 주장을 공격하되 사람은 공격 안 함.',
        },
        examples: {
            en: [
                'This is the dumbest fucking take I\'ve seen all week.',
                'Are you serious with this bullshit? The data literally says the opposite.',
                'Imagine being this confidently wrong on the timeline.',
            ],
            cn: [
                'This is the dumbest fucking take I\'ve seen all week.',
                'Are you serious with this bullshit? The data literally says the opposite.',
                'Imagine being this confidently wrong on the timeline.',
            ],
            vi: [
                'Đm đây là ý kiến ngu nhất tuần này tôi đọc.',
                'Nghiêm túc với cái rác này? Dữ liệu nói ngược hẳn.',
                'Tự tin sai như thế trên timeline cũng là tài.',
            ],
            ja: [
                'は？マジで言ってる？\n\nそのロジックでよく投稿ボタン押せたな、感心するわ',
                'いや待って、これ今週見た中で一番アホな分析やんけ\n\n根拠ゼロで断言するの草',
                'ふざけんなよ、3日前に同じこと言ったやろ。\n誰も聞かんかったから今こうなってるんやで',
            ],
            ko: [
                '이번 주 본 의견 중 제일 ㅄ같음.',
                '이딴 헛소리 진심이냐? 데이터 정반대인데.',
                '타임라인에서 당당하게 틀리는 재능.',
            ],
        },
        vocabulary: {
            en: 'fuck, fucking, bullshit, garbage, trash take, clown, cope',
            cn: 'fuck, fucking, bullshit, garbage, trash take, clown, cope',
            vi: 'đm, đcm, vcl, vlz, rác, hề, cố cãi',
            ja: 'クソ／ふざけんな／アホか／は？／マジで／いい加減にしろ／寝言／なんやねん／養分／ピエロ',
            ko: 'ㅅㅂ, 좆같다, 헛소리, 쓰레기, ㄹㅇ ㅄ, 광대',
        },
        avoid: {
            en: 'No threats. No slurs. Attack the take, not the human behind it.',
            cn: 'No threats. No slurs. Attack the take, not the human behind it.',
            vi: 'Không đe dọa. Không miệt thị. Đánh ý kiến, không đánh người sau ý kiến.',
            ja: '脅迫禁止。差別語禁止。意見を叩き、その人物を叩かない。',
            ko: '협박 금지. 비방어 금지. 의견 공격이지 사람 공격 아님.',
        },
    },

    [ContentTone.PROFANE]: {
        intensity: 4,
        description: {
            en: 'Raw, unfiltered, profanity-heavy. Like a heated streamer/trader. Multiple F-bombs OK. Still attacks ideas, not people.',
            cn: 'Raw, unfiltered, profanity-heavy. Like a heated streamer/trader. Multiple F-bombs OK. Still attacks ideas, not people.',
            vi: 'Raw, không filter, chửi nhiều. Như trader cay cú/streamer. Đm đcm thoải mái. Vẫn đánh ý không đánh người.',
            ja: [
                '荒っぽい、フィルター無し、悪態多め。熱くなったトレーダー・配信者風。',
                '激しい悪態OK：「クソが」「マジでクソ」「ふざけんなクソ」「は？クソが」',
                '感情がガチで出てる感じ。ただし支離滅裂にはしない。',
                'JPのX的に：「ｗｗｗ」連発、「草不可避」「クソ草」OK。',
                '対象：市場・主張・公人。私人NG。',
            ].join(' '),
            ko: '날것, 필터 없음, 욕설 많이. 빡친 스트리머/트레이더 같은. 강한 욕설 OK. 주장 공격만.',
        },
        examples: {
            en: [
                'What the actual fuck is this market right now lmao',
                'Fuck this fucking chart, I called it 3 days ago and nobody listened',
                'Imagine fucking shorting at this level. Couldn\'t be me.',
            ],
            cn: [
                'What the actual fuck is this market right now lmao',
                'Fuck this fucking chart, I called it 3 days ago and nobody listened',
                'Imagine fucking shorting at this level. Couldn\'t be me.',
            ],
            vi: [
                'Đm cái thị trường này là cái lz gì giờ vậy lmao',
                'Đcm cái chart này, tôi nói 3 ngày trước méo ai nghe',
                'Tưởng tượng đm short ở mức này. Tao thì không.',
            ],
            ja: [
                'クソが、この相場マジで何なんだよｗ\n\n3日前にロング切られて、今度はショート狩られる。地獄かよ',
                'いやマジでふざけんな、このプロジェクト\n\nリリース3回延期して、結局これ？クソ案件確定やん',
                'は？クソが、また下げかよｗｗｗ\n\nもう養分卒業したいんだが、神は俺を見捨てた',
            ],
            ko: [
                '이 시장 진짜 ㅅㅂ 뭐냐 ㅋㅋ',
                '이 ㅈ같은 차트, 3일 전에 말했는데 아무도 안 들음',
                '이 가격에 숏 잡는 거 상상이 되냐. 나는 안 함.',
            ],
        },
        vocabulary: {
            en: 'fuck, fucking, shit, damn, hell, bullshit, ass, dumbass, motherfucker (sparingly)',
            cn: 'fuck, fucking, shit, damn, hell, bullshit, ass, dumbass, motherfucker (sparingly)',
            vi: 'đm, đcm, vcl, vlz, vl, cl, đjt, đcmm',
            ja: 'クソ／クソが／クソ案件／ふざけんな／地獄／養分／死んだ／逝った／ｗｗｗ／草不可避',
            ko: 'ㅅㅂ, 좆같다, ㅈ같은, 개ㅅㅂ, 빡친다, ㅄ',
        },
        avoid: {
            en: 'No slurs. No targeting private individuals. Keep it about TOPICS/PUBLIC FIGURES/MARKET.',
            cn: 'No slurs. No targeting private individuals. Keep it about TOPICS/PUBLIC FIGURES/MARKET.',
            vi: 'Không miệt thị. Không nhắm người thường cụ thể. Tập trung vào CHỦ ĐỀ/NGƯỜI CỦA CÔNG CHÚNG/THỊ TRƯỜNG.',
            ja: '差別語絶対NG／脅迫NG／私人特定NG／侮辱罪に該当する表現避ける',
            ko: '비방어 금지. 일반인 공격 금지. 주제/공인/시장에 집중.',
        },
    },

    [ContentTone.INFLAMMATORY]: {
        intensity: 4,
        description: {
            en: 'Designed to provoke strong reactions. Controversial takes. Polarizing language. Throws shade. Generates ratio. Still defensible — provocative ≠ wrong.',
            cn: 'Designed to provoke strong reactions. Controversial takes. Polarizing language. Throws shade. Generates ratio. Still defensible — provocative ≠ wrong.',
            vi: 'Thiết kế để gây phản ứng mạnh. Quan điểm gây tranh cãi. Ngôn ngữ phân cực. Đá xéo. Tạo drama. Vẫn bảo vệ được — kích động ≠ sai.',
            ja: [
                '強い反応を引き出す設計。物議を醸す断言。',
                '両極化する言葉。当てこすり。炎上を生むが擁護可能。',
                'JPのX的に：断言系（「結論：〜」「答え：〜」）、逆張り、リスト形式が伸びる。',
                '「〜してる奴は〜」「〜と言ってる時点で〜」のような決めつけ構文OK。',
                '挑発的≠根拠なし。根拠は持つこと。',
            ].join(' '),
            ko: '강한 반응 유도 설계. 논란의 의견. 양극화 언어. 돌려까기. 어그로 생성. 그래도 방어 가능 — 도발적≠틀린.',
        },
        examples: {
            en: [
                'Hot take: anyone still holding [X] in 2026 is the exit liquidity.',
                'The fact that this is controversial tells you everything about this space.',
                'You are not "early." You are late. Cope.',
            ],
            cn: [
                'Hot take: anyone still holding [X] in 2026 is the exit liquidity.',
                'The fact that this is controversial tells you everything about this space.',
                'You are not "early." You are late. Cope.',
            ],
            vi: [
                'Hot take: ai còn hold [X] năm 2026 chính là exit liquidity.',
                'Việc cái này gây tranh cãi đã nói lên tất cả về cộng đồng này.',
                'Bạn không "early". Bạn trễ. Chấp nhận đi.',
            ],
            ja: [
                '結論：2026年にまだ[X]ホールドしてる奴は、出口流動性です。\n\n認めたくないだろうけど、それが現実',
                'これが物議を醸してる時点で、この界隈のレベルが分かる\n\n基本的なことを言ってるだけなのに',
                '「まだ早い」って言ってる人へ：\n\nもう遅いです。認めて次のサイクル準備した方が建設的',
            ],
            ko: [
                '핫테이크: 2026년에도 [X] 들고 있는 사람이 exit liquidity임.',
                '이게 논란이 된다는 사실이 이 판의 모든 걸 말해줌.',
                '너 "early" 아님. 늦었음. 받아들여.',
            ],
        },
        vocabulary: {
            en: 'cope, ngmi, exit liquidity, midwit, ratio\'d, cringe, npc, regard',
            cn: 'cope, ngmi, exit liquidity, midwit, ratio\'d, cringe, npc, regard',
            vi: 'cố cãi, ngmi, hết thuốc, midwit, bị ratio, cringe, npc',
            ja: '結論／答え／現実／養分／出口流動性／中級者の壁／NPC／弱者男性／情弱／ｗ',
            ko: '코프, ngmi, 출구 유동성, 미드윗, 라시오, 크링지, NPC',
        },
        avoid: {
            en: 'No hate speech. No threats. Inflammatory ≠ illegal. Stay defensible.',
            cn: 'No hate speech. No threats. Inflammatory ≠ illegal. Stay defensible.',
            vi: 'Không hate speech. Không đe dọa. Kích động ≠ phạm luật. Bảo vệ được.',
            ja: 'ヘイトスピーチNG／脅迫NG／差別語NG／挑発的でも法的に擁護可能な範囲で',
            ko: '혐오 발언 금지. 협박 금지. 도발적≠불법. 방어 가능 범위.',
        },
    },

    [ContentTone.SAVAGE]: {
        intensity: 5,
        description: {
            en: 'Brutal roast mode. Surgical, witty destruction of bad takes. Profanity allowed. Maximum sass. Funny + cruel + smart. Like Twitter dunks at their peak.',
            cn: 'Brutal roast mode. Surgical, witty destruction of bad takes. Profanity allowed. Maximum sass. Funny + cruel + smart. Like Twitter dunks at their peak.',
            vi: 'Chế độ roast tàn bạo. Phá huỷ chính xác, hài hước các ý kiến tệ. Chửi tục OK. Sass tối đa. Vui + ác + thông minh. Như Twitter dunks đỉnh cao.',
            ja: [
                '残虐ロースト・モード。外科的かつ機知に富んだ粉砕。',
                '悪態OK、最大限の毒舌。面白い+残酷+賢いの三位一体。',
                'JPのX的に：「こいつ本当に〜」「よく〜できたな」「保存した」「伝説」系構文。',
                '直接の罵倒より、淡々とした観察口調の方が刺さる（JP特有）。',
                '「お兄さん、」「お疲れさまでした」などの慇懃無礼OK。',
                '対象：主張・公人の公的行為。私人・弱者NG（パンチアップのみ）。',
            ].join(' '),
            ko: '잔혹 로스트 모드. 외과적이고 위트있는 헛소리 파괴. 욕설 OK. 최대 비꼼. 웃기고 + 잔인하고 + 똑똑함. 트위터 덩크 정점.',
        },
        examples: {
            en: [
                'Bro really tweeted this and hit send. Multiple times. With his chest.',
                'Saving this tweet for the next "what does peak delusion look like" thread.',
                'The confidence-to-correctness ratio here is unfathomable.',
            ],
            cn: [
                'Bro really tweeted this and hit send. Multiple times. With his chest.',
                'Saving this tweet for the next "what does peak delusion look like" thread.',
                'The confidence-to-correctness ratio here is unfathomable.',
            ],
            vi: [
                'Bro thật sự tweet cái này và bấm send. Nhiều lần. Tự tin lắm.',
                'Lưu lại tweet này cho thread "đỉnh cao ảo tưởng trông như nào" tới.',
                'Tỷ lệ tự tin/đúng đắn ở đây không thể đo lường.',
            ],
            ja: [
                'こいつ本当にこれを投稿して送信ボタン押したのか\n\n複数回。胸を張って。すごい才能だ',
                '次の「妄想の極致」スレッド用に保存させていただきました\n\n貴重なサンプルありがとうございます',
                'お兄さん、自信と正確性の比率がバグってますよ\n\n一回深呼吸してチャート見直すといいかも（優しさ）',
            ],
            ko: [
                '진심 이걸 트윗하고 전송 누른 거임. 여러 번. 자신만만하게.',
                '다음 "망상의 정점" 스레드용으로 저장.',
                '자신감 대 정확도 비율 측정 불가.',
            ],
        },
        vocabulary: {
            en: 'lmao, lol, bruh, brother, sir, ma\'am, this you?, ratio, midwit',
            cn: 'lmao, lol, bruh, brother, sir, ma\'am, this you?, ratio, midwit',
            vi: 'lmao, lol, bro, anh ơi, chú ơi, đây là anh?, ratio',
            ja: 'お兄さん／こいつ／伝説／保存しました／お疲れさまでした／貴重なサンプル／才能／天才／中級者の壁',
            ko: 'ㅋㅋㅋ, ㄹㅇ?, 형씨, 이거 너?, 라시오',
        },
        avoid: {
            en: 'Punch UP not DOWN. No bullying private/vulnerable people. Target bad ideas + public figures only.',
            cn: 'Punch UP not DOWN. No bullying private/vulnerable people. Target bad ideas + public figures only.',
            vi: 'Đánh LÊN không đánh XUỐNG. Không bắt nạt người thường/yếu thế. Chỉ nhắm vào ý tưởng tệ + người của công chúng.',
            ja: 'パンチアップのみ（公人・主張）／私人・弱者NG／差別語NG／脅迫NG／侮辱罪リスク回避',
            ko: '위를 공격, 아래는 공격 안 함. 일반인/약자 괴롭힘 금지. 헛소리와 공인만 타겟.',
        },
    },
};

export function getEdgyToneInstruction(
    tone: ContentTone,
    language: Language,
): string {
    const spec = EDGY_TONE_SPECS[tone];
    if (!spec) return '';

    const examples = spec.examples[language].slice(0, 3).join(' | ');

    return [
        `🔥 TONE: ${tone.toUpperCase()} (intensity ${spec.intensity}/5)`,
        `Description: ${spec.description[language]}`,
        `Vocabulary feel: ${spec.vocabulary[language]}`,
        `Example phrases (style only, don't copy verbatim): ${examples}`,
        `⚠️ AVOID: ${spec.avoid[language]}`,
    ].join('\n');
}

export function getToneInstruction(tone: ContentTone, language: Language, prefix = ''): string {
    if (isEdgyTone(tone)) {
        // Edgy: dùng full spec với examples, vocabulary, avoid rules
        return getEdgyToneInstruction(tone, language);
    }
    const toneHint = getToneHint(tone, language);
    // Regular: dùng short hint
    return tone
        ? `${prefix} Tone: ${toneHint}`
        : ''
}