/**
 * PayTR Webhook Security Middleware
 * PayTR IP whitelist kontrolü - Sadece PayTR'dan gelen isteklere 200 OK döndürür
 */

// PayTR resmi IP blokları (PayTR dokümanından)
const PAYTR_IP_WHITELIST = [
  '185.110.188.0/24',  // PayTR IP bloku 1
  '185.110.189.0/24',  // PayTR IP bloku 2
  '127.0.0.1',         // Localhost (test için)
  '::1',               // IPv6 localhost
  '::ffff:127.0.0.1'   // IPv6-mapped IPv4 localhost
];

/**
 * IP adresinin CIDR notasyonundaki bir aralıkta olup olmadığını kontrol eder
 */
function ipInCIDR(ip, cidr) {
  // IPv6 adresini IPv4'e çevir
  if (ip.startsWith('::ffff:')) {
    ip = ip.substring(7);
  }

  if (!cidr.includes('/')) {
    return ip === cidr;
  }

  const [subnet, bits] = cidr.split('/');
  const mask = ~(2 ** (32 - parseInt(bits)) - 1);

  const ipLong = ip.split('.').reduce((acc, octet) => (acc << 8) + parseInt(octet), 0) >>> 0;
  const subnetLong = subnet.split('.').reduce((acc, octet) => (acc << 8) + parseInt(octet), 0) >>> 0;

  return (ipLong & mask) === (subnetLong & mask);
}

/**
 * IP whitelist kontrolü
 */
function isIPWhitelisted(ip) {
  // Test modunda tüm IP'lere izin ver
  if (process.env.PAYTR_TEST_MODE === '1' || process.env.NODE_ENV === 'development') {
    console.log('⚠️ PayTR test mode - IP kontrolü devre dışı');
    return true;
  }

  return PAYTR_IP_WHITELIST.some(range => ipInCIDR(ip, range));
}

/**
 * İstemci IP adresini al (proxy arkasındaysa gerçek IP'yi çıkar)
 */
function getClientIP(req) {
  const ip = req.headers['x-forwarded-for']?.split(',')[0]?.trim() ||
             req.headers['x-real-ip'] ||
             req.connection.remoteAddress ||
             req.socket.remoteAddress ||
             '127.0.0.1';

  // IPv6-mapped IPv4 adresini temizle
  return ip.startsWith('::ffff:') ? ip.substring(7) : ip;
}

/**
 * PayTR Webhook Security Middleware
 * SADECE PayTR IP'lerinden gelen isteklere izin verir
 */
const paytrWebhookSecurity = (req, res, next) => {
  try {
    // 1. Sadece POST metoduna izin ver
    if (req.method !== 'POST') {
      console.error('❌ PayTR Webhook: Method not allowed -', req.method);
      return res.send('OK'); // PayTR için yine OK döndür
    }

    // 2. İstemci IP'sini al
    const clientIP = getClientIP(req);
    console.log('📍 PayTR Webhook IP:', clientIP);

    // 3. IP whitelist kontrolü
    if (!isIPWhitelisted(clientIP)) {
      console.error('❌ PayTR Webhook: Unauthorized IP -', clientIP);
      console.log('🚫 Blocked request from:', {
        ip: clientIP,
        userAgent: req.headers['user-agent'],
        body: req.body
      });

      // GÜVENLİK: PayTR için yine OK döndür (tekrar denemesini önlemek için)
      return res.send('OK');
    }

    // 4. Request body kontrolü
    if (!req.body || Object.keys(req.body).length === 0) {
      console.error('❌ PayTR Webhook: Empty body');
      return res.send('OK');
    }

    // 5. Gerekli alanları kontrol et
    const requiredFields = ['merchant_oid', 'status', 'total_amount', 'hash'];
    const missingFields = requiredFields.filter(field => !req.body[field]);

    if (missingFields.length > 0) {
      console.error('❌ PayTR Webhook: Missing fields -', missingFields);
      return res.send('OK');
    }

    // ✅ Tüm kontroller geçti, controller'a devam et
    console.log('✅ PayTR Webhook: Security passed -', {
      ip: clientIP,
      merchant_oid: req.body.merchant_oid,
      status: req.body.status
    });

    next();

  } catch (error) {
    console.error('❌ PayTR Webhook Security Error:', error);
    res.send('OK'); // PayTR için yine OK döndür
  }
};

module.exports = {
  paytrWebhookSecurity,
  getClientIP,
  isIPWhitelisted,
  PAYTR_IP_WHITELIST
};
