# app/security/passwords.py

from argon2 import PasswordHasher, exceptions as argon_exc
from werkzeug.security import check_password_hash    # для старых хешей PBKDF2-SHA1

# Настройки Argon2 (time_cost, memory_cost и т.д. можно корректировать по нагрузке)
ph = PasswordHasher(
    time_cost=2,        # число итераций
    memory_cost=102400, # в килобайтах (100 MiB)
    parallelism=8,      # число параллельных потоков
    hash_len=32,        # длина хеша
    salt_len=16         # длина соли
)

def hash_password(raw: str) -> str:
    """
    Генерирует Argon2id-хеш для строки raw.
    Возвращает строку вида "$argon2id$v=19$m=102400,t=2,p=8$..."
    """
    return ph.hash(raw)

def verify_password(stored_hash: str, raw: str) -> bool:
    """
    Проверяет, соответствует ли сырая строка raw сохранённому хешу stored_hash.
    ▪ Если stored_hash — Argon2 (начинается с "$argon2id$"), проверяем через ph.verify().
    ▪ Иначе (старый формат PBKDF2-SHA1 из werkzeug) — делаем fallback на check_password_hash().
    """
    if stored_hash.startswith("$argon2id$"):
        try:
            return ph.verify(stored_hash, raw)
        except argon_exc.VerifyMismatchError:
            return False
    # fallback для старых хешей из werkzeug (PBKDF2-SHA1)
    return check_password_hash(stored_hash, raw)

def needs_rehash(stored_hash: str) -> bool:
    """
    Возвращает True, если хеш не в формате Argon2 (т.е. старый PBKDF2),
    чтобы при следующем входе обновить хеш.
    """
    return not stored_hash.startswith("$argon2id$")
