import { DB } from './db';
import { TelegramClient } from './telegram';
import { StateManager } from './state';
import { AiService } from './services';
import { PaymentService } from './services';
import { users, tests, payments } from './schema';
import { eq, desc } from 'drizzle-orm';
import * as CONST from './constants';

// Telegram allows disabling forwarding/saving; pull the flag from env so it can be toggled without code changes
const PROTECT_CONTENT = process.env.PROTECT_CONTENT !== 'false';

export class Handlers {
  constructor(
    private db: DB,
    private telegram: TelegramClient,
    private state: StateManager,
    private ai: AiService,
    private payments: PaymentService
  ) { }

  async ensureUser(from: any) {
    await this.db.insert(users).values({
      telegramId: from.id.toString(),
      username: from.username,
      firstName: from.first_name,
    }).onConflictDoUpdate({
      target: users.telegramId,
      set: { username: from.username, firstName: from.first_name }
    });
  }

  async start(msg: any) {
    await this.ensureUser(msg.from);
    await this.telegram.deleteMessage(msg.chat.id, msg.message_id);
    await this.sendMainMenu(msg.chat.id, msg.from.id.toString());
  }

  async sendMainMenu(chatId: number, userId: string) {
    const user = await this.db.query.users.findFirst({
      where: eq(users.telegramId, userId),
      with: { tests: { orderBy: desc(tests.createdAt), limit: 1 } }
    });

    const hasTests = user?.tests && user.tests.length > 0 && user.tests[0].currentStep >= CONST.QUESTIONS.length;

    const buttons = [
      [{ text: '💔 شروع تست', callback_data: 'start_test' }],
      [{ text: 'جردن پیترسون کیست؟', callback_data: 'peterson' }],
      [{ text: 'خیانت رو ببخشم؟', callback_data: 'forgive' }],
      [{ text: 'خیانت با من چیکار می‌کنه؟', callback_data: 'effects' }],
    ];

    if (hasTests) {
      buttons.push([{ text: '📊 نتیجه آخرین تست', callback_data: 'get_result' }]);
    }

    const caption = `<b>مطمئن شو قلب و احساست در امانه 💔</b>\n\nمی‌خوای بدونی بهت خیانت میشه یا نه؟\nمی‌خوای جلوی سوءاستفاده عاطفی رو بگیری؟\n\nتست روانشناسی خیانت، طراحی‌شده توسط دکتر جردن پیترسون، بهت کمک می‌کنه با آگاهی و اطمینان، امنیت عاطفیت رو حفظ کنی.\n\n<b>همین حالا شروع کن!</b>`;

    await this.telegram.sendVideo(chatId, process.env.VIDEO_START || '', {
      caption,
      parse_mode: 'HTML',
      reply_markup: { inline_keyboard: buttons },
      protect_content: PROTECT_CONTENT,
    });
  }

  async forgive(chatId: number) {
    await this.telegram.sendVideo(chatId, process.env.VIDEO_FORGIVE || '', {
      caption: CONST.FORGIVE_CAPTION,
      reply_markup: { inline_keyboard: [[{ text: '🔙 بازگشت', callback_data: 'back' }]] },
      protect_content: PROTECT_CONTENT
    });
  }

  async effects(chatId: number) {
    await this.telegram.sendVideo(chatId, process.env.VIDEO_EFFECTS || '', {
      caption: CONST.EFFECTS_CAPTION,
      reply_markup: { inline_keyboard: [[{ text: '🔙 بازگشت', callback_data: 'back' }]] },
      protect_content: PROTECT_CONTENT
    });
  }

  async peterson(chatId: number) {
    await this.telegram.sendMessage(chatId, CONST.WHO_IS_JORDAN, {
      reply_markup: { inline_keyboard: [[{ text: '🔙 بازگشت', callback_data: 'back' }]] },
      protect_content: PROTECT_CONTENT
    });
  }

  async startTestConfirm(chatId: number) {
    await this.telegram.sendMessage(chatId, CONST.DO_YOU_HAVE_COURAGE, {
      reply_markup: {
        inline_keyboard: [
          [{ text: 'شهامتش رو دارم', callback_data: 'confirm_test' }],
          [{ text: 'منصرف شدم', callback_data: 'back' }]
        ]
      },
      protect_content: PROTECT_CONTENT
    });
  }

