"""Routes pour la gestion des utilisateurs."""

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 UserUpdateSchema

bp = Blueprint('users', __name__)


@bp.route('/me', methods=['GET'])
@jwt_required()
def get_profile() -> tuple:
    """Récupère le profil de l'utilisateur connecté.
    
    Headers:
        Authorization: Bearer <access_token>
    
    Returns:
        Tuple (response, status_code).
    """
    try:
        user_id = get_jwt_identity()
        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


@bp.route('/me', methods=['PATCH'])
@jwt_required()
def update_profile() -> tuple:
    """Met à jour le profil de l'utilisateur connecté.
    
    Headers:
        Authorization: Bearer <access_token>
    
    Body (JSON):
        username: Nouveau nom d'utilisateur (optionnel).
        email: Nouvelle adresse email (optionnel).
    
    Returns:
        Tuple (response, status_code).
    """
    try:
        user_id = get_jwt_identity()
        user = AuthService.get_user_by_id(user_id)
        
        if not user:
            return jsonify({
                'error': 'user_not_found',
                'message': 'Utilisateur non trouvé'
            }), 404
        
        # Valider les données
        data = UserUpdateSchema(**request.get_json())
        
        # Mettre à jour
        update_dict = data.model_dump(exclude_none=True)
        if update_dict:
            user = AuthService.update_user(user, **update_dict)
        
        return jsonify({
            'message': 'Profil mis à jour',
            'user': user.to_dict()
        }), 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': 'update_error',
            'message': str(e)
        }), 400
        
    except Exception as e:
        return jsonify({
            'error': 'server_error',
            'message': 'Une erreur est survenue'
        }), 500


@bp.route('/<user_id>', methods=['GET'])
def get_user_by_id(user_id: str) -> tuple:
    """Récupère le profil public d'un utilisateur.
    
    Args:
        user_id: ID de l'utilisateur.
    
    Returns:
        Tuple (response, status_code).
    """
    try:
        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

