import express from 'express';
import { OpenaiRes } from '../lib/scrapper.js';
import { audioContent } from '../lib/all.js';
import { NvidiaTogether } from '../lib/@randydev/together/llama.js';
import { CohereAI } from '../lib/@randydev/together/cohere.js';
import { 
  SYSTEMJAWA, 
  SYSTEMSUNDA,
  SYSTEMMIA,
  PowerFullModerator,
  SENSIFIFNOCODE,
  ALLQURAN_SHOLAWAT,
  LIRIKLAGU,
  QUOTESLUCU,
  QUOTESSEDIH,
  PythonToJS,
  JsToPython,
  curlCommandCode,
} from '../models.js';
import { 
  AlibabaTogether,
  AlibabaTurboTogether,
  CloudFlareQwenTogether,
  DeepseekQwenTogether,
} from '../lib/@randydev/together/qwen-ai.js';

import { CloudFlareMistralTogether } from '../lib/@randydev/together/cloudflare-ai.js';
import { DeepSeekR1 } from '../lib/@randydev/together/blackbox.js';
import { authenticateApiKey, authenticateApiKeyPremium, apiLimiter } from '../middleware/midware.js';
const GptRoutes = express.Router();

import fs from "fs";
import got from "got";

/**
 * @swagger
 * /api/v1/ai/openai/whisper-large-v3-turbo:
 *   get:
 *     summary: Openai Whisper large turbo
 *     tags: [AI]
 *     parameters:
 *       - in: query
 *         name: url
 *         required: true
 *         description: url mp3
 *         schema:
 *           type: string
 *       - in: query
 *         name: language
 *         required: false
 *         description: The language of the audio being transcribed or translated.
 *         schema:
 *           type: string
 *       - in: query
 *         name: task
 *         required: false
 *         description: Supported tasks are 'translate' or 'transcribe'.
 *         schema:
 *           type: string
 *       - in: header
 *         name: x-api-key
 *         required: true
 *         description: API key for authentication
 *         schema:
 *           type: string
 *     responses:
 *       200:
 *         description: Success
 */
GptRoutes.get("/api/v1/ai/openai/whisper-large-v3-turbo", authenticateApiKey, apiLimiter, async (req, res) => {
    const API_BASE_URL = `https://api.cloudflare.com/client/v4/accounts/${process.env['ACCOUNT_ID']}/ai/run/@cf/openai/whisper-large-v3-turbo`;
    const headers = {
        "Authorization": `Bearer ${process.env['CLOUDFLARE_API_KEY']}`,
        "Content-Type": "application/json"
    };
    const url = req.query.url;
    const language = req.query.language || "en";
    const task = req.query.task || "transcribe";

    if (!url) {
        return res.status(500).json({ error: "url required" });
    }

    const path = await audioContent(url);
    if (!path) {
        return res.status(500).json({ error: "Failed to download audio file" });
    }

    try {
        const audioBytes = fs.readFileSync(path);
        const audioBase64 = Buffer.from(audioBytes).toString("base64");

        const inputData = {
          audio: audioBase64,
          language: language,
          task: task
        };

        const response = await got.post(API_BASE_URL, {
            headers,
            json: inputData,
        }).json();
        return res.json(response);
    } catch (error) {
        console.error("Error making API request:", error.message);
        return res.status(500).json({ error: null });
    } finally {
        if (fs.existsSync(path)) {
            fs.unlinkSync(path);
        }
    }
});

/**
 * @swagger
 * /api/v1/ai/deepseek/deepseek-r1-distill-qwen-32b:
 *   get:
 *     summary: deepseek r1 distill-qwen-32b
 *     tags: [AI]
 *     parameters:
 *       - in: query
 *         name: query
 *         required: true
 *         description: User's input query
 *         schema:
 *           type: string
 *       - in: query
 *         name: system_prompt
 *         required: false
 *         description: Custom system prompt
 *         schema:
 *           type: string 
 *       - in: header
 *         name: x-api-key
 *         required: true
 *         description: API key for authentication
 *         schema:
 *           type: string
 *     responses:
 *       200:
 *         description: Success
 */
