import fetch from "node-fetch";
import express from 'express';
import { Readable } from "stream";
import sharp from "sharp";
import * as config from '../config.js';
const FluxRoutes = express.Router();

/**
 * @param {string} args - The input string
 */
async function schellwithflux(args) {
    const EncodeBaseUrl = "aHR0cHM6Ly9hcGktaW5mZXJlbmNlLmh1Z2dpbmdmYWNlLmNvL21vZGVscy9ibGFjay1mb3Jlc3QtbGFicy9GTFVYLjEtc2NobmVsbA==";
    try {
        const response = await fetch(atob(EncodeBaseUrl), {
            method: "POST",
            headers: {
                "Authorization": `Bearer ${config.HUGGING_TOKEN}`,
                "Content-Type": "application/json",
            },
            body: JSON.stringify({ inputs: args }),
        });
        
        if (!response.ok) {
            console.error(`API Error: ${response.status}`);
            return null;
        }
        return await response.arrayBuffer();
    } catch (error) {
        console.error("Error fetching data:", error.message);
        return null;
    }
}

/**
 * @swagger
 * tags:
 *   name: FLUX
 *   description: Flux AI image generation endpoints.
 */

/**
 * @swagger
 * /api/v1/fluxai-ai:
 *   post:
 *     summary: Generate an image using Flux AI.
 *     tags: [FLUX]
 *     description: This endpoint interacts with Flux AI to generate an image based on the query.
 *     requestBody:
 *       required: true
 *       content:
 *         application/json:
 *           schema:
 *             type: object
 *             properties:
 *               query:
 *                 type: string
 *                 description: The input query for image generation.
 *     responses:
 *       200:
 *         description: A successfully processed image.
 *         content:
 *           image/jpeg:
 *             schema:
 *               type: string
 *               format: binary
 *       400:
 *         description: Missing query parameter.
 *       500:
 *         description: Internal server error.
 */
FluxRoutes.post("/api/v1/fluxai-ai", async (req, res) => {
    try {
        const query = req.body.query;
        if (!query) {
            return res.status(400).send("Query parameter is missing");
        }

        const imageBytes = await schellwithflux(query);
        if (!imageBytes) {
            return res.status(500).json({ error: "Failed to fetch image bytes" });
        }

        const buffer = Buffer.isBuffer(imageBytes) ? imageBytes : Buffer.from(imageBytes);

        const processedImage = await sharp(buffer).jpeg().toBuffer();

        res.set("Content-Type", "image/jpeg");
        Readable.from(processedImage).pipe(res);
    } catch (error) {
        console.error("Error processing image:", error.message);
        res.status(500).json({ error: "Internal server error" });
    }
});

export { FluxRoutes };