"""cards.py - Card-key system: register, renew, login with session."""
import hashlib, time, secrets, re
from datetime import datetime, timedelta
from quart import session, jsonify
from store import get_user, add_user, update_user, get_card, use_card, get_users, save_users

SECRET_KEY = "mailpanel_secret_change_me_2026"

def hash_password(password):
    import hashlib
    return hashlib.sha256(password.encode()).hexdigest()

def verify_password(password, password_hash):
    return hash_password(password) == password_hash

def gen_expires_at(days):
    return (datetime.utcnow() + timedelta(days=days)).strftime("%Y-%m-%d %H:%M:%S")

def countdown_from_expires(expires_at_str):
    try:
        exp = datetime.strptime(expires_at_str, "%Y-%m-%d %H:%M:%S")
    except:
        return "已到期"
    now = datetime.utcnow()
    delta = exp - now
    if delta.total_seconds() <= 0:
        return "已到期"
    days = delta.days
    hours, rem = divmod(delta.seconds, 3600)
    minutes, seconds = divmod(rem, 60)
    return f"剩余：{days}天{hours}时{minutes}分{seconds}秒"

def is_expired(expires_at_str):
    try:
        exp = datetime.strptime(expires_at_str, "%Y-%m-%d %H:%M:%S")
    except:
        return True
    return datetime.utcnow() >= exp

def register_user(card_code, username, password, confirm_password):
    # validate
    if not card_code or not username or not password:
        return {"ok": False, "message": "请填写完整信息"}
    if password != confirm_password:
        return {"ok": False, "message": "两次密码不一致"}
    if not re.match(r'^[a-zA-Z0-9_]{3,32}$', username):
        return {"ok": False, "message": "用户名需3-32位字母、数字、下划线"}
    if len(password) < 6:
        return {"ok": False, "message": "密码至少6位"}
    card = get_card(card_code)
    if not card:
        return {"ok": False, "message": "卡密不存在"}
    if card["used"]:
        return {"ok": False, "message": "卡密已使用"}
    if username in get_users():
        return {"ok": False, "message": "用户名已存在"}
    expires_at = gen_expires_at(card["days"])
    add_user(username, hash_password(password), expires_at, card_code)
    use_card(card_code, username)
    session["username"] = username
    session["expires_at"] = expires_at
    return {
        "ok": True,
        "message": "注册成功",
        "username": username,
        "expires_at": expires_at,
        "countdown": countdown_from_expires(expires_at),
    }

def renew_user(username, password, card_code):
    user = get_user(username)
    if not user:
        return {"ok": False, "message": "用户不存在"}
    if not verify_password(password, user["password_hash"]):
        return {"ok": False, "message": "密码不正确"}
    card = get_card(card_code)
    if not card:
        return {"ok": False, "message": "卡密不存在"}
    if card["used"]:
        return {"ok": False, "message": "卡密已使用"}
    # extend expiry (add days to current expires_at or now, whichever is later)
    try:
        current_exp = datetime.strptime(user["expires_at"], "%Y-%m-%d %H:%M:%S")
    except:
        current_exp = datetime.utcnow()
    base = max(current_exp, datetime.utcnow())
    new_expires_at = (base + timedelta(days=card["days"])).strftime("%Y-%m-%d %H:%M:%S")
    update_user(username, expires_at=new_expires_at)
    use_card(card_code, username)
    session["expires_at"] = new_expires_at
    return {
        "ok": True,
        "message": "续费成功",
        "username": username,
        "expires_at": new_expires_at,
        "countdown": countdown_from_expires(new_expires_at),
    }

def login_user(username, password):
    user = get_user(username)
    if not user:
        return {"ok": False, "message": "用户名或密码错误"}
    if not verify_password(password, user["password_hash"]):
        return {"ok": False, "message": "用户名或密码错误"}
    if is_expired(user["expires_at"]):
        return {"ok": False, "reason": "card_expired", "message": "账号已到期，请续费"}
    # kick other sessions (set session.revoked via app)
    session["username"] = username
    session["expires_at"] = user["expires_at"]
    return {
        "ok": True,
        "message": "登录成功",
        "username": username,
        "expires_at": user["expires_at"],
        "countdown": countdown_from_expires(user["expires_at"]),
    }

def logout_user():
    session.clear()
    return {"ok": True}

def current_user():
    username = session.get("username")
    if not username:
        return None
    user = get_user(username)
    if not user:
        return None
    if is_expired(user.get("expires_at", "")):
        return None
    return user