  async startTest(chatId: number, userId: string) {
    const user = await this.db.query.users.findFirst({ where: eq(users.telegramId, userId) });
    if (!user) return;

    const [newTest] = await this.db.insert(tests).values({ userId: user.id, answers: {}, currentStep: 0 }).returning();

    this.state.set(userId, { testId: newTest.id, questionIndex: 0, waitingForAnswer: true });
    await this.sendQuestion(chatId, 0);
  }

  async sendQuestion(chatId: number, index: number) {
    const keyboard = index > 0 ? { inline_keyboard: [[{ text: '⏮ ویرایش سوال قبلی', callback_data: `edit_${index - 1}` }]] } : undefined;

    await this.telegram.sendMessage(
      chatId,
      `سوال ${index + 1} از ${CONST.QUESTIONS.length}:\n\n${CONST.QUESTIONS[index]}\n\nلطفا پاسخ خود را تایپ کنید:`,
      { reply_markup: keyboard, protect_content: PROTECT_CONTENT }
    );
  }

  async handleTestAnswer(chatId: number, userId: string, answer: string, state: any) {
    const { testId, questionIndex } = state;

    const test = await this.db.query.tests.findFirst({ where: eq(tests.id, testId) });
    if (!test) return;

    const answers: any = test.answers || {};
    answers[questionIndex] = answer;

    await this.db.update(tests).set({ answers, currentStep: questionIndex + 1 }).where(eq(tests.id, testId));

    if (questionIndex + 1 >= CONST.QUESTIONS.length) {
      this.state.delete(userId);
      // تغییر: ارسال userId به متد completeTest
      await this.completeTest(chatId, userId, testId);
    } else {
      this.state.set(userId, { ...state, questionIndex: questionIndex + 1 });
      await this.sendQuestion(chatId, questionIndex + 1);
    }
  }

  async editQuestion(chatId: number, userId: string, qIndex: number, messageId: number) {
    const state = this.state.get(userId);
    if (!state) return;

    this.state.set(userId, { ...state, questionIndex: qIndex, waitingForAnswer: true });
    await this.telegram.deleteMessage(chatId, messageId);
    await this.sendQuestion(chatId, qIndex);
  }

  // --- تغییر اساسی در این متد ---
  async completeTest(chatId: number, userId: string, testId: number) {
    await this.db.update(tests).set({ completedAt: new Date() }).where(eq(tests.id, testId));

    // دریافت اطلاعات کاربر برای بررسی وضعیت پرمیوم
    const user = await this.db.query.users.findFirst({ where: eq(users.telegramId, userId) });
    if (!user) return;

    const teaserIndex = testId % CONST.TEASER_MESSAGES.length;
    const teaser = CONST.TEASER_MESSAGES[teaserIndex];

    // **حالت پرمیوم**
    if (user.isPremium) {
      const msg = `✅ تمام سوالات تکمیل شد!\n\n${teaser}\n\n🌟 <b>کاربر گرامی، تحلیل شما آماده است!</b>\nاز آنجا که شما اشتراک پرمیوم دارید، می‌توانید بلافاصله تحلیل دقیق و هوشمند پاسخ‌های خود را مشاهده کنید.\n\n👇 روی دکمه زیر کلیک کنید:`;

      await this.telegram.sendMessage(chatId, msg, {
        parse_mode: 'HTML',
        reply_markup: {
          inline_keyboard: [
            // دکمه مستقیم برای گرفتن نتیجه (اجرای AI)
            [{ text: '📊 مشاهده نتیجه و تحلیل کامل', callback_data: 'get_result' }]
          ]
        }
      });
    }
    // **حالت رایگان**
    else {
      const toman = Number(process.env.TOMAN_PRICE || 99000).toLocaleString('fa-IR');
      const msg = `✅ تمام سوالات تکمیل شد!\n\n${teaser}\n\n⚠️ <b>تحلیل حرفه‌ای و تخصصی</b>\nاگر می‌خواهید بدانید این پاسخ‌ها دقیقاً چه معنایی دارند و متخصصین ما وضعیت رابطه‌تان را تحلیل کنند، روی دکمه زیر کلیک کنید:`;

      await this.telegram.sendMessage(chatId, msg, {
        parse_mode: 'HTML',
        reply_markup: {
          inline_keyboard: [
            [{ text: `🔐 درخواست تحلیل حرفه‌ای: ${toman} تومان`, callback_data: 'pay_rial' }]
          ]
        }
      });
    }
  }

