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

@Wizard(WIZARD_QUOTE_SCENE_MAIN)
export class QuoteWizard {
    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) {

        const isQuoteUrl = (ctx.wizard.state as any).quoteAs === 'quotelink';

        //@ts-ignore
        const text = ctx.message?.text;
        console.log(ctx.message);
        if (isQuoteUrl) {
            const linkX = text.split(' ')[1]; // Gets "my_payload"

            if (!linkX) {
                await ctx.reply('URL X không hợp lệ');
                return ctx.scene.leave();
            }

            let _linkX = linkX.replace('twitter.com', 'x.com').split('?')[0];
            const match = _linkX.match(/status\/(\d+)/);
            if (!match) {
                await ctx.reply('URL X không hợp lệ');
                return ctx.scene.leave();
            }
            const tweetId = match[1];
            // 1. Lưu dữ liệu vào state
            (ctx.wizard.state as any).linkUrl = linkX;
            (ctx.wizard.state as any).tweetId = tweetId;
        }
        // @ts-ignore
        const inline_keyboards = [];
        Object.keys(QUOTE_TYPE_TELEGRAM_BUTTON_SPECS).map(key => {
            // @ts-ignore
            inline_keyboards.push([{
                text: QUOTE_TYPE_TELEGRAM_BUTTON_SPECS[key].text,
                callback_data: `quote_type_${key}`
            }]);
            return;
        })
        await ctx.sendMessage(
            `🤖 Chọn phong cách quote , bấm \\cancel để huỷ `,
            {
                parse_mode: 'Markdown',
                reply_markup: {
                    inline_keyboard: [
                        // @ts-ignore
                        ...inline_keyboards,
                        [
                            {text: "🤖AI tự chọn", callback_data: `quote_type_aineeddetect`},
                        ],
                        [
                            {text: "❌Cancel", callback_data: `quote_type_cancel`},
                        ]
                    ]
                }
            }
        );
        ctx.wizard.next();
    }

    @WizardStep(2)
    @On('text')
    @Action(/quote_type_(.+)/)
    async step2(@Ctx() ctx: scenes.WizardContext) {
        await ctx.answerCbQuery('Đã ghi nhận');
        // Xóa tin nhắn hiện tại
        await ctx.deleteMessage();
        if (ctx.text == 'cancel') {
            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.');
            return ctx.scene.leave();
        }

        let quoteType = undefined
        // @ts-ignore
        const selectedItem = ctx.match[1]
        if (selectedItem == 'cancel') {
            await ctx.reply('Đã hủy quy trình.');
            return ctx.scene.leave();
        }
        if (selectedItem == 'aineeddetect') {
            quoteType = undefined;
        } else {
            quoteType = selectedItem
        }
        // 2. Lưu vào state để dùng cho các bước sau (nếu cần)
        // (ctx.wizard.state as any).type = quoteType;

        const language = (ctx.wizard.state as any).language;
        const quoteAs = (ctx.wizard.state as any).quoteAs;

        const telegramChatId = ''+ctx?.chat?.id!;
        // @ts-ignore
        await ctx.reply(`Sẽ viết quote bằng ngôn ngữ ${language} với phong cách ${quoteType}-${QUOTE_TYPE_TELEGRAM_BUTTON_SPECS[quoteType]?.text!} ...`);

        if (quoteAs === 'quotetext') {
            const userTopic = (ctx.wizard.state as any).quoteText;

            await this.managerService.manualTriggerQuoteAsTextInput(
                userTopic,
                quoteType,
                language,
                telegramChatId
            )
        } else {
            const twitterUrl = (ctx.wizard.state as any).linkUrl;

            await this.managerService.manualTriggerQuoteLinkTwitter(
                twitterUrl,
                quoteType,
                language,
                telegramChatId
            );
        }


        await ctx.scene.leave();
    }
}