GptRoutes.get('/api/v1/ai/deepseek/deepseek-r1-distill-qwen-32b', authenticateApiKeyPremium, apiLimiter, async (req, res) => {
    try {
        const query = req.query.query;
        const system_prompt = req.query.system_prompt || "Your name is AkenoX AI A kind and friendly AI assistant that answers in a short and concise answer. Give short step-by-step reasoning if required.";

        const results = await DeepseekQwenTogether(query, {
          system_prompt: system_prompt
        });
        res.json({ results });
    } catch (error) {
        res.status(401).json({ error: error.message });
    }
});

/**
 * @swagger
 * /api/v1/ai/deepseek/deepseek-R1:
 *   get:
 *     summary: Deepseek R1
 *     tags: [AI]
 *     parameters:
 *       - in: query
 *         name: query
 *         required: true
 *         description: User's input query
 *         schema:
 *           type: string
 *       - in: header
 *         name: x-api-key
 *         required: true
 *         description: API key for authentication
 *         schema:
 *           type: string
 *     responses:
 *       200:
 *         description: Success
 */
GptRoutes.get('/api/v1/ai/deepseek/deepseek-R1', authenticateApiKeyPremium, apiLimiter, async (req, res) => {
    try {
        const query = req.query.query;
        const results = await DeepSeekR1(query);
        res.json({ results });
    } catch (error) {
        res.status(401).json({ error: error.message });
    }
});

/**
 * @swagger
 * /api/v1/ai/mistral/mistral-7b-instruct-v0.1:
 *   get:
 *     summary: Mistral AI
 *     tags: [AI]
 *     parameters:
 *       - in: query
 *         name: query
 *         required: true
 *         description: User's input query
 *         schema:
 *           type: string
 *       - in: query
 *         name: system_prompt
 *         required: false
 *         description: Custom system prompt
 *         schema:
 *           type: string
 *       - in: header
 *         name: x-api-key
 *         required: true
 *         description: API key for authentication
 *         schema:
 *           type: string
 *     responses:
 *       200:
 *         description: Success
 */
GptRoutes.get('/api/v1/ai/mistral/mistral-7b-instruct-v0.1', authenticateApiKeyPremium, apiLimiter, async (req, res) => {
    try {
        const query = req.query.query;
        const system_prompt = req.query.system_prompt || "Your name is AkenoX AI A kind and friendly AI assistant that answers in a short and concise answer. Give short step-by-step reasoning if required.";

        const results = await CloudFlareMistralTogether(query, {
          system_prompt: system_prompt
        });
        res.json({ results });
    } catch (error) {
        res.status(401).json({ error: error.message });
    }
});

/**
 * @swagger
 * /api/v1/ai/akenox/lu-melayu:
 *   get:
 *     summary: custom Malay AI
 *     tags: [AI]
 *     parameters:
 *       - in: query
 *         name: query
 *         required: true
 *         description: User's input query
 *         schema:
 *           type: string
 *       - in: header
 *         name: x-api-key
 *         required: true
 *         description: API key for authentication
 *         schema:
 *           type: string
 *     responses:
 *       200:
 *         description: Success
 */
GptRoutes.get('/api/v1/ai/akenox/lu-melayu', authenticateApiKeyPremium, apiLimiter, async (req, res) => {
    try {
        const query = req.query.query;
        const results = await CloudFlareQwenTogether(query, {
          system_prompt: SYSTEMJAWA
        });
        res.json({ results });
    } catch (error) {
        res.status(401).json({ error: error.message });
    }
});

/**
 * @swagger
 * /api/v1/ai/akenox/nocodefou:
 *   get:
 *     summary: Custom NoCodeFou AI
 *     tags: [AI]
 *     parameters:
 *       - in: query
 *         name: query
 *         required: true
 *         description: User's input query
 *         schema:
 *           type: string
 *       - in: header
 *         name: x-api-key
 *         required: true
 *         description: API key for authentication
 *         schema:
 *           type: string
 *     responses:
 *       200:
 *         description: Success
 */
GptRoutes.get('/api/v1/ai/akenox/nocodefou', authenticateApiKeyPremium, apiLimiter, async (req, res) => {
    try {
        const query = req.query.query;
        if (!query) {
            return res.status(500).json({ error: "query required" });
        }
        const results = await AlibabaTogether(query, {
          system_prompt: SENSIFIFNOCODE
        });
        res.json({ results });
    } catch (error) {
        res.status(401).json({ error: error.message });
    }
});

