import { TelegramClient } from './telegram';
import { Handlers } from './handlers';
import { StateManager } from './state';
import { DB } from './db';

export class Bot {
  constructor(
    private telegram: TelegramClient,
    private handlers: Handlers,
    private state: StateManager,
    private db: DB
  ) {}

  async handleUpdate(update: any) {
    try {
      // لاگ کردن کل آپدیت برای دیباگ
      if (update.message) {
        console.log('📨 New Message Received:', Object.keys(update.message));
        await this.handleMessage(update.message);
      } else if (update.callback_query) {
        await this.handleCallback(update.callback_query);
      }
    } catch (err) {
      console.error('Update Error:', err);
    }
  }

  private async handleMessage(msg: any) {
    if (!msg.from) return;
    
    const userId = msg.from.id.toString();
    const chatId = msg.chat.id;

    // --- بخش دریافت File ID (تشخیص ویدیو و داکیومنت) ---
    // چک کردن اینکه آیا پیام ویدیو است؟
    if (msg.video) {
      const fileId = msg.video.file_id;
      console.log('🎥 Video Detected. File ID:', fileId);
      
      await this.telegram.sendMessage(chatId, `✅ <b>VIDEO ID:</b>\n<code>${fileId}</code>`, { 
        parse_mode: 'HTML',
        reply_to_message_id: msg.message_id
      });
      return;
    }

    // چک کردن اینکه آیا پیام فایل (Document) است؟ (گاهی ویدیو به عنوان فایل ارسال می‌شود)
    if (msg.document) {
      const fileId = msg.document.file_id;
      const mime = msg.document.mime_type; // مثلا video/mp4
      console.log('📁 Document Detected. File ID:', fileId, 'Mime:', mime);

      await this.telegram.sendMessage(chatId, `✅ <b>DOCUMENT ID (${mime}):</b>\n<code>${fileId}</code>`, { 
        parse_mode: 'HTML',
        reply_to_message_id: msg.message_id
      });
      return;
    }
    // --------------------------------------------------

    // اگر پیام متنی نیست، ادامه نده
    if (!msg.text) {
      console.log('⚠️ Message is not text, video, or document. Type:', Object.keys(msg));
      return;
    }
    
    const text = msg.text;

    // Save/Update user
    await this.handlers.ensureUser(msg.from);

    // Commands
    if (text === '/start') return this.handlers.start(msg);
    if (text === '/answer') return this.handlers.getResult(msg.chat.id, userId);
    if (text === '/version' || text === '/v') return this.telegram.sendMessage(msg.chat.id, 'v2.0.0 (Express)');
    if (text === '/cheat') return this.handlers.demoResult(msg.chat.id);
    if (text === '/support') return this.telegram.sendMessage(msg.chat.id, `${process.env.SUPPORT_ID} جهت پشتیبانی به این ایدی پیام بدین`);
    if (text === '/dev_stats') return this.handlers.showDevStats(msg.chat.id);

    // State handling (Test answers)
    const userState = this.state.get(userId);
    if (userState && userState.waitingForAnswer) {
      await this.handlers.handleTestAnswer(msg.chat.id, userId, text, userState);
    }
  }

  private async handleCallback(cb: any) {
    // کد قبلی شما بدون تغییر
    const userId = cb.from.id.toString();
    const chatId = cb.message.chat.id;
    const data = cb.data;

    await this.telegram.answerCallbackQuery(cb.id);
    await this.handlers.ensureUser(cb.from);

    // Handle patterns
    if (data.startsWith('check_payment_')) {
      const orderId = data.replace('check_payment_', '');
      return this.handlers.checkPayment(chatId, userId, orderId, cb.message.message_id);
    }
    if (data.startsWith('edit_')) {
      const qIndex = parseInt(data.replace('edit_', ''));
      return this.handlers.editQuestion(chatId, userId, qIndex, cb.message.message_id);
    }

    // Menu Actions
    switch (data) {
      case 'peterson':
        await this.telegram.deleteMessage(chatId, cb.message.message_id);
        return this.handlers.peterson(chatId);
      case 'forgive':
        await this.telegram.deleteMessage(chatId, cb.message.message_id);
        return this.handlers.forgive(chatId);
      case 'effects':
        await this.telegram.deleteMessage(chatId, cb.message.message_id);
        return this.handlers.effects(chatId);
      case 'start_test':
        await this.telegram.deleteMessage(chatId, cb.message.message_id);
        return this.handlers.startTestConfirm(chatId);
      case 'confirm_test':
        await this.telegram.deleteMessage(chatId, cb.message.message_id);
        return this.handlers.startTest(chatId, userId);
      case 'back':
        await this.telegram.deleteMessage(chatId, cb.message.message_id);
        return this.handlers.sendMainMenu(chatId, userId);
      case 'get_result':
        await this.telegram.deleteMessage(chatId, cb.message.message_id);
        return this.handlers.getResult(chatId, userId);
      case 'upgrade_premium':
        await this.telegram.deleteMessage(chatId, cb.message.message_id);
        return this.handlers.upgradePremium(chatId);
      case 'pay_crypto':
        return this.handlers.payCrypto(chatId, userId, cb.message.message_id);
      case 'pay_rial':
        return this.handlers.payRial(chatId, userId, cb.message.message_id);
      case 'demo_result': 
        await this.telegram.deleteMessage(chatId, cb.message.message_id);
        return this.handlers.demoResult(chatId);
    }
  }
}