const axios = require('axios');
const crypto = require('crypto');

function generateSessionHash() {
    return crypto.randomBytes(6).toString('hex');
}

async function taoanhdep(prompt) {
    const sessionHash = generateSessionHash();

    try {
        const url1 = `https://taoanhdep.com/public/gg-dich.php?tukhoa=${encodeURIComponent(prompt)}`;
        const response1 = await axios.get(url1);

        if (response1.status !== 200 || typeof response1.data !== 'string' || !response1.data.trim()) {
            throw new Error(`Không thể dịch prompt sang tiếng Anh.`);
        }

        const text = response1.data;
        const url2 = 'https://black-forest-labs-flux-1-schnell.hf.space/queue/join';

        await axios({
            method: 'OPTIONS',
            url: url2,
            headers: {
                'Origin': 'https://taoanhdep.com',
                'Access-Control-Request-Headers': 'content-type',
                'Access-Control-Request-Method': 'POST',
            }
        });

        const postPayload = {
            "data": [text, 1953943649, true, 1024, 1024, 5],
            "event_data": null,
            "fn_index": 2,
            "trigger_id": 5,
            "session_hash": sessionHash
        };

        await axios.post(url2, postPayload, {
            headers: {
                'Content-Type': 'application/json',
                'Origin': 'https://taoanhdep.com'
            }
        });

        const url4 = `https://black-forest-labs-flux-1-schnell.hf.space/queue/data?session_hash=${sessionHash}`;

        const response4 = await axios.get(url4, {
            headers: {
                'Accept': 'text/event-stream',
                'Cache-Control': 'no-cache',
                'Origin': 'https://taoanhdep.com'
            },
            responseType: 'stream'
        });

        return new Promise((resolve, reject) => {
            let buffer = "";
            let timeout = setTimeout(() => {
                reject(new Error("Quá thời gian chờ tạo ảnh."));
            }, 60000); // 60 giây timeout

            response4.data.on('data', chunk => {
                buffer += chunk.toString();
                const parts = buffer.split('\n\n');
                buffer = parts.pop(); // giữ phần chưa hoàn chỉnh

                for (const event of parts) {
                    if (event.startsWith("data: ")) {
                        try {
                            const parsed = JSON.parse(event.replace("data: ", ""));
                            if (parsed.msg === "process_completed" && parsed.output?.data?.[0]?.url) {
                                clearTimeout(timeout);
                                return resolve(parsed.output.data[0].url);
                            }
                        } catch (e) {
                            // bỏ qua lỗi parse tạm thời
                        }
                    }
                }
            });

            response4.data.on('end', () => {
                clearTimeout(timeout);
                reject(new Error("Không nhận được ảnh từ server."));
            });

            response4.data.on('error', (err) => {
                clearTimeout(timeout);
                reject(err);
            });
        });

    } catch (error) {
        console.error('Tạo ảnh lỗi:', error.message);
        throw error;
    }
}

let streamURL = (url, ext = 'jpg') => axios.get(url, {
    responseType: 'stream',
}).then(res => (res.data.path = `tmp.${ext}`, res.data)).catch(e => null);

module.exports.config = {
    name: "taoanh",
    version: "1.0.0",
    hasPermssion: 0,
    credits: "dungkon x gaudev",
    description: "Tạo ảnh đẹp từ prompt",
    commandCategory: "Tiện ích",
    usages: "[prompt]",
    cooldowns: 5,
};

module.exports.run = async function({ api, event, args }) {
    if (args.length === 0) {
        return api.sendMessage("Vui lòng nhập prompt để tạo ảnh.", event.threadID, event.messageID);
    }

    const prompt = args.join(" ");
    api.sendMessage("⏳ Đang tạo ảnh, vui lòng chờ chút nhé...", event.threadID, event.messageID);

    try {
        const imageUrl = await taoanhdep(prompt);
        const attachment = await streamURL(imageUrl);

        if (!attachment) {
            return api.sendMessage("Có lỗi xảy ra khi tải ảnh, vui lòng thử lại sau.", event.threadID, event.messageID);
        }

        return api.sendMessage({
            body: ``,
            attachment
        }, event.threadID, event.messageID);

    } catch (error) {
        return api.sendMessage("❌ Đã xảy ra lỗi trong quá trình tạo ảnh, vui lòng thử lại sau.", event.threadID, event.messageID);
    }
};