/**
 * @swagger
 * /api/v1/ai/akenox/mia-khalifah:
 *   get:
 *     summary: Custom Mia Khalifah AI
 *     tags: [AI]
 *     parameters:
 *       - in: query
 *         name: query
 *         required: true
 *         description: User's input query
 *         schema:
 *           type: string
 *       - in: header
 *         name: x-api-key
 *         required: true
 *         description: API key for authentication
 *         schema:
 *           type: string
 *     responses:
 *       200:
 *         description: Success
 */
GptRoutes.get('/api/v1/ai/akenox/mia-khalifah', authenticateApiKeyPremium, apiLimiter, async (req, res) => {
    try {
        const query = req.query.query;
        if (!query) {
            return res.status(500).json({ error: "query required" });
        }
        const results = await AlibabaTogether(query, {
          system_prompt: SYSTEMMIA
        });
        res.json({ results });
    } catch (error) {
        res.status(401).json({ error: error.message });
    }
});

/**
 * @swagger
 * /api/v1/ai/akenox/curl-command-code:
 *   get:
 *     summary: Custom Curl Command Converter Python & Javascript AI
 *     tags: [AI]
 *     parameters:
 *       - in: query
 *         name: query
 *         required: true
 *         description: User's input query
 *         schema:
 *           type: string
 *       - in: header
 *         name: x-api-key
 *         required: true
 *         description: API key for authentication
 *         schema:
 *           type: string
 *     responses:
 *       200:
 *         description: Success
 */
GptRoutes.get('/api/v1/ai/akenox/curl-command-code', authenticateApiKeyPremium, apiLimiter, async (req, res) => {
    try {
        const query = req.query.query;
        if (!query) {
            return res.status(500).json({ error: "query required" });
        }
        const results = await CloudFlareQwenTogether(query, {
          system_prompt: curlCommandCode
        });
        res.json({ results });
    } catch (error) {
        res.status(401).json({ error: error.message });
    }
});

/**
 * @swagger
 * /api/v1/ai/akenox/python-to-js-api:
 *   get:
 *     summary: Custom Python to JS Requests Converter AI
 *     tags: [AI]
 *     parameters:
 *       - in: query
 *         name: query
 *         required: true
 *         description: User's input query
 *         schema:
 *           type: string
 *       - in: header
 *         name: x-api-key
 *         required: true
 *         description: API key for authentication
 *         schema:
 *           type: string
 *     responses:
 *       200:
 *         description: Success
 */
GptRoutes.get('/api/v1/ai/akenox/python-to-js-api', authenticateApiKeyPremium, apiLimiter, async (req, res) => {
    try {
        const query = req.query.query;
        if (!query) {
            return res.status(500).json({ error: "query required" });
        }
        const results = await CloudFlareQwenTogether(query, {
          system_prompt: PythonToJS
        });
        res.json({ results });
    } catch (error) {
        res.status(401).json({ error: error.message });
    }
});

/**
 * @swagger
 * /api/v1/ai/akenox/js-to-python-api:
 *   get:
 *     summary: Custom JS to Python Requests Converter AI
 *     tags: [AI]
 *     parameters:
 *       - in: query
 *         name: query
 *         required: true
 *         description: User's input query
 *         schema:
 *           type: string
 *       - in: header
 *         name: x-api-key
 *         required: true
 *         description: API key for authentication
 *         schema:
 *           type: string
 *     responses:
 *       200:
 *         description: Success
 */
GptRoutes.get('/api/v1/ai/akenox/js-to-python-api', authenticateApiKeyPremium, apiLimiter, async (req, res) => {
    try {
        const query = req.query.query;
        if (!query) {
            return res.status(500).json({ error: "query required" });
        }
        const results = await CloudFlareQwenTogether(query, {
          system_prompt: JsToPython
        });
        res.json({ results });
    } catch (error) {
        res.status(401).json({ error: error.message });
    }
});

