import { NextApiRequest, NextApiResponse } from 'next';
import { createConnection } from 'mysql2/promise';

interface VoucherValidationResponse {
  success: boolean;
  discount?: number;
  message?: string;
  voucherType?: 'voucher' | 'coupon';
  discountType?: 'percent' | 'fixed';
}

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

export default async function handler(
  req: NextApiRequest,
  res: NextApiResponse<VoucherValidationResponse>
) {
  if (req.method !== 'POST') {
    return res.status(405).json({ success: false, message: 'Method not allowed' });
  }

  const { code } = req.body;

  if (!code || typeof code !== 'string') {
    return res.status(400).json({ success: false, message: 'Kód je povinný' });
  }

  let connection: any = null;

  try {
    connection = await createDatabaseConnection();

    const upperCode = code.toUpperCase().trim();

    // First try to find in vouchers table
    const [voucherResults] = await connection.execute(
      `SELECT id, value, expires_at, is_active, is_used, 'voucher' as type FROM vouchers WHERE code = ?`,
      [upperCode]
    );

    const vouchers = voucherResults as any[];

    if (vouchers.length > 0) {
      const voucher = vouchers[0];

      // Check if voucher has already been used
      if (voucher.is_used) {
        return res.status(400).json({
          success: false,
          message: 'Tento poukaz byl již použit'
        });
      }

      // Check if voucher is active
      if (!voucher.is_active) {
        return res.status(400).json({
          success: false,
          message: 'Tento poukaz není aktivní'
        });
      }

      // Check if voucher has expired
      const expiresAt = new Date(voucher.expires_at);
      if (expiresAt < new Date()) {
        return res.status(400).json({
          success: false,
          message: 'Tento poukaz vypršel'
        });
      }

      return res.status(200).json({
        success: true,
        discount: typeof voucher.value === 'string' ? parseFloat(voucher.value) : voucher.value,
        voucherType: 'voucher',
      });
    }

    // If not found in vouchers, try coupons table
    const [couponResults] = await connection.execute(
      `SELECT id, discount_value, discount_type, expires_at, is_active, used_count, usage_limit, 'coupon' as type FROM coupons WHERE code = ?`,
      [upperCode]
    );

    const coupons = couponResults as any[];

    if (coupons.length > 0) {
      const coupon = coupons[0];

      // Check if coupon is active
      if (!coupon.is_active) {
        return res.status(400).json({
          success: false,
          message: 'Tento kupón není aktivní'
        });
      }

      // Check if coupon has expired
      const expiresAt = new Date(coupon.expires_at);
      if (expiresAt < new Date()) {
        return res.status(400).json({
          success: false,
          message: 'Tento kupón vypršel'
        });
      }

      // Check usage limit
      if (coupon.used_count >= coupon.usage_limit) {
        return res.status(400).json({
          success: false,
          message: 'Tento kupón byl již použit'
        });
      }

      // For percent discount, we'll return the discount_value as a percentage that cart will apply
      // The server-side will validate the actual discount amount based on cart total
      return res.status(200).json({
        success: true,
        discount: coupon.discount_value, // Percentage value (e.g., 5 for 5%)
        discountType: coupon.discount_type, // 'percent' or 'fixed'
        voucherType: 'coupon',
      });
    }

    return res.status(404).json({
      success: false,
      message: 'Neplatný kód poukazu nebo kuponu'
    });
  } catch (error) {
    return res.status(500).json({
      success: false,
      message: 'Chyba při ověření poukazu'
    });
  } finally {
    if (connection) {
      try {
        await connection.end();
      } catch (e) {
      }
    }
  }
}
