<?php

namespace App\Core;

/**
 * CSRF Protection - حماية من هجمات Cross-Site Request Forgery
 */
class CSRFProtection
{
    private const TOKEN_NAME = '_csrf_token';
    private const TOKEN_LIFETIME = 3600; // ساعة واحدة

    /**
     * إنشاء أو جلب CSRF token
     */
    public static function getToken(): string
    {
        if (session_status() === PHP_SESSION_NONE) {
            session_start();
        }

        if (!isset($_SESSION[self::TOKEN_NAME])) {
            $_SESSION[self::TOKEN_NAME] = [
                'token' => bin2hex(random_bytes(32)),
                'created_at' => time()
            ];
        } else {
            // تجديد token إذا انتهت صلاحيته
            $tokenData = $_SESSION[self::TOKEN_NAME];
            if (time() - $tokenData['created_at'] > self::TOKEN_LIFETIME) {
                $_SESSION[self::TOKEN_NAME] = [
                    'token' => bin2hex(random_bytes(32)),
                    'created_at' => time()
                ];
            }
        }

        return $_SESSION[self::TOKEN_NAME]['token'];
    }

    /**
     * التحقق من صحة CSRF token
     */
    public static function validateToken(?string $token = null): bool
    {
        if (session_status() === PHP_SESSION_NONE) {
            session_start();
        }

        if ($token === null) {
            $token = $_POST[self::TOKEN_NAME] ?? $_GET[self::TOKEN_NAME] ?? null;
        }

        if ($token === null || !isset($_SESSION[self::TOKEN_NAME])) {
            return false;
        }

        $sessionToken = $_SESSION[self::TOKEN_NAME]['token'] ?? null;
        if ($sessionToken === null) {
            return false;
        }

        // التحقق من انتهاء الصلاحية
        $tokenData = $_SESSION[self::TOKEN_NAME];
        if (time() - $tokenData['created_at'] > self::TOKEN_LIFETIME) {
            unset($_SESSION[self::TOKEN_NAME]);
            return false;
        }

        return hash_equals($sessionToken, $token);
    }

    /**
     * إنشاء hidden input field للـ token
     */
    public static function getTokenField(): string
    {
        $token = self::getToken();
        return '<input type="hidden" name="' . htmlspecialchars(self::TOKEN_NAME, ENT_QUOTES, 'UTF-8') . '" value="' . htmlspecialchars($token, ENT_QUOTES, 'UTF-8') . '">';
    }

    /**
     * جلب token كقيمة فقط (للاستخدام في AJAX)
     */
    public static function getTokenValue(): string
    {
        return self::getToken();
    }

    /**
     * التحقق من token في POST request
     */
    public static function validatePostRequest(): bool
    {
        if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
            return true; // GET requests لا تحتاج CSRF protection
        }

        return self::validateToken();
    }

    /**
     * إعادة إنشاء token (بعد login أو عمليات حساسة)
     */
    public static function regenerateToken(): void
    {
        if (session_status() === PHP_SESSION_NONE) {
            session_start();
        }

        $_SESSION[self::TOKEN_NAME] = [
            'token' => bin2hex(random_bytes(32)),
            'created_at' => time()
        ];
    }
}