/**
 * @swagger
 * /api/v1/ai/akenox/quotes-sad:
 *   get:
 *     summary: Custom Quotes Sad AI
 *     tags: [AI]
 *     parameters:
 *       - in: query
 *         name: query
 *         required: true
 *         description: User's input query
 *         schema:
 *           type: string
 *       - in: header
 *         name: x-api-key
 *         required: true
 *         description: API key for authentication
 *         schema:
 *           type: string
 *     responses:
 *       200:
 *         description: Success
 */
GptRoutes.get('/api/v1/ai/akenox/quotes-sad', authenticateApiKeyPremium, apiLimiter, async (req, res) => {
    try {
        const query = req.query.query;
        if (!query) {
            return res.status(500).json({ error: "query required" });
        }
        const results = await CloudFlareQwenTogether(query, {
          system_prompt: QUOTESSEDIH
        });
        res.json({ results });
    } catch (error) {
        res.status(401).json({ error: error.message });
    }
});

/**
 * @swagger
 * /api/v1/ai/akenox/quotes-lucu:
 *   get:
 *     summary: Custom Quotes Lucu AI
 *     tags: [AI]
 *     parameters:
 *       - in: query
 *         name: query
 *         required: true
 *         description: User's input query
 *         schema:
 *           type: string
 *       - in: header
 *         name: x-api-key
 *         required: true
 *         description: API key for authentication
 *         schema:
 *           type: string
 *     responses:
 *       200:
 *         description: Success
 */
GptRoutes.get('/api/v1/ai/akenox/quotes-lucu', authenticateApiKeyPremium, apiLimiter, async (req, res) => {
    try {
        const query = req.query.query;
        if (!query) {
            return res.status(500).json({ error: "query required" });
        }
        const results = await CloudFlareQwenTogether(query, {
          system_prompt: QUOTESLUCU
        });
        res.json({ results });
    } catch (error) {
        res.status(401).json({ error: error.message });
    }
});

/**
 * @swagger
 * /api/v1/ai/akenox/lirik-end:
 *   get:
 *     summary: Custom Lirik Lagu End AI
 *     tags: [AI]
 *     parameters:
 *       - in: query
 *         name: query
 *         required: true
 *         description: User's input query
 *         schema:
 *           type: string
 *       - in: header
 *         name: x-api-key
 *         required: true
 *         description: API key for authentication
 *         schema:
 *           type: string
 *     responses:
 *       200:
 *         description: Success
 */
GptRoutes.get('/api/v1/ai/akenox/lirik-end', authenticateApiKeyPremium, apiLimiter, async (req, res) => {
    try {
        const query = req.query.query;
        if (!query) {
            return res.status(500).json({ error: "query required" });
        }
        const results = await CloudFlareQwenTogether(query, {
          system_prompt: LIRIKLAGU
        });
        res.json({ results });
    } catch (error) {
        res.status(401).json({ error: error.message });
    }
});

/**
 * @swagger
 * /api/v1/ai/akenox/al-sholawat:
 *   get:
 *     summary: Custom Al-Sholawat AI
 *     tags: [AI]
 *     parameters:
 *       - in: query
 *         name: query
 *         required: true
 *         description: User's input query
 *         schema:
 *           type: string
 *       - in: header
 *         name: x-api-key
 *         required: true
 *         description: API key for authentication
 *         schema:
 *           type: string
 *     responses:
 *       200:
 *         description: Success
 */
GptRoutes.get('/api/v1/ai/akenox/al-sholawat', authenticateApiKeyPremium, apiLimiter, async (req, res) => {
    try {
        const query = req.query.query;
        if (!query) {
            return res.status(500).json({ error: "query required" });
        }
        const results = await CloudFlareQwenTogether(query, {
          system_prompt: ALLQURAN_SHOLAWAT
        });
        res.json({ results });
    } catch (error) {
        res.status(401).json({ error: error.message });
    }
});

/**
 * @swagger
 * /api/v1/ai/akenox/moderator:
 *   get:
 *     summary: Custom Moderator AI
 *     tags: [AI]
 *     parameters:
 *       - in: query
 *         name: query
 *         required: true
 *         description: User's input query
 *         schema:
 *           type: string
 *       - in: query
 *         name: username
 *         required: true
 *         description: Owner's Username
 *         schema:
 *           type: string
 *       - in: header
 *         name: x-api-key
 *         required: true
 *         description: API key for authentication
 *         schema:
 *           type: string
 *     responses:
 *       200:
 *         description: Success
 */
