import base64
from cryptography.fernet import Fernet
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC
from app.core.config import get_settings


def _get_fernet_key() -> Fernet:
    """Получить Fernet ключ для шифрования"""
    settings = get_settings()
    
    # Преобразуем строку в байты
    password = settings.ENCRYPTION_KEY.encode()
    salt = b'telegram_bot_salt'  # Фиксированная соль для стабильности
    
    # Генерируем ключ из пароля
    kdf = PBKDF2HMAC(
        algorithm=hashes.SHA256(),
        length=32,
        salt=salt,
        iterations=100000,
    )
    key = base64.urlsafe_b64encode(kdf.derive(password))
    return Fernet(key)


def encrypt_token(token: str) -> str:
    """Зашифровать токен бота"""
    if not token:
        return ""
    
    fernet = _get_fernet_key()
    encrypted = fernet.encrypt(token.encode())
    return base64.urlsafe_b64encode(encrypted).decode()


def decrypt_token(encrypted_token: str) -> str:
    """Расшифровать токен бота"""
    if not encrypted_token:
        return ""
    
    try:
        fernet = _get_fernet_key()
        encrypted_bytes = base64.urlsafe_b64decode(encrypted_token.encode())
        decrypted = fernet.decrypt(encrypted_bytes)
        return decrypted.decode()
    except Exception:
        # Если не удается расшифровать, возвращаем пустую строку
        return ""


def generate_webhook_secret() -> str:
    """Генерировать секрет для webhook"""
    import secrets
    return secrets.token_urlsafe(32)
