"""敏感字段对称加密：用于云服务器登录密码等需要还原原文的场景。

AES-256-GCM。密钥派生自 JWT_SECRET_KEY 的 SHA-256，存储格式为
`base64(nonce(12) + ciphertext + tag(16))`，单条记录一个独立 nonce。
"""
import base64
import hashlib
import os

from cryptography.hazmat.primitives.ciphers.aead import AESGCM

from app.config import settings

_NONCE_LEN = 12


def _key() -> bytes:
    return hashlib.sha256(settings.JWT_SECRET_KEY.encode("utf-8")).digest()


def encrypt_secret(plaintext: str) -> str:
    aes = AESGCM(_key())
    nonce = os.urandom(_NONCE_LEN)
    ct = aes.encrypt(nonce, plaintext.encode("utf-8"), None)
    return base64.b64encode(nonce + ct).decode("ascii")


def decrypt_secret(token: str) -> str:
    raw = base64.b64decode(token.encode("ascii"))
    nonce, ct = raw[:_NONCE_LEN], raw[_NONCE_LEN:]
    return AESGCM(_key()).decrypt(nonce, ct, None).decode("utf-8")
