import {Action, Command, Ctx, On, Wizard, WizardStep} from "nestjs-telegraf";
import {WIZARD_COMMENT2_SCENE_ID} from "../telegram.constants";
import * as scenes from "telegraf/scenes";
import {ManagerService} from "../../manager/manager.service";
import {TONE_HINTS_TELEGRAM_BUTTON} from "../../content-writer/prompts/templates";
import {ANGLE_HINTS_TELEGRAM_BUTTON} from "../../content-writer/enum/angle.enum";

@Wizard(WIZARD_COMMENT2_SCENE_ID)
export class Comment2Wizard {
    constructor(
        private readonly managerService: ManagerService,
    ) {
    }

    // Bắt lệnh /cancel để thoát
    @Command('cancel')
    async cancel(@Ctx() ctx: scenes.WizardContext) {
        await ctx.reply('Đã hủy quy trình.');
        return ctx.scene.leave(); // Thoát khỏi wizard ngay lập tức
    }

    @WizardStep(1)
    async onSceneEnter(@Ctx() ctx: scenes.WizardContext) {
        //@ts-ignore
        const userTopic = ctx.message?.text;
        // console.log(ctx.message);
        // const userTopic = (ctx.wizard.state as any).userTopic;
        if (!userTopic) {
            await ctx.reply('Không có thông tin về chủ đề bạn cần viết bài');
            return ctx.scene.leave();
        }
        // @ts-ignore
        const inline_keyboards = [];
        Object.keys(TONE_HINTS_TELEGRAM_BUTTON).map(key => {
            // @ts-ignore
            inline_keyboards.push([{
                text: TONE_HINTS_TELEGRAM_BUTTON[key].text,
                callback_data: `comment_tone_${key}`
            }]);
            return;
        })
        await ctx.sendMessage(
            `🤖 Chọn phong cách viết , bấm \\cancel để huỷ `,
            {
                parse_mode: 'Markdown',
                reply_markup: {
                    inline_keyboard: [
                        ...inline_keyboards,
                        [
                            {text: "🤖AI tự chọn", callback_data: `comment_tone_aineeddetect`},
                        ],
                        [
                            {text: "❌Cancel", callback_data: `comment_tone_cancel`},
                        ]
                    ]
                }
            }
        );
        ctx.wizard.next();
    }

    @WizardStep(2)
    @On('text')
    @Action(/comment_tone_(.+)/)
    async step2(@Ctx() ctx: scenes.WizardContext) {

        if (ctx.text == 'cancel') {
            await ctx.deleteMessage();
            await ctx.reply('Đã hủy quy trình.');
            return ctx.scene.leave();
        }
        // 1. Lấy dữ liệu từ nút bấm

        // @ts-ignore
        if (ctx.match === undefined) {
            await ctx.reply('Đã hủy quy trình.');
            await ctx.deleteMessage();
            return ctx.scene.leave();
        }

        let tone = undefined
        // @ts-ignore
        const selectedItem = ctx.match[1]

        await ctx.answerCbQuery('Đã ghi nhận tone=' + selectedItem);
        if (selectedItem == 'cancel') {
            // Xóa tin nhắn hiện tại
            await ctx.deleteMessage();
            await ctx.reply('Đã hủy quy trình.');
            return ctx.scene.leave();
        }
        if (selectedItem == 'aineeddetect') {
            tone = undefined;
        } else {
            tone = selectedItem
        }


        // Xóa tin nhắn hiện tại
        await ctx.deleteMessage();

        (ctx.wizard.state as any).tone = tone;
        // @ts-ignore
        const inline_keyboards = [];
        Object.keys(ANGLE_HINTS_TELEGRAM_BUTTON).map(key => {
            // @ts-ignore
            inline_keyboards.push([{
                text: ANGLE_HINTS_TELEGRAM_BUTTON[key].text,
                callback_data: `comment_agle_${key}`
            }]);
            return;
        })
        await ctx.sendMessage(
            `🤖 Chọn âm điệu , bấm \\cancel để huỷ `,
            {
                parse_mode: 'Markdown',
                reply_markup: {
                    inline_keyboard: [
                        ...inline_keyboards,
                        [
                            {text: "🤖AI tự chọn", callback_data: `comment_agle_aineeddetect`},
                        ],
                        [
                            {text: "❌Cancel", callback_data: `comment_agle_cancel`},
                        ]
                    ]
                }
            }
        );

        ctx.wizard.next();
    }

    @WizardStep(3)
    @On('text')
    @Action(/comment_agle_(.+)/)
    async step3(@Ctx() ctx: scenes.WizardContext) {
        if (ctx.text == 'cancel') {
            await ctx.deleteMessage();
            await ctx.reply('Đã hủy quy trình.');
            return ctx.scene.leave();
        }
        // 1. Lấy dữ liệu từ nút bấm

        // @ts-ignore
        if (ctx.match === undefined) {
            await ctx.deleteMessage();
            await ctx.reply('Đã hủy quy trình.');
            return ctx.scene.leave();
        }



        let agle = undefined
        // @ts-ignore
        const selectedItem = ctx.match[1]

        await ctx.answerCbQuery('Đã ghi nhận agle:' + selectedItem);
        // Xóa tin nhắn hiện tại
        await ctx.deleteMessage();

        if (selectedItem == 'cancel') {
            await ctx.reply('Đã hủy quy trình.');
            return ctx.scene.leave();
        }
        if (selectedItem == 'aineeddetect') {
            agle = undefined;
        } else {
            agle = selectedItem
        }


        (ctx.wizard.state as any).agle = agle;
        const chatId = (ctx.wizard.state as any).chatId;
        const tone = (ctx.wizard.state as any).tone;
        const tweetId = (ctx.wizard.state as any).tweetId;
        const tweetUrl = (ctx.wizard.state as any).tweetUrl;
        const userTopic = (ctx.wizard.state as any).userTopic;
        const language = (ctx.wizard.state as any).language;
        const postLength = undefined;

        // @ts-ignore
        await ctx.reply(`
        Sẽ viết bài bằng ngôn ngữ ${language} độ dài ${postLength} với tone=${tone} và agle=${agle}.`);

        await this.managerService.manualTriggerCommentAsText({
            agle: agle,
            comtext: userTopic,
            tone: tone,
            language: language,
            tweetId,
            tweetUrl,
            chatId,
        })
        await ctx.scene.leave();
    }

    async doAskTone(ctx: scenes.WizardContext) {
        // @ts-ignore
        const inline_keyboards = [];
        Object.keys(TONE_HINTS_TELEGRAM_BUTTON).map(key => {
            // @ts-ignore
            inline_keyboards.push([{
                text: TONE_HINTS_TELEGRAM_BUTTON[key].text,
                callback_data: `comment_tone_${key}`
            }]);
            return;
        })
        await ctx.sendMessage(
            `🤖 Chọn phong cách viết , bấm \\cancel để huỷ `,
            {
                parse_mode: 'Markdown',
                reply_markup: {
                    inline_keyboard: [
                        ...inline_keyboards,
                        [
                            {text: "🤖AI tự chọn", callback_data: `comment_tone_aineeddetect`},
                        ],
                        [
                            {text: "❌Cancel", callback_data: `comment_tone_cancel`},
                        ]
                    ]
                }
            }
        );
    }
}
