from flask import Blueprint, request, jsonify
import jwt
import datetime
from functools import wraps
from ..models.staff_model import Staff
from ..models.auth_model import AuthModel
from ..services.config import Config

auth_bp = Blueprint('auth_bp', __name__)

@auth_bp.route('/register', methods=['POST'])
def register():
    """Register a new user."""
    data = request.get_json()
    username = data.get('username')
    password = data.get('password')

    if not username or not password:
        return jsonify({"message": "Username and password are required"}), 400

    try:
        AuthModel.register_user(username, password)
        return jsonify({"message": "User registered successfully"}), 201
    except Exception as e:
        print(f"Error registering user: {e}")
        return jsonify({"message": "Error registering user"}), 500

@auth_bp.route('/login', methods=['POST'])
def login():
    data = request.get_json()
    username = data.get('username')
    password = data.get('password')

    if not username or not password:
        return jsonify({"message": "Username and password are required"}), 400

    if AuthModel.validate_credentials(username, password):
        token = jwt.encode({
            'user': username,
            'exp': datetime.datetime.utcnow() + datetime.timedelta(hours=24)
        }, Config.JWT_SECRET_KEY, algorithm="HS256")
        return jsonify({'token': token})

    return jsonify({"message": "Invalid credentials"}), 401

def token_required(f):
    @wraps(f)
    def decorated(*args, **kwargs):
        token = None
        if 'x-access-token' in request.headers:
            token = request.headers['x-access-token']

        if not token:
            return jsonify({'message': 'Token is missing!'}), 401

        try:
            data = jwt.decode(token, Config.JWT_SECRET_KEY, algorithms=["HS256"])
            current_user = data['user']
        except:
            return jsonify({'message': 'Token is invalid!'}), 401

        return f(current_user, *args, **kwargs)

    return decorated

@auth_bp.route('/generate/<pid>', methods=['GET'])
def generate_tokens(pid):
    print(f"DEBUG: Received request to generate token for pid: {pid}")
    try:
        user = Staff.get_by_pid(pid)
        
        if not user:
            return jsonify({"message": "User not found"}), 404

        role = AuthModel.get_user_role(pid)
        
        # Prepare the payload for the JWT
        payload = {
            'user': user['pid'],
            'first_name': user['first_name'],
            'last_name': user['last_name'],
            'company_email': user['company_email'],
            'profile_photo_path': user['profile_photo_path'],
            'position': user['position'],
            'role': role, # Add the role to the token
            'exp': datetime.datetime.utcnow() + datetime.timedelta(hours=24)
        }
        
        # Generate the token
        token = jwt.encode(payload, Config.JWT_SECRET_KEY, algorithm="HS256")
        
        return jsonify({'token': token})
        
    except Exception as e:
        print(f"Error generating token: {e}")
        return jsonify({"message": "An error occurred while generating the token"}), 500