import jwt
import datetime
from functools import wraps
from flask import request, jsonify

SECRET_KEY = 'your-jwt-secret-key-change-in-production'  # 务必修改为强密钥
TOKEN_EXPIRE_HOURS = 24 * 7  # 7天有效期

def generate_token(user_id: int, username: str) -> str:
    payload = {
        'user_id': user_id,
        'username': username,
        'exp': datetime.datetime.utcnow() + datetime.timedelta(hours=TOKEN_EXPIRE_HOURS),
        'iat': datetime.datetime.utcnow()
    }
    return jwt.encode(payload, SECRET_KEY, algorithm='HS256')

def verify_token(token: str) -> dict:
    try:
        payload = jwt.decode(token, SECRET_KEY, algorithms=['HS256'])
        return payload
    except jwt.ExpiredSignatureError:
        return None
    except jwt.InvalidTokenError:
        return None

def get_current_user_from_jwt():
    """从请求的 Authorization 头获取用户信息"""
    auth_header = request.headers.get('Authorization')
    if not auth_header:
        return None, None, None
    parts = auth_header.split()
    if len(parts) != 2 or parts[0].lower() != 'bearer':
        return None, None, None
    token = parts[1]
    payload = verify_token(token)
    if not payload:
        return None, None, None
    return payload['user_id'], payload['username'], None  # 第三个值 character_name 可以从数据库查询