<?php
if (!defined('ABSPATH')) {
    exit;
}

class CSM_Rate_Limiter extends CSM_Base {
    
    /**
     * إعدادات افتراضية
     */
    private $requests_per_minute = 60;
    private $requests_per_hour = 1000;
    
    /**
     * Constructor
     * 
     * @param int $requests_per_minute عدد الطلبات المسموحة في الدقيقة
     * @param int $requests_per_hour عدد الطلبات المسموحة في الساعة
     */
    public function __construct() {
        parent::__construct();
        $this->requests_per_minute = $this->settings['requests_per_minute'];
        $this->requests_per_hour = $this->settings['requests_per_hour'];
    }
    
    /**
     * فحص معدل الطلبات
     * 
     * @param string $client_ip عنوان IP
     * @return bool|WP_Error true إذا مسموح، WP_Error إذا تجاوز الحد
     */
    public function check_rate_limit($client_ip) {
        // فحص حد الدقيقة
        $minute_check = $this->check_minute_limit($client_ip);
        if (is_wp_error($minute_check)) {
            return $minute_check;
        }
        
        // فحص حد الساعة
        $hour_check = $this->check_hour_limit($client_ip);
        if (is_wp_error($hour_check)) {
            return $hour_check;
        }
        
        // تسجيل الطلب
        $this->record_request($client_ip);
        
        return true;
    }
    
    /**
     * فحص حد الدقيقة
     */
    private function check_minute_limit($client_ip) {
        $key = 'csm_rate_limit_minute_' . md5($client_ip);
        $current_minute = floor(time() / 60);
        
        $data = get_transient($key);
        
        if ($data === false || $data['minute'] !== $current_minute) {
            // دقيقة جديدة - إعادة تعيين
            set_transient($key, [
                'minute' => $current_minute,
                'count' => 0
            ], 120); // حفظ لدقيقتين
            return true;
        }
        
        if ($data['count'] >= $this->requests_per_minute) {
            return new WP_Error(
                'rate_limit_exceeded',
                'تم تجاوز حد الطلبات في الدقيقة',
                [
                    'status' => 429,
                    'limit' => $this->requests_per_minute,
                    'period' => 'minute'
                ]
            );
        }
        
        return true;
    }
    
    /**
     * فحص حد الساعة
     */
    private function check_hour_limit($client_ip) {
        $key = 'csm_rate_limit_hour_' . md5($client_ip);
        $current_hour = floor(time() / 3600);
        
        $data = get_transient($key);
        
        if ($data === false || $data['hour'] !== $current_hour) {
            // ساعة جديدة - إعادة تعيين
            set_transient($key, [
                'hour' => $current_hour,
                'count' => 0
            ], 7200); // حفظ لساعتين
            return true;
        }
        
        if ($data['count'] >= $this->requests_per_hour) {
            return new WP_Error(
                'rate_limit_exceeded',
                'تم تجاوز حد الطلبات في الساعة',
                [
                    'status' => 429,
                    'limit' => $this->requests_per_hour,
                    'period' => 'hour'
                ]
            );
        }
        
        return true;
    }
    
    /**
     * تسجيل الطلب
     */
    private function record_request($client_ip) {
        // تحديث عداد الدقيقة
        $minute_key = 'csm_rate_limit_minute_' . md5($client_ip);
        $minute_data = get_transient($minute_key);
        if ($minute_data !== false) {
            $minute_data['count']++;
            set_transient($minute_key, $minute_data, 120);
        }
        
        // تحديث عداد الساعة
        $hour_key = 'csm_rate_limit_hour_' . md5($client_ip);
        $hour_data = get_transient($hour_key);
        if ($hour_data !== false) {
            $hour_data['count']++;
            set_transient($hour_key, $hour_data, 7200);
        }
    }
}