import 'dotenv/config';
import express from 'express';
import { Bot } from './bot';
import { db } from './db';
import { TelegramClient } from './telegram';
import { Handlers } from './handlers';
import { StateManager } from './state';
import { AiService, PaymentService } from './services';
import { users, payments } from './schema';
import { eq } from 'drizzle-orm';

const app = express();

// پشتیبانی از فرم‌دیتای URL Encoded برای کال‌بک پی‌استار
app.use(express.urlencoded({ extended: true }));
app.use(express.json());

const telegram = new TelegramClient(process.env.BOT_TOKEN!);
const state = new StateManager();
const ai = new AiService();
const payService = new PaymentService(db);
const handlers = new Handlers(db, telegram, state, ai, payService);
const bot = new Bot(telegram, handlers, state, db);

// Webhook تلگرام
app.post('/webhook', async (req, res) => {
  await bot.handleUpdate(req.body);
  res.sendStatus(200);
});

// --- هندل کردن بازگشت پرداخت پی‌استار ---
app.post('/api/payments/paystar-callback', async (req, res) => {
  console.log('🔄 PayStar Callback Received:', req.body);
  
  // پارامترهایی که پی‌استار می‌فرستد
  const { status, order_id, ref_num, tracking_code, card_number } = req.body;

  // اگر پرداخت موفق نبود
  if (String(status) !== '1') {
    return res.send(`
      <div style="text-align:center;font-family:tahoma;padding:50px;">
        <h1 style="color:red">پرداخت ناموفق بود ❌</h1>
        <p>وضعیت: ${status}</p>
        <a href="https://t.me/${(await telegram.getMe()).username}">بازگشت به ربات</a>
      </div>
    `);
  }

  try {
    // 1. پیدا کردن رکورد پرداخت در دیتابیس
    const payment = await db.query.payments.findFirst({ where: eq(payments.orderId, order_id) });
    
    if (!payment) {
      return res.status(404).send('سفارش یافت نشد');
    }

    // 2. اگر قبلاً تایید شده، کاری نکن
    if (payment.status === 'confirmed') {
      return res.send('<h1 style="text-align:center;color:green">این تراکنش قبلا تایید شده است ✅</h1>');
    }

    // 3. استعلام (Verify) تراکنش از پی‌استار
    // نکته: مبلغ ذخیره شده در دیتابیس ریال است، همان را می‌فرستیم
    const verifyResult = await payService.verifyRialPayment(
      ref_num, 
      payment.amount, 
      card_number, 
      tracking_code
    );

    if (verifyResult.status === 1) {
      // 4. آپدیت دیتابیس و پرمیوم کردن کاربر
      await db.update(payments).set({ 
        status: 'confirmed', 
        paymentId: ref_num 
      }).where(eq(payments.id, payment.id));
      
      await db.update(users).set({ isPremium: true }).where(eq(users.id, payment.userId));

      // 5. ارسال پیام تبریک به کاربر در تلگرام
      const user = await db.query.users.findFirst({ where: eq(users.id, payment.userId) });
      if (user) {
        await telegram.sendMessage(
          parseInt(user.telegramId), 
          '🎉 <b>تبریک! پرداخت شما با موفقیت انجام شد.</b>\n\nحساب شما به نسخه پرمیوم ارتقا یافت. اکنون می‌توانید نتیجه کامل تست را مشاهده کنید.\n\n👇 روی دکمه زیر کلیک کنید:',
          { 
            parse_mode: 'HTML',
            reply_markup: { inline_keyboard: [[{ text: '📊 مشاهده نتیجه کامل', callback_data: 'get_result' }]] }
          }
        );
      }

      return res.send(`
        <div style="text-align:center;font-family:tahoma;padding:50px;">
          <h1 style="color:green">پرداخت با موفقیت انجام شد ✅</h1>
          <p>شماره پیگیری: ${ref_num}</p>
          <a href="https://t.me/${(await telegram.getMe()).username}" style="background:#0088cc;color:white;padding:10px 20px;text-decoration:none;border-radius:5px;">بازگشت به ربات</a>
        </div>
      `);
    } else {
      throw new Error('Verify failed');
    }

  } catch (e: any) {
    console.error('Callback Verify Error:', e);
    return res.send(`
      <div style="text-align:center;font-family:tahoma;padding:50px;">
        <h1 style="color:orange">تراکنش نیاز به بررسی دارد ⚠️</h1>
        <p>پول از حساب کسر شد اما تایید نهایی انجام نشد. نگران نباشید، اگر مبلغی کسر شده باشد تا ۷۲ ساعت بازمی‌گردد یا با پشتیبانی تماس بگیرید.</p>
      </div>
    `);
  }
});

// --- کال‌بک کریپتو (NowPayments) ---
app.post('/api/payments/ipn', async (req, res) => {
  const sig = req.headers['x-nowpayments-sig'];
  if (payService.verifyIpnSignature(req.body, sig as string)) {
    const { order_id, payment_status, payment_id } = req.body;
    const payment = await db.query.payments.findFirst({ where: eq(payments.orderId, order_id) });
    
    if (payment) {
      await db.update(payments).set({ status: payment_status, paymentId: payment_id.toString() }).where(eq(payments.id, payment.id));
      
      if (['confirmed', 'finished'].includes(payment_status)) {
        await db.update(users).set({ isPremium: true }).where(eq(users.id, payment.userId));
        const user = await db.query.users.findFirst({ where: eq(users.id, payment.userId) });
        if (user) {
          await telegram.sendMessage(parseInt(user.telegramId), '🎉 تبریک! حساب شما پرمیوم شد.\nبرای دیدن نتیجه تست مجددا اقدام کنید.');
        }
      }
    }
  }
  res.sendStatus(200);
});

app.get('/health', async (req, res) => {
  try {
    await db.execute(require('drizzle-orm').sql`SELECT 1`);
    res.json({ status: 'healthy', bot: await telegram.getMe() });
  } catch (e: any) {
    res.status(500).json({ status: 'unhealthy', error: e.message });
  }
});

app.get('/', (req, res) => {
  res.send(`
    <!DOCTYPE html>
    <html>
    <head><title>Bot Server</title></head>
    <body><h1>Server is Running...</h1></body>
    </html>
  `);
});

const PORT = process.env.PORT || 2001;
app.listen(PORT, async () => {
  console.log(`Server running on port ${PORT}`);
  try {
    const url = `${process.env.APP_URL}/webhook`;
    await telegram.setWebhook(url);
    console.log(`Webhook set to ${url}`);
  } catch (e) {
    console.error('Failed to set webhook', e);
  }
});