<?php
/**
 * كلاس التحقق وإدارة مفاتيح API في Central Site Manager
 */
class CSM_API_Key_Validator extends CSM_Base {

    /**
     * مفتاح التخزين في قاعدة البيانات
     */
    private $option_key = 'csm_api_keys';

    public function __construct() {
        parent::__construct();
    }

    /**
     * التحقق من صحة مفتاح API
     * يتم حفظ مجموعة من المفاتيح وكل مفتاح معه تاريخ الانتهاء - ثم جلبها لفحص المفتاح المطلوب 
     * فحص وجود المفتاح - تاريخ الصلاحية
     * @param string $api_key
     * @return true|WP_Error
     */
    public function validate($api_key) {

        if (empty($api_key) || strlen($api_key) !== $this->settings['API_KEY_LENGTH'] ) {
            return new WP_Error(
                'invalid_api_key_format', 
                'تنسيق مفتاح API غير صحيح',
                ['status' => 401]
            );
        }

        $all_keys = get_option($this->option_key, []);

        if (!isset($all_keys[$api_key])) {
            return new WP_Error('api_key_not_found', 'مفتاح API غير معروف', ['status' => 403]);
        }

        $data = $all_keys[$api_key];

        if (!empty($data['expires_at']) && time() > $data['expires_at']) {
            return new WP_Error('api_key_expired', 'مفتاح API منتهي الصلاحية', ['status' => 403]);
        }

        return true;
    }


    
    /**
     * إنشاء مفتاح API جديد
     * 
     * @param string $permissions صلاحيات المفتاح
     * @param int $expiry_hours مدة انتهاء الصلاحية بالساعات
     * @return array|WP_Error
     */
    public function generate_api_key($role = 'administrator') {
        try {
            $api_key = $this->generate_secure_key($this->settings['API_KEY_LENGTH']);

            $key_data = [
                'role'           => $role,
            ];

            $saved = $this->save_api_key($api_key, $key_data);

            if (is_wp_error($saved)) {
                return $saved;
            }

            $expires_at = $this->expires_at();

            $this->log_info('api_key_generated', 'تم إنشاء مفتاح API جديد', [
                'api_key_prefix' => substr($api_key, 0, 8),
                'role'           => $role
            ]);

            return [
                'api_key'       => $api_key,
                'expires_at'    => $expires_at,
                'role'          => $role
            ];

        } catch (Exception $e) {
            $this->log_error('api_key_generation_failed', $e->getMessage());
            return new WP_Error(
                'key_generation_failed',
                'فشل في إنشاء مفتاح API',
                ['status' => 500]
            );
        }
    }

    public function expires_at() {
        $now = time();

        $expires_at =$this->settings['API_KEY_EXPIRY'] > 0 ? $now + $this->settings['API_KEY_EXPIRY'] : null;

        return $expires_at;
    }

    /**
     * حفظ مفتاح API جديد أو تحديثه
     *
     * @param string $api_key
     * @param array $data
     * @return bool
     */
    public function save_api_key($api_key, $data = []) {
        $all_keys   = get_option($this->option_key, []);
        $now        = time();
        $expires_at = $this->expires_at();

        $default_data = [
            'created_at'   => $now,
            'expires_at'   => $expires_at,
            'last_used_at' => null,
            'last_used_ip' => null,
            'role'          => '',
            // 'usage_count'  => 0
        ];

        $all_keys[$api_key] = array_merge($default_data, $data);

        return update_option($this->option_key, $all_keys);
    }
    /**
     * تحديث استخدام المفتاح بعد التحقق
     *
     * @param string $api_key
     * @param string $ip
     * @return void
     */
    public function update_key_usage($api_key, $ip) {
        $all_keys = get_option($this->option_key, []);

        if (!isset($all_keys[$api_key])) return;

        $all_keys[$api_key]['last_used_at'] = time();
        $all_keys[$api_key]['last_used_ip'] = $ip;

        update_option($this->option_key, $all_keys);
    }

    /**
     * تنظيف المفاتيح المنتهية
     *
     * @return int عدد المفاتيح التي تم حذفها
     */
    public function cleanup_expired_keys() {
        $all_keys = get_option($this->option_key, []);
        $now = time();
        $count = 0;

        foreach ($all_keys as $key => $data) {
            if (!empty($data['expires_at']) && $data['expires_at'] < $now) {
                unset($all_keys[$key]);
                $count++;
            }
        }

        if ($count > 0) {
            update_option($this->option_key, $all_keys);
        }

        return $count;
    }

    /**
     * الحصول على عدد مفاتيح API النشطة
     *
     * @return int
     */
    public function get_active_keys_count() {
        $all_keys = get_option($this->option_key, []);
        $now = time();
        $active = 0;

        foreach ($all_keys as $data) {
            if (empty($data['expires_at']) || $data['expires_at'] > $now) {
                $active++;
            }
        }

        return $active;
    }

    /**
     * إلغاء مفتاح API (حذفه من التخزين)
     *
     * @param string $api_key
     * @return bool
     */
    public function revoke_key($api_key) {
        $all_keys = get_option($this->option_key, []);

        if (!isset($all_keys[$api_key])) {
            return false; // المفتاح غير موجود
        }

        unset($all_keys[$api_key]);
        return update_option($this->option_key, $all_keys);
    }


} ?>