  async getResult(chatId: number, userId: string) {
    await this.showTestResult(chatId, userId, false);
  }

  async demoResult(chatId: number) {
    await this.telegram.sendMessage(chatId, "نسخه نمایشی:", { reply_markup: { inline_keyboard: [[{ text: '🔙 بازگشت', callback_data: 'back' }]] } });
  }

  private async showTestResult(chatId: number, userId: string, isDemo: boolean) {
    const user = await this.db.query.users.findFirst({
      where: eq(users.telegramId, userId),
      with: { tests: { orderBy: desc(tests.createdAt), limit: 1 } }
    });

    if (!user || !user.tests[0]) {
      return this.telegram.sendMessage(chatId, 'شما هنوز تستی انجام نداده‌اید.');
    }

    const test = user.tests[0];

    // اگر پرمیوم است یا دمو، نتیجه را تولید/نمایش بده
    if (user.isPremium || isDemo) {
      if (!test.result) {
        const loadingMsg = await this.telegram.sendMessage(chatId, '🧠 در حال تحلیل پاسخ‌های شما ...');
        try {
          const result = await this.ai.generateResult(test.answers);
          await this.db.update(tests).set({ result }).where(eq(tests.id, test.id));
          test.result = result;
          if (loadingMsg) await this.telegram.deleteMessage(chatId, loadingMsg.result.message_id);
        } catch (e) {
          return this.telegram.sendMessage(chatId, '❌ خطا در پردازش نتیجه.');
        }
      }

      const chunks = test.result!.match(/.{1,4000}/g) || [test.result!];
      for (const chunk of chunks) {
        await this.telegram.sendMessage(chatId, chunk);
      }

      await this.telegram.sendMessage(chatId, 'می‌خواهید تست جدید انجام دهید؟', {
        reply_markup: {
          inline_keyboard: [
            [{ text: '🔄 تست مجدد', callback_data: 'start_test' }],
            [{ text: '🔙 بازگشت', callback_data: 'back' }]
          ]
        }
      });
    }
    // اگر رایگان است و روی "نتیجه آخرین تست" کلیک کرده
    else {
      const teaserIndex = test.id % CONST.TEASER_MESSAGES.length;
      const teaser = CONST.TEASER_MESSAGES[teaserIndex];
      const toman = Number(process.env.TOMAN_PRICE || 99000).toLocaleString('fa-IR');

      const msg = `✅ تمام سوالات تکمیل شد!\n\n${teaser}\n\n⚠️ <b>تحلیل حرفه‌ای و تخصصی</b>\nاگر می‌خواهید بدانید این پاسخ‌ها دقیقاً چه معنایی دارند و متخصصین ما وضعیت رابطه‌تان را تحلیل کنند، روی دکمه زیر کلیک کنید:`;

      await this.telegram.sendMessage(chatId, msg, {
        parse_mode: 'HTML',
        reply_markup: {
          inline_keyboard: [
            [{ text: `🔐 درخواست تحلیل حرفه‌ای: ${toman} تومان`, callback_data: 'pay_rial' }],
            [{ text: '🔙 بازگشت به منو', callback_data: 'back' }]
          ]
        },
        protect_content: PROTECT_CONTENT
      });
    }
  }

  async upgradePremium(chatId: number) {
    const toman = Number(process.env.TOMAN_PRICE || 333000).toLocaleString('fa-IR');
    const msg = `⭐ ارتقا به پرمیوم\n\n• تحلیل کامل و تخصصی\n\n💰 قیمت: ${toman} تومان\n`;
    await this.telegram.sendMessage(chatId, msg, {
      reply_markup: {
        inline_keyboard: [
          [{ text: '💳 پرداخت ریالی', callback_data: 'pay_rial' }],
          [{ text: '🔙 بازگشت', callback_data: 'back' }]
        ]
      }
    });
  }

