from flask import Blueprint, request, jsonify, current_app
from app.database.fetch_data import get_mongo_client
import bcrypt
import jwt
import datetime
import os
import uuid

auth_bp = Blueprint('auth', __name__, url_prefix='/api/auth')

SECRET_KEY = os.getenv('JWT_SECRET_KEY', 'supersecretkey')

def generate_token(user):
    payload = {
        'email': user['email'],
        'username': user['username'],
        'exp': datetime.datetime.utcnow() + datetime.timedelta(days=7)
    }
    return jwt.encode(payload, SECRET_KEY, algorithm='HS256')

@auth_bp.route('/register', methods=['POST'])
def register():
    data = request.get_json()
    username = data.get('name') or data.get('username')
    email = data.get('email')
    password = data.get('password')
    if not all([username, email, password]):
        return jsonify({'error': 'Missing fields'}), 400
    client = get_mongo_client()
    db = client['character_test']
    users_collection = db['clients']
    if users_collection.find_one({'email': email}):
        return jsonify({'error': 'Email already registered'}), 400
    hashed_pw = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt())
    now = datetime.datetime.utcnow()
    client_id = f"CLIENT_{str(uuid.uuid4())[:12]}"
    users_collection.insert_one({
        'client_id': client_id,
        'username': username,
        'email': email,
        'password': hashed_pw,  # store as binary
        'characters': [],
        'created_at': now,
        'last_login': now
    })
    token = generate_token({'username': username, 'email': email})
    return jsonify({'message': 'User registered successfully', 'token': token, 'user': {'client_id': client_id, 'username': username, 'email': email}})

@auth_bp.route('/login', methods=['POST'])
def login():
    data = request.get_json()
    email = data.get('email')
    password = data.get('password')
    if not all([email, password]):
        return jsonify({'error': 'Missing fields'}), 400
    client = get_mongo_client()
    db = client['character_test']
    users_collection = db['clients']
    user = users_collection.find_one({'email': email})
    if not user or not bcrypt.checkpw(password.encode('utf-8'), user['password']):
        return jsonify({'error': 'Invalid email or password'}), 401
    # Update last_login
    users_collection.update_one({'email': email}, {'$set': {'last_login': datetime.datetime.utcnow()}})
    token = generate_token(user)
    return jsonify({'message': 'User logged in successfully', 'token': token, 'user': {'client_id': user.get('client_id'), 'username': user['username'], 'email': user['email']}})

@auth_bp.route('/me', methods=['GET'])
def me():
    auth_header = request.headers.get('Authorization')
    if not auth_header or not auth_header.startswith('Bearer '):
        return jsonify({'error': 'Missing or invalid token'}), 401
    token = auth_header.split(' ')[1]
    try:
        payload = jwt.decode(token, SECRET_KEY, algorithms=['HS256'])
        return jsonify({'user': {'username': payload['username'], 'email': payload['email']}})
    except jwt.ExpiredSignatureError:
        return jsonify({'error': 'Token expired'}), 401
    except jwt.InvalidTokenError:
        return jsonify({'error': 'Invalid token'}), 401 