from __future__ import annotations

import binascii
import hashlib
import json
import time
from typing import Tuple

from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes


class XPFFHeaderGenerator:
    """X-Xp-Forwarded-For başlığı için şifrelenmiş jeton üretir."""

    __slots__ = ("base_key",)

    def __init__(
        self,
        base_key: str = "0e6be1f1e21ffc33590b888fd4dc81b19713e570e805d4e5df80a493c9571a05",
    ) -> None:
        self.base_key = base_key

    def _derive_key(self, guest_id: str) -> bytes:
        payload = f"{self.base_key}{guest_id}".encode()
        return hashlib.sha256(payload).digest()

    def _aes_gcm_encrypt(self, payload: str, guest_id: str) -> str:
        key = self._derive_key(guest_id)
        nonce = get_random_bytes(12)
        cipher = AES.new(key, AES.MODE_GCM, nonce=nonce)
        ciphertext, tag = cipher.encrypt_and_digest(payload.encode())
        return binascii.hexlify(nonce + ciphertext + tag).decode()

    def generate(self, user_agent: str, guest_id: str) -> Tuple[str, int]:
        payload_obj = {
            "navigator_properties": {
                "hasBeenActive": "false",
                "userAgent": user_agent,
                "webdriver": "false",
            },
            "created_at": int(time.time() * 1000),
        }
        payload = json.dumps(payload_obj, separators=(",", ":"))
        token_hex = self._aes_gcm_encrypt(payload, guest_id)
        return token_hex, payload_obj["created_at"]


xpff_header_generator = XPFFHeaderGenerator()

__all__ = ["XPFFHeaderGenerator", "xpff_header_generator"]