GptRoutes.get('/api/v1/ai/akenox/moderator', authenticateApiKeyPremium, apiLimiter, async (req, res) => {
    try {
        const query = req.query.query;
        const username = req.query.username;
        if (!username) {
            return res.status(500).json({ error: "username required" });
        }
        if (!query) {
            return res.status(500).json({ error: "query required" });
        }
        const systemResult = PowerFullModerator(username);
        const results = await CloudFlareQwenTogether(query, {
          system_prompt: systemResult
        });
        res.json({ results });
    } catch (error) {
        res.status(401).json({ error: error.message });
    }
});


/**
 * @swagger
 * /api/v1/ai/qwen/qwen1.5-1.8b-chat:
 *   get:
 *     summary: Qwen AI
 *     tags: [AI]
 *     parameters:
 *       - in: query
 *         name: query
 *         required: true
 *         description: User's input query
 *         schema:
 *           type: string
 *       - in: query
 *         name: system_prompt
 *         required: false
 *         description: Custom system prompt
 *         schema:
 *           type: string
 *       - in: header
 *         name: x-api-key
 *         required: true
 *         description: API key for authentication
 *         schema:
 *           type: string
 *     responses:
 *       200:
 *         description: Success
 */
GptRoutes.get('/api/v1/ai/qwen/qwen1.5-1.8b-chat', authenticateApiKeyPremium, apiLimiter, async (req, res) => {
    try {
        const query = req.query.query;
        const system_prompt = req.query.system_prompt || "Your name is AkenoX AI A kind and friendly AI assistant that answers in a short and concise answer. Give short step-by-step reasoning if required.";

        const results = await CloudFlareQwenTogether(query, {
          system_prompt: system_prompt
        });
        res.json({ results });
    } catch (error) {
        res.status(401).json({ error: error.message });
    }
});

/**
 * @swagger
 * /api/v1/ai/akenox/lu-sunda:
 *   get:
 *     summary: Custom Sunda AI
 *     tags: [AI]
 *     parameters:
 *       - in: query
 *         name: query
 *         required: true
 *         description: User's input query
 *         schema:
 *           type: string
 *       - in: header
 *         name: x-api-key
 *         required: true
 *         description: API key for authentication
 *         schema:
 *           type: string
 *     responses:
 *       200:
 *         description: Success
 */
GptRoutes.get('/api/v1/ai/akenox/lu-sunda', authenticateApiKeyPremium, apiLimiter, async (req, res) => {
    try {
        const query = req.query.query;
        const results = await AlibabaTogether(query, {
          system_prompt: SYSTEMSUNDA
        });

        res.json({ results });
    } catch (error) {
        res.status(401).json({ error: error.message });
    }
});

/**
 * @swagger
 * /api/v1/ai/alibaba/qwen-turbo-latest:
 *   get:
 *     summary: Alibaba Qwen Turbo Latest AI
 *     tags: [AI]
 *     parameters:
 *       - in: query
 *         name: query
 *         required: true
 *         description: User's input query
 *         schema:
 *           type: string
 *       - in: query
 *         name: system_prompt
 *         required: false
 *         description: Custom system prompt
 *         schema:
 *           type: string
 *       - in: header
 *         name: x-api-key
 *         required: true
 *         description: API key for authentication
 *         schema:
 *           type: string
 *     responses:
 *       200:
 *         description: Success
 */
GptRoutes.get('/api/v1/ai/alibaba/qwen-turbo-latest', authenticateApiKeyPremium, apiLimiter, async (req, res) => {
    try {
        const query = req.query.query;
        const system_prompt = req.query.system_prompt || "Your name is AkenoX AI A kind and friendly AI assistant that answers in a short and concise answer. Give short step-by-step reasoning if required.";

        const results = await AlibabaTurboTogether(query, {
          system_prompt: system_prompt
        });

        res.json({ results });
    } catch (error) {
        res.status(401).json({ error: error.message });
    }
});

