from argon2 import PasswordHasher
from argon2.exceptions import InvalidHashError, VerificationError

from flyway.domain.errors import BusinessError

MIN_LENGTH = 7  # 旧 Membership.config minRequiredPasswordLength
_hasher = PasswordHasher()


def hash_password(password: str) -> str:
    if len(password or "") < MIN_LENGTH:
        raise BusinessError(f"The password must be at least {MIN_LENGTH} characters.", "password")
    return _hasher.hash(password)


def verify_password(password_hash: str | None, password: str) -> bool:
    if not password_hash:
        return False
    try:
        return _hasher.verify(password_hash, password or "")
    except (VerificationError, InvalidHashError):
        return False