  async payRial(chatId: number, userId: string, messageId: number) {
    const user = await this.db.query.users.findFirst({ where: eq(users.telegramId, userId) });
    if (!user) return;
    if (user.isPremium) return this.telegram.sendMessage(chatId, 'شما قبلاً کاربر پرمیوم هستید!');

    if (process.env.IS_FREE === 'true') {
      console.log(`🚀 Free Mode Payment for user ${userId}`);

      await this.db.insert(payments).values({
        userId: user.id,
        type: 'rial_bypass',
        amount: 0,
        currency: 'irr',
        orderId: `free_${user.id}_${Date.now()}`,
        status: 'confirmed',
        paymentUrl: 'http://free-mode',
        paymentId: 'free-mode-bypass'
      });

      await this.db.update(users).set({ isPremium: true }).where(eq(users.id, user.id));

      await this.telegram.deleteMessage(chatId, messageId);
      await this.telegram.sendMessage(chatId, '🎉 <b>تبریک! پرداخت شما با موفقیت انجام شد.</b>\n(حالت تست فعال است)\n\nحساب شما به نسخه پرمیوم ارتقا یافت. اکنون می‌توانید نتیجه کامل تست را مشاهده کنید.\n\n👇 روی دکمه زیر کلیک کنید:', {
        parse_mode: 'HTML',
        reply_markup: { inline_keyboard: [[{ text: '📊 مشاهده نتیجه کامل', callback_data: 'get_result' }]] }
      });
      return;
    }

    try {
      const { paymentUrl } = await this.payments.createRialPayment(user.id);

      await this.telegram.editMessageText(chatId, messageId, '💳 برای پرداخت روی دکمه زیر کلیک کنید:', {
        reply_markup: {
          inline_keyboard: [
            [{ text: '👉 ورود به درگاه پرداخت', url: paymentUrl }],
            [{ text: '🔙 بازگشت', callback_data: 'back' }]
          ]
        }
      });
    } catch (e: any) {
      console.error('💥 Error in payRial Handler:', e.message);
      await this.telegram.sendMessage(chatId, '❌ خطا در ایجاد لینک پرداخت.\nلطفاً با پشتیبانی تماس بگیرید یا دوباره تلاش کنید.');
    }
  }

  async payCrypto(chatId: number, userId: string, messageId: number) {
    const user = await this.db.query.users.findFirst({ where: eq(users.telegramId, userId) });
    if (!user) return;
    try {
      const { paymentUrl, orderId } = await this.payments.createCryptoPayment(user.id);
      await this.telegram.editMessageText(chatId, messageId, '🪙 برای پرداخت با کریپتو:', {
        reply_markup: {
          inline_keyboard: [
            [{ text: '💳 پرداخت', url: paymentUrl }],
            [{ text: 'بررسی وضعیت', callback_data: `check_payment_${orderId}` }],
            [{ text: '🔙 بازگشت', callback_data: 'upgrade_premium' }]
          ]
        }
      });
    } catch (e) {
      await this.telegram.sendMessage(chatId, '❌ خطا در پرداخت.');
    }
  }

  async checkPayment(chatId: number, userId: string, orderId: string, messageId: number) {
    const payment = await this.db.query.payments.findFirst({ where: eq(payments.orderId, orderId) });
    const status = payment?.status === 'confirmed' || payment?.status === 'finished' ? '✅ تایید شده' : '⏳ در انتظار تایید';
    await this.telegram.editMessageText(chatId, messageId, `وضعیت پرداخت: ${status}`, {
      reply_markup: { inline_keyboard: [[{ text: '🔙 بازگشت', callback_data: 'back' }]] }
    });
    if (payment?.status === 'confirmed') {
      this.sendMainMenu(chatId, userId);
    }
  }

  async showDevStats(chatId: number) {
    const total = await this.db.select().from(users).then(r => r.length);
    const premium = await this.db.select().from(users).where(eq(users.isPremium, true)).then(r => r.length);
    await this.telegram.sendMessage(chatId, `👥 Users: ${total}\n💎 Premium: ${premium}`);
  }
}