/**
 * @swagger
 * /api/v1/ai/alibaba/qwen-plus:
 *   get:
 *     summary: Alibaba Qwen AI
 *     tags: [AI]
 *     parameters:
 *       - in: query
 *         name: query
 *         required: true
 *         description: User's input query
 *         schema:
 *           type: string
 *       - in: query
 *         name: system_prompt
 *         required: false
 *         description: Custom system prompt
 *         schema:
 *           type: string
 *       - in: header
 *         name: x-api-key
 *         required: true
 *         description: API key for authentication
 *         schema:
 *           type: string
 *     responses:
 *       200:
 *         description: Success
 */
GptRoutes.get('/api/v1/ai/alibaba/qwen-plus', authenticateApiKeyPremium, apiLimiter, async (req, res) => {
    try {
        const query = req.query.query;
        const system_prompt = req.query.system_prompt || "Your name is AkenoX AI A kind and friendly AI assistant that answers in a short and concise answer. Give short step-by-step reasoning if required.";

        const results = await AlibabaTogether(query, {
          system_prompt: system_prompt
        });

        res.json({ results });
    } catch (error) {
        res.status(401).json({ error: error.message });
    }
});

/**
 * @swagger
 * /api/v1/ai/cohere/command-plus:
 *   get:
 *     summary: Cohere AI
 *     tags: [AI]
 *     parameters:
 *       - in: query
 *         name: query
 *         required: true
 *         description: User's input query
 *         schema:
 *           type: string
 *       - in: query
 *         name: system_prompt
 *         required: false
 *         description: Custom system prompt
 *         schema:
 *           type: string
 *       - in: query
 *         name: chatHistory
 *         required: false
 *         description: Previous chat history in JSON format
 *         schema:
 *           type: string
 *       - in: header
 *         name: x-api-key
 *         required: true
 *         description: API key for authentication
 *         schema:
 *           type: string
 *     responses:
 *       200:
 *         description: Success
 */
GptRoutes.get('/api/v1/ai/cohere/command-plus', authenticateApiKeyPremium, apiLimiter, async (req, res) => {
    try {
        const query = req.query.query;
        const chatHistory = req.query.chatHistory ? JSON.parse(req.query.chatHistory) : [];
        const system_prompt = req.query.system_prompt || "Your name is AkenoX AI A kind and friendly AI assistant that answers in a short and concise answer. Give short step-by-step reasoning if required.";

        const results = await CohereAI(query, {
          system_prompt: system_prompt,
          chatHistory: chatHistory
        });

        res.json({ results });
    } catch (error) {
        res.status(401).json({ error: error.message });
    }
});

/**
 * @swagger
 * /api/v1/ai/nvidia/llama-31-70b:
 *   get:
 *     summary: Nvidia LLama AI
 *     tags: [AI]
 *     parameters:
 *       - in: query
 *         name: query
 *         required: true
 *         description: null
 *         schema:
 *           type: string
 *       - in: query
 *         name: system_prompt
 *         required: false
 *         description: null
 *         schema:
 *           type: string
 *       - in: header
 *         name: x-api-key
 *         required: true
 *         description: API key for authentication
 *         schema:
 *           type: string
 *     responses:
 *       200:
 *         description: Success
 */
GptRoutes.get('/api/v1/ai/nvidia/llama-31-70b', authenticateApiKeyPremium, apiLimiter, async (req, res) => {
    try {
        const query = req.query.query;
        let system_prompt = "Your name is AkenoX AI A kind and friendly AI assistant that answers in\na short and concise answer. Give short step-by-step reasoning if required.\n";
        system_prompt = req.query.system_prompt ? req.query.system_prompt : system_prompt;
        const results = await NvidiaTogether(query, {
          system_prompt: system_prompt
        });
        res.json({ results });
    } catch (error) {
        res.status(401).json({ error: error.message });
    }
});

/* GptRoutes.get('/api/v1/ai/openai/gpt-4o', authenticateApiKey, apiLimiter, async (req, res) => {
    try {
        const query = req.query.query;
        const results = await OpenaiRes(query);
        res.json({ results });
    } catch (error) {
        res.status(401).json({ error: error.message });
    }
}); */

export { GptRoutes };