// providers/grok.provider.ts
import { Injectable, Logger } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
import OpenAI from 'openai';
import { IAIProvider, AIMessage, AICompletionOptions, AICompletionResult } from '../interfaces/ai-provider.interface';
import {ChatCompletionTool} from "openai/resources/chat/completions/completions";

/**
 * Grok từ xAI - OpenAI-compatible API.
 * Lợi thế: real-time X data, X-native voice.
 * Dùng cho: English breaking news + witty replies.
 */
@Injectable()
export class GrokProvider implements IAIProvider {
    readonly name = 'grok';
    private readonly logger = new Logger(GrokProvider.name);
    private client: OpenAI;
    private defaultModel: string;

    constructor(private config: ConfigService) {
        // this.client = new OpenAI({
        //     apiKey: this.config.get('XAI_API_KEY'),
        //     baseURL: 'https://api.x.ai/v1',
        // });
        this.client = new OpenAI({
            baseURL: 'https://openrouter.ai/api/v1',
            apiKey: this.config.get('OPEN_ROUTER_API_KEY')
        });
        // grok-3-mini: rẻ & nhanh; grok-3: mạnh hơn
        // this.defaultModel = this.config.get('XAI_MODEL', 'x-ai/grok-3-mini');
        this.defaultModel = this.config.get('XAI_MODEL', 'x-ai/grok-4.1-fast');
    }

    async getModelName() {
        return this.defaultModel;
    }

    async complete(
        messages: AIMessage[],
        options: AICompletionOptions = {}

    ): Promise<AICompletionResult> {
        const model = options.model ?? this.defaultModel;
        const res = await this.client.chat.completions.create({
            model,
            messages,
            temperature: options.temperature ?? 0.8,
            max_tokens: options.maxTokens ?? 400,
        });

        return {
            content: res.choices[0]?.message?.content?.trim() ?? '',
            tokensUsed: res.usage?.total_tokens ?? 0,
            model,
        };
    }

    async complete2(
        messages: AIMessage[],
        options: AICompletionOptions = {},
        tools: Array<ChatCompletionTool> = [],

    ): Promise<AICompletionResult> {
        console.log('complete2')
        const model = options.model ?? this.defaultModel;
        const todayStr = new Date().toISOString().split('T')[0];

        // @ts-ignore
        // @ts-ignore
        const res = await this.client.chat.completions.create({
            model,
            // Tham số đặc biệt của OpenRouter dành cho Grok
            //@ts-ignore
            // plugins: [{ id: "web" }],
            // "plugins": [{ "id": "x_search" }], // Kích hoạt công cụ tìm kiếm X

            extra_body: {
                "plugins": [{ "id": "x_search" }],
                "x_search_filter": {
                    // "from_date": todayStr,       // Định dạng: YYYY-MM-DD
                    "result_type": "recent",         // Lấy bài đăng mới nhất (thay vì bài đăng phổ biến)
                    "count": 5                      // Số lượng bài đăng tối đa muốn quét
                }
            },
            messages,
            // tools: [
            //     {
            //         //@ts-ignore
            //         type: "openrouter:x_search", // Hoặc "openrouter:web_search" tùy theo cấu hình plugin OpenRouter
            //     }
            // ],
            // // Tùy chọn: Ép mô hình dùng tìm kiếm
            // tool_choice: "auto",
            temperature: options.temperature ?? 0.8,
            max_tokens: options.maxTokens ?? 2000,

            max_completion_tokens: 2000,
            // tools: tools,
            // tool_choice: "auto",
            //@ts-ignore
            // extra_body: {
            //     search: {
            //         mode: "on", // hoặc "on"
            //         return_sources: true
            //     }
            // }
        }).catch(err=> {
            console.log(err);
            throw err;
        });

        return {
            content: res.choices[0]?.message?.content?.trim() ?? '',
            tokensUsed: res.usage?.total_tokens ?? 0,
            model,
        };
    }

    /**
     * Grok-only: fetch X context về 1 topic (nếu API hỗ trợ live search).
     * Trả về trends/context để inject vào prompt của writer khác.
     */
    async enrichXContext(topic: string): Promise<string> {
        const messages: AIMessage[] = [
            {
                role: 'system',
                content: 'You have real-time X data. Return concise context only.',
            },
            {
                role: 'user',
                content: `Topic: "${topic}"
Return in 3 bullet points:
- Current trending angle/hashtags on X
- Notable KOL reactions (if any)
- Sentiment (bullish/bearish/mixed)
Max 80 words total.`,
            },
        ];

        const res = await this.complete(
            messages,
            { temperature: 0.3, maxTokens: 150 },
        ).catch(err =>{
            console.log(err);
            console.log(err.message);
            throw err;
        });
        console.log({res});
        return res.content;
    }

    /**
     * Grok-only: fetch X context về 1 topic (nếu API hỗ trợ live search).
     * Trả về trends/context để inject vào prompt của writer khác.
     */
    async searchXContext(topic: string): Promise<string> {
        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: ${topic}, bạn phải sử dụng công cụ tìm kiếm web để lấy thông tin mới nhất.
DO NOT use outdated knowledge.
DO NOT return any news older than 1 day.

If no recent news is found, return an empty list.
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",
      "summary": "tóm tắt dưới 30 chữ",
      "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.
        `;
        const now = new Date();
        const isoDate = now.toISOString().split('T')[0]; // 2026-04-24
        const prompt = `
Search for REAL current news in ${topic} from the past 24 hours.

DO NOT use outdated knowledge.
DO NOT return any news older than 1 day.

If no recent news is found, return an empty list.

Return EXACTLY 3 items in JSON.`;
        const messages: AIMessage[] = [
            {
                role: 'system',
                content: 'You have real-time X data. You must use search. If you cannot find recent information, return empty results.',
            },
            {
                role: 'user',
                content: userPrompt,
//                 content: `Topic: "${topic}"
// Return in 3 bullet points:
// - Current trending angle/hashtags on X
// - Notable KOL reactions (if any)
// - Sentiment (bullish/bearish/mixed)
// Max 80 words total.`,
            },
        ];
        console.log(messages);
        const res = await this.complete(
            messages,
            { temperature: 0.3, maxTokens: 150 },
        ).catch(err =>{
            console.log(err);
            console.log(err.message);
            throw err;
        });
        console.log(res);
        return res.content;
    }
}
