// src/shared/ai.service.ts
import "dotenv/config";
import {Injectable, OnModuleInit} from '@nestjs/common';
import {GenerativeModel, GoogleGenerativeAI} from '@google/generative-ai';
import {OpenAI} from "openai";
import {_JsonParseSafe} from "./helper";
import {GrokProvider} from "../modules/content-writer/providers/grok.provider";

@Injectable()
export class AIService implements OnModuleInit {
    private genAI: GoogleGenerativeAI;
    private model: GenerativeModel;
    private deepSeekModel;
    private chatgptModel;

    constructor(private grokProvider: GrokProvider) {
    }

    private prompts_config = {
        crypto: "Written in the style of a financial expert, using many crypto terms, dramatic tone, adding hashtags like #Bitcoin #CryptoNews #Web3...",
        war: "Written in the style of war news, objective but intense, using icons like 🚨, 🎖️, 📍.",
        general: "Written in a humorous style, approachable to the online community, internet-friendly tone."
    };
    private INTENT_MAP = {
        just_in: "Write short breaking news immediately when an event just happened or is trending. Requirements: Start with: 🚨 JUST IN or 🔴 BREAKING, First sentence MUST answer: WHO + WHAT is happening, short: 2–4 sentences total, Tone: urgent, factual, no speculation",
        breaking_news: "Write short, urgent, high-impact with strong hook.",
        analysis: "Focus on insights, implications, and deeper meaning.",
        educational: "Explain clearly in simple terms.",
        thread: "Format as X thread, structured points.",
        default: ""
    };
    private preferLanguage = {
        'vi': 'việt nam',
        'vn': 'việt nam',
        'en': 'english',
        'us': 'english',
        'jp': 'japanese',
        'kr': 'korean',
    }


    onModuleInit() {
        // "models/gemini-2.5-flash",
        //     "models/gemini-2.5-pro",
        //     "models/gemini-2.0-flash",
        //     "models/gemini-2.0-flash-001",
        //     "models/gemini-2.0-flash-lite-001",
        //     "models/gemini-2.0-flash-lite",
        //     "models/gemini-2.5-flash-lite",
        // Khởi tạo SDK với API Key từ file .env
        this.genAI = new GoogleGenerativeAI(process.env.GEMINI_API_KEY!);

        // Sử dụng gemini-1.5-flash cho tốc độ nhanh và giá rẻ (hoặc miễn phí)
        const modelName: string = 'gemini-2.5-flash';

        this.model = this.genAI.getGenerativeModel({
            model: modelName,
            generationConfig: {
                responseMimeType: "text/plain",
                // Ép AI trả về JSON chuẩn
            }
        });
        console.log('Initializing gemini model...');

        this.getDeepSeekModel();
        this.getChatgptModel();
    }


    async getDeepSeekModel() {
        if (!this.deepSeekModel) {
            this.deepSeekModel = new OpenAI({
                baseURL: 'https://api.deepseek.com',
                apiKey: process.env.DEEPSEEK_API_KEY,
            });
            console.log('Initializing deepseek model...');
        }
        return this.deepSeekModel;

    }

    async getChatgptModel() {
        if (!this.chatgptModel) {
            this.chatgptModel = new OpenAI({
                apiKey: process.env.CHATGPT_API_KEY,
            });
        }
        console.log('Initializing chatgpt model...');
        return this.chatgptModel;
    }

    async listAvailableModels() {
        try {
            const response = await fetch(`https://generativelanguage.googleapis.com/v1/models?key=${process.env.GEMINI_API_KEY}`);
            const data = await response.json();
            return data.models.map(m => m.name)
        } catch (e) {
            console.error('Không thể lấy danh sách model:', e);
        }
    }

    async detectStyle(text) {
        if (/ btc| bitcoin| eth | crypto| defi| airdrop| xrp| web3/i.test(text)) return "crypto";
        if (/ war| attack| missile| army| weapon| conflict/i.test(text)) return "war";
        return "general";

    }

    async detectIntent(text) {
        if (/just in|alert/i.test(text)) return "just_in";
        if (/ breaking|just in|urgent|alert/i.test(text)) return "breaking_news";
        if (/why|how|analysis|insight/i.test(text)) return "analysis";
        if (/guide|what is|learn/i.test(text)) return "educational";
        if (/thread/i.test(text)) return "thread";
        return "default";
    }

    async detectTone(text) {
        if (/pump|moon|bull/i.test(text)) return "bullish";
        if (/dump|crash|fear/i.test(text)) return "bearish";
        return "neutral";
    }

    // @ts-ignore
    //private genAI = new GoogleGenerativeAI(process.env.GEMINI_API_KEY);

    async askQuestion(question) {
        console.log(`câu hỏi: ${question} `);

        const finalUserPrompt = `
        Hãy trả lời yêu cầu sau: ${question}
  `;

        const completion = await this.deepSeekModel.chat.completions.create({
            model: 'deepseek-chat',
            messages: [
                {role: 'system', content: `Dùng văn bản thuần túy, không dùng định dạng Markdown`},
                {role: 'user', content: finalUserPrompt}
            ],
        },)

        let text = completion.choices[0]?.message?.content?.trim() ?? ''
        console.log({finalUserPrompt, text});
          const  tokensUsed= completion.usage?.total_tokens ?? 0;
        return {
            prompt: finalUserPrompt,
            content: text,
            title: question,
            tokensUsed,
            model: 'deepseek-chat',
        }
    }
    async askQuestionenXcontext(question) {
        const xContext = await this.grokProvider.enrichXContext(question);
        return {
            content: xContext,
            title: question,
            model: this.grokProvider.getModelName(),
        }
    }

    async analyzeTrend(content: string, style: string): Promise<any> {
        const finalUserPrompt = `
      Bạn là một chuyên gia phân tích tin tức. 
      Nội dung tin: ${content}
      Chủ đề yêu cầu: ${style}
      
      Hãy phân tích và trả về JSON:
      1. is_relevant: (true/false) tin này có đúng chủ đề không?
      2. hot_score: (1-10) độ hot của tin.
      3. summary: tóm tắt ngắn gọn dưới 50 chữ.
      4. keywords: các từ khóa chính để tìm video TikTok.
    `;
        const sysPrompt = `
        Yêu cầu 
        `
        const userPrompt = `
        
        Bạn là một hệ thống phân tích tin tức tự động. 
Khi người dùng yêu cầu tìm: ${content}, bạn phải sử dụng công cụ tìm kiếm web để lấy thông tin mới nhất.

Yêu cầu nghiêm ngặt về đầu ra:
- Chỉ trả về duy nhất một đối tượng JSON hợp lệ.
- Không được có bất kỳ ký tự, dòng text, giải thích hay markdown nào trước hoặc sau JSON.
- Không được dùng \`\`\`json ... \`\`\`.
- JSON phải đúng cú pháp, dùng dấu nháy kép (").
        
        Cấu trúc JSON bắt buộc:
{
  "news": [
    {
      "title": "tiêu đề tin",
      "hot_score": 1-10,
      "summary": "tóm tắt dưới 50 chữ",
      "keywords": ["từ khóa 1", "từ khóa 2"],
      "source": "tên nguồn báo hoặc web search và link",
      "is_relevant": true,
      "day": "ngày tin tức xuất hiện"
    }
  ]
}

Chỉ trả về JSON. Không thêm bất kỳ điều gì khác.
        
    
Yêu cầu: chỉ lấy từ các nguồn báo uy tín
        `;
        // Ưu tiên tin về cá kinh tế, văn hóa, công nghệ hoặc xã hội.

        // const result = await this.deepSeekModel.(prompt);
        const grokResult = await this.grokProvider.searchXContext(content);
        return {
            // prompt: userPrompt,
            title: content,
            result: grokResult
        }
        const completion = await this.deepSeekModel.chat.completions.create({
            model: 'deepseek-chat',
            messages: [
                // {role: 'system', content: system_prompt},
                {role: 'user', content: userPrompt}
            ],
        },)
        let respMessageContent = '' + completion.choices[0].message.content;
        console.log('analyzeTrend=>response');
        console.log({userPrompt});
        console.log('respMessageContent:==>', respMessageContent);
        const result = _JsonParseSafe(respMessageContent);
        return {
            prompt: userPrompt,
            title: content,
            result
        }
    }

    async generateContentViaDeepseek(topic: string, style: string, contentLang: string = 'en') {
        const _style = await this.detectStyle(topic);
        const _intent = await this.detectIntent(topic);
        const _tone = await this.detectTone(topic);
        const selectedStyle = this.prompts_config[_style] || this.prompts_config.general;
        const selectedIntent = this.INTENT_MAP[_intent] || this.INTENT_MAP.default;
        const selectedContentLang = this.preferLanguage[contentLang] || this.preferLanguage.en;

        console.log(`đang viết bài cho chủ đề băng deepseek: ${topic} với ngôn ngữ ${selectedContentLang} style ${_style} intent: ${_intent}`);

        const system_prompt = `
        You are a strictly monolingual AI.

TARGET_LANGUAGE = ${selectedContentLang}

You MUST:
- Respond ONLY in TARGET_LANGUAGE
- Ignore all other languages
- Never mix languages
- The names of people or countries may retain their original names.
 `
        const finalUserPrompt = `
        [Target Language: ${selectedContentLang}]
        IMPORTANT: Your previous answer violated language rules.
        Rewrite strictly in ${selectedContentLang} only.

Based on the following topic: "${topic}" with content in the language ${selectedContentLang}
Write a complete twitter post with content in the language ${selectedContentLang}.
Requirements:
- ${selectedStyle}
- ${selectedIntent}
- Length: Approximately 50-100-200-300-400 words depending on context or user input.
- Structure: Title -> Main content -> Interactive question -> Hashtag.
- If the topic is crypto/finance: Append this disclaimer: “⚠️ This content is for informational purposes only, not financial advice. DYOR.”,if not, skip disclaimer.
  `;

        const completion = await this.deepSeekModel.chat.completions.create({
            model: 'deepseek-chat',
            messages: [
                {role: 'system', content: system_prompt},
                {role: 'user', content: finalUserPrompt}
            ],
        },)

        let text = completion.choices[0].message.content;
        const tokensUsed= completion.usage?.total_tokens ?? 0;
        console.log({finalUserPrompt, text});
        return {
            prompt: finalUserPrompt,
            // content: text,
            topic: topic,
            title: topic,
            final: text,
            draft: undefined,
            reviewNotes: undefined,
            detectedStyle: selectedStyle,
            detectedTone: selectedIntent,
            tokensUsed,
            model: 'deepseek-chat',
        }
    }

    // Thêm vào src/shared/ai.service.ts

    async generateContentViaGemini(topic: string, style: string, contentLang: string = 'vi'): Promise<any> {
        const _style = await this.detectStyle(topic)
        const selectedPrompt = this.prompts_config[_style] || this.prompts_config.general;
        // const selectedPrompt = this.prompts_config[style] || this.prompts_config.general;
        const selectedContentLang = this.preferLanguage[contentLang] || this.preferLanguage.vi;


        const finalUserPrompt = `
        [Target Language: ${selectedContentLang}]
        IMPORTANT: Your previous answer violated language rules.
        Rewrite strictly in ${selectedContentLang} only.

Based on the following topic: "${topic}" with content in the language ${selectedContentLang}
Write a complete Facebook post with content in the language ${selectedContentLang}.
Requirements:
- ${selectedPrompt}
- Length: Approximately 200-300-400 words depending on context.
- Structure: Title -> Main content -> Interactive question -> Hashtag.
- If the topic is crypto/finance: Append this disclaimer: “⚠️ This content is for informational purposes only, not financial advice. DYOR.”,if not, skip disclaimer.
- response is text
  `;

        console.log('finalPrompt==>', finalUserPrompt)
        console.log(`đang viết bài cho chủ đề băng gemini: ${topic} với ngôn ngữ ${selectedContentLang} style ${_style}`);

        const result = await this.model.generateContent(finalUserPrompt);
        return {
            prompt: finalUserPrompt,
            content: result.response.text()
        }
    }

}
