"""注册 / 登录 —— 通过数据库侧 pgcrypto 完成 bcrypt 哈希

运行：python code/auth.py
"""
from __future__ import annotations

from db import fetch_one, close_pool


def signup(tenant_id: int, username: str, email: str, password: str) -> int:
    """注册新用户，返回 user_id。"""
    row = fetch_one(
        "SELECT api_signup(%s, %s, %s, %s) AS id",
        (tenant_id, username, email, password),
    )
    return row["id"]


def login(tenant_id: int, username: str, password: str) -> int | None:
    """登录成功返回 user_id，失败返回 None。"""
    row = fetch_one(
        "SELECT api_login(%s, %s, %s) AS id",
        (tenant_id, username, password),
    )
    return row["id"] if row and row["id"] else None


def check_password_hash_format(user_id: int) -> str:
    """演示：查看密码哈希是不是 bcrypt 格式（$2a$...）。"""
    row = fetch_one("SELECT password FROM users WHERE id = %s", (user_id,))
    return row["password"] if row else ""


def _demo() -> None:
    print("=== 注册登录演示 ===")

    try:
        uid = signup(1, "demo_user", "demo@x.com", "P@ssw0rd!")
        print(f"[OK] 新注册用户 id={uid}")
    except Exception as e:
        print(f"[INFO] 用户已存在，跳过注册：{e}")
        uid = fetch_one("SELECT id FROM users WHERE username = 'demo_user'")["id"]

    print("密码哈希：", check_password_hash_format(uid))

    ok = login(1, "demo_user", "P@ssw0rd!")
    print("正确密码登录：", "成功 uid=" + str(ok) if ok else "失败")

    fail = login(1, "demo_user", "wrong")
    print("错误密码登录：", "成功" if fail else "失败（预期）")


if __name__ == "__main__":
    try:
        _demo()
    finally:
        close_pool()
