import type { NextApiRequest, NextApiResponse } from 'next';
import { createConnection } from 'mysql2/promise';
import { notifyPaidOrderById } from '@/lib/telegram';

async function createDatabaseConnection() {
  return await createConnection({
    host: process.env.DB_HOST,
    user: process.env.DB_USER,
    password: process.env.DB_PASSWORD,
    database: process.env.DB_NAME,
  });
}

export default async function handler(
  req: NextApiRequest,
  res: NextApiResponse<any>
) {
  // Comgate posílá POST request s výsledkem platby
  if (req.method !== 'POST') {
    return res.status(200).json({ message: 'OK' });
  }

  try {
    console.log('[CHECKOUT SUCCESS] Received POST from Comgate', {
      status: req.body?.status,
      refId: req.body?.refId,
      transId: req.body?.transId,
    });

    const { refId, status, transId, amount, curr, email } = req.body;

    // Povinná pole
    if (!refId || !status) {
      console.error('[CHECKOUT SUCCESS] Missing required fields', { refId, status });
      return res.status(200).json({ message: 'OK' });
    }

    // Zkonvertujeme status z Comgate formátu
    let statusId = 1; // pending (default)
    if (status === 'PAID') statusId = 2;
    else if (status === 'CANCELLED') statusId = 3;
    else if (status === 'FAILED') statusId = 4;

    console.log('[CHECKOUT SUCCESS] Processing payment', {
      refId,
      status,
      statusId,
      transId,
    });

    const connection = await createDatabaseConnection();

    try {
      // Najdi objednávku
      const [orders] = await connection.execute(
        'SELECT id, total_price, status_id FROM orders WHERE order_number = ?',
        [refId]
      );

      const orderList = orders as any[];
      if (orderList.length === 0) {
        console.error('[CHECKOUT SUCCESS] Order not found', { refId });
        await connection.end();
        return res.status(200).json({ message: 'OK' });
      }

      const orderId = orderList[0].id;

      console.log('[CHECKOUT SUCCESS] Order found', { orderId, refId });

      // Aktualizuj payment záznam
      if (transId) {
        console.log('[CHECKOUT SUCCESS] Updating payment record', { transId, status: status });
        
        // Zkontroluj zda payment záznam existuje
        const [payments] = await connection.execute(
          'SELECT id FROM payments WHERE trans_id = ?',
          [transId]
        );

        const paymentList = payments as any[];
        
        if (paymentList.length > 0) {
          // Update existujícího payment záznamu
          await connection.execute(
            'UPDATE payments SET status = ?, updated_at = NOW() WHERE trans_id = ?',
            [status, transId]
          );
          console.log('[CHECKOUT SUCCESS] Payment record updated');
        } else {
          // Vytvoř nový payment záznam pokud neexistuje
          const paymentResponse = JSON.stringify({
            transId,
            status,
            amount,
            curr,
            email,
            receivedAt: new Date().toISOString(),
          });

          await connection.execute(
            'INSERT INTO payments (order_id, trans_id, amount, currency, status, comgate_response) VALUES (?, ?, ?, ?, ?, ?)',
            [orderId, transId, amount || 0, curr || 'CZK', status, paymentResponse]
          );
          console.log('[CHECKOUT SUCCESS] Payment record created');
        }
      }

      // Aktualizuj status objednávky pouze pokud je to PAID
      if (statusId === 2) {
        const previousStatusId = Number(orderList[0].status_id || 0)
        console.log('[CHECKOUT SUCCESS] Updating order status to PAID', { orderId });
        await connection.execute(
          'UPDATE orders SET status_id = ?, updated_at = NOW() WHERE id = ?',
          [statusId, orderId]
        );
        console.log('[CHECKOUT SUCCESS] Order status updated');
        if (previousStatusId !== 2) {
          await notifyPaidOrderById(connection, orderId)
        }
      }

      console.log('[CHECKOUT SUCCESS] Processing complete', { refId, status });
    } finally {
      await connection.end();
    }

    res.status(200).json({ message: 'OK' });
  } catch (error) {
    console.error('[CHECKOUT SUCCESS] Error processing', error);
    // Vždy vrátíme 200 aby Comgate věděl že jsme obdrželi notifikaci
    res.status(200).json({ message: 'OK' });
  }
}
