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

@Wizard(WIZARD_WRITER_SCENE_ID)
export class WriterWizard {
    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 text = 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(STYLE_HINTS_TELEGRAM_BUTTON).map(key => {
            // @ts-ignore
            inline_keyboards.push([{
                text: STYLE_HINTS_TELEGRAM_BUTTON[key].text,
                callback_data: `write_type_${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: `write_type_aineeddetect`},
                        ],
                        [
                            {text: "❌Cancel", callback_data: `write_type_cancel`},
                        ]
                    ]
                }
            }
        );
        ctx.wizard.next();
    }

    @WizardStep(2)
    @On('text')
    @Action(/write_type_(.+)/)
    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 writeType = undefined
        // @ts-ignore
        const selectedItem = ctx.match[1]

        await ctx.answerCbQuery('Đã ghi nhận writing style=' + 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') {
            writeType = undefined;
        } else {
            writeType = selectedItem
        }


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

        (ctx.wizard.state as any).writeType = writeType;
        // @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: `write_tone_${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: `write_tone_aineeddetect`},
                        ],
                        [
                            {text: "❌Cancel", callback_data: `write_tone_cancel`},
                        ]
                    ]
                }
            }
        );

        ctx.wizard.next();
    }

    @WizardStep(3)
    @On('text')
    @Action(/write_tone_(.+)/)
    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 writeTone = undefined
        // @ts-ignore
        const selectedItem = ctx.match[1]

        await ctx.answerCbQuery('Đã ghi nhận ngữ điệu:' + 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') {
            writeTone = undefined;
        } else {
            writeTone = selectedItem
        }


        (ctx.wizard.state as any).writeTone = writeTone;
        const writeType = (ctx.wizard.state as any).writeType;
        const userTopic = (ctx.wizard.state as any).userTopic;
        const language = (ctx.wizard.state as any).language;
        const telegramChatId = (ctx.wizard.state as any).chatId;
        const postLength = undefined;

        // @ts-ignore
        await ctx.reply(`
        Sẽ viết bài bằng ngôn ngữ ${language} độ dài ${postLength} với phong cách ${writeType} và màu sắc ${writeTone} ...
        `);

        await this.managerService.manualTriggerWriteWithReview({
            style: writeType,
            keyword: userTopic,
            tone: writeTone,
            language: language,
            telegramChatId,
            postLength
        })
        await ctx.scene.leave();
    }


}
