<?php
class SecureIdHandler {
    private static $encryption_key;
    private static $hmac_key;
    // اختر 16 للحصول على ~60 حرف، أو 12 للحصول على ~55 حرف
    private const HMAC_LEN = 16; // <= 32 (الثابت الأصلي)

    public static function init() {
        self::$encryption_key = getenv('ENCRYPTION_KEY') ?: 'Balady_Enc_Key_2025_Strong_32Bytes!';
        self::$hmac_key = getenv('HMAC_KEY') ?: 'Balady_HMAC_Key_2025_Secure_32B!';

        // ضمان طول 32 بايت
        self::$encryption_key = substr(hash('sha256', self::$encryption_key, true), 0, 32);
        self::$hmac_key = substr(hash('sha256', self::$hmac_key, true), 0, 32);
    }

    public static function encryptId($id) {
        if (!self::$encryption_key) self::init();
        $id = (string)$id;

        // IV ثابت مشتق من الـ ID نفسه (ننحتفظ بنفس سلوكك الأصلي)
        $iv = substr(hash('sha256', $id, true), 0, 16);

        $encrypted = openssl_encrypt($id, 'aes-256-cbc', self::$encryption_key, OPENSSL_RAW_DATA, $iv);
        if ($encrypted === false) return false;

        // HMAC كامل ثم نقتطع أول HMAC_LEN بايت
        $fullHmac = hash_hmac('sha256', $iv . $encrypted, self::$hmac_key, true);
        $truncHmac = substr($fullHmac, 0, self::HMAC_LEN);

        $combined = $iv . $encrypted . $truncHmac;
        return rtrim(strtr(base64_encode($combined), '+/', '-_'), '=');
    }

    public static function decryptId($encryptedId) {
        if (!self::$encryption_key) self::init();

        $base64 = strtr($encryptedId, '-_', '+/');
        $base64 = str_pad($base64, strlen($base64) + (4 - strlen($base64) % 4) % 4, '=', STR_PAD_RIGHT);
        $combined = base64_decode($base64);

        // طول الحد الأدنى يجب أن يكون: iv(16) + hmac_trunc(HMAC_LEN)
        if ($combined === false || strlen($combined) < 16 + self::HMAC_LEN) return false;

        $iv = substr($combined, 0, 16);
        $hmac = substr($combined, -self::HMAC_LEN);
        $encrypted = substr($combined, 16, -self::HMAC_LEN);

        $calcFullHmac = hash_hmac('sha256', $iv . $encrypted, self::$hmac_key, true);
        $calcTruncHmac = substr($calcFullHmac, 0, self::HMAC_LEN);

        // التحقق باستخدام hash_equals على النسختين المقتطعتين
        if (!hash_equals($hmac, $calcTruncHmac)) return false;

        $decrypted = openssl_decrypt($encrypted, 'aes-256-cbc', self::$encryption_key, OPENSSL_RAW_DATA, $iv);
        return $decrypted === false ? false : (string)$decrypted;
    }
}
?>