"""Routes d'authentification."""

from flask import Blueprint, request, jsonify
from flask_jwt_extended import jwt_required, get_jwt_identity
from pydantic import ValidationError

from services.auth_service import AuthService
from schemas.user import UserRegisterSchema, UserLoginSchema

bp = Blueprint('auth', __name__)


@bp.route('/register', methods=['POST'])
def register() -> tuple:
    """Inscription d'un nouvel utilisateur.
    
    Body (JSON):
        email: Adresse email.
        username: Nom d'utilisateur.
        password: Mot de passe.
        password_confirm: Confirmation du mot de passe.
    
    Returns:
        Tuple (response, status_code).
    """
    try:
        # Valider les données
        data = UserRegisterSchema(**request.get_json())
        
        # Inscrire l'utilisateur
        user, access_token, refresh_token = AuthService.register_user(data)
        
        return jsonify({
            'message': 'Inscription réussie',
            'user': user.to_dict(),
            'access_token': access_token,
            'refresh_token': refresh_token
        }), 201
        
    except ValidationError as e:
        return jsonify({
            'error': 'validation_error',
            'message': 'Données invalides',
            'details': e.errors()
        }), 400
        
    except ValueError as e:
        return jsonify({
            'error': 'registration_error',
            'message': str(e)
        }), 400
        
    except Exception as e:
        return jsonify({
            'error': 'server_error',
            'message': 'Une erreur est survenue lors de l\'inscription'
        }), 500


@bp.route('/login', methods=['POST'])
def login() -> tuple:
    """Connexion d'un utilisateur.
    
    Body (JSON):
        email: Adresse email.
        password: Mot de passe.
    
    Returns:
        Tuple (response, status_code).
    """
    try:
        # Valider les données
        data = UserLoginSchema(**request.get_json())
        
        # Connecter l'utilisateur
        user, access_token, refresh_token = AuthService.login_user(data)
        
        return jsonify({
            'message': 'Connexion réussie',
            'user': user.to_dict(),
            'access_token': access_token,
            'refresh_token': refresh_token
        }), 200
        
    except ValidationError as e:
        return jsonify({
            'error': 'validation_error',
            'message': 'Données invalides',
            'details': e.errors()
        }), 400
        
    except ValueError as e:
        return jsonify({
            'error': 'login_error',
            'message': str(e)
        }), 401
        
    except Exception as e:
        return jsonify({
            'error': 'server_error',
            'message': 'Une erreur est survenue lors de la connexion'
        }), 500


@bp.route('/me', methods=['GET'])
@jwt_required()
def get_current_user() -> tuple:
    """Récupère les informations de l'utilisateur connecté.
    
    Headers:
        Authorization: Bearer <access_token>
    
    Returns:
        Tuple (response, status_code).
    """
    try:
        # Récupérer l'ID de l'utilisateur depuis le token
        user_id = get_jwt_identity()
        
        # Récupérer l'utilisateur
        user = AuthService.get_user_by_id(user_id)
        
        if not user:
            return jsonify({
                'error': 'user_not_found',
                'message': 'Utilisateur non trouvé'
            }), 404
        
        return jsonify({
            'user': user.to_dict()
        }), 200
        
    except Exception as e:
        return jsonify({
            'error': 'server_error',
            'message': 'Une erreur est survenue'
        }), 500

