from flask import Blueprint, request, jsonify, session
from src.models.user import db, User
from src.models.company import Company
from src.routes.auth import require_auth, require_role

user_bp = Blueprint('user', __name__)

@user_bp.route('/users', methods=['GET'])
@require_auth
def get_users():
    """Obtener lista de usuarios según el rol del usuario actual"""
    try:
        user_role = session.get('user_role')
        user_company_id = session.get('company_id')
        
        page = request.args.get('page', 1, type=int)
        per_page = request.args.get('per_page', 10, type=int)
        search = request.args.get('search', '')
        
        query = User.query
        
        # Filtrar según el rol
        if user_role == 'super_admin':
            # Super admin puede ver todos los usuarios
            pass
        elif user_role == 'accountant':
            # Accountant solo puede ver usuarios de su empresa
            query = query.filter_by(company_id=user_company_id)
        else:
            # Employee no puede ver otros usuarios
            return jsonify({'error': 'No autorizado'}), 403
        
        # Filtrar por búsqueda si se proporciona
        if search:
            query = query.filter(
                (User.username.contains(search)) | 
                (User.email.contains(search)) |
                (User.first_name.contains(search)) |
                (User.last_name.contains(search))
            )
        
        # Paginación
        users = query.paginate(
            page=page, 
            per_page=per_page, 
            error_out=False
        )
        
        return jsonify({
            'users': [user.to_dict() for user in users.items],
            'total': users.total,
            'pages': users.pages,
            'current_page': page,
            'per_page': per_page
        }), 200
        
    except Exception as e:
        return jsonify({'error': f'Error interno del servidor: {str(e)}'}), 500

@user_bp.route('/users/<int:user_id>', methods=['GET'])
@require_auth
def get_user(user_id):
    """Obtener información de un usuario específico"""
    try:
        current_user_id = session.get('user_id')
        user_role = session.get('user_role')
        user_company_id = session.get('company_id')
        
        user = User.query.get(user_id)
        if not user:
            return jsonify({'error': 'Usuario no encontrado'}), 404
        
        # Verificar permisos
        if user_role == 'super_admin':
            # Super admin puede ver cualquier usuario
            pass
        elif user_role == 'accountant':
            # Accountant puede ver usuarios de su empresa
            if user.company_id != user_company_id:
                return jsonify({'error': 'No autorizado'}), 403
        else:
            # Employee solo puede ver su propio perfil
            if user_id != current_user_id:
                return jsonify({'error': 'No autorizado'}), 403
        
        return jsonify({'user': user.to_dict()}), 200
        
    except Exception as e:
        return jsonify({'error': f'Error interno del servidor: {str(e)}'}), 500

@user_bp.route('/users/<int:user_id>', methods=['PUT'])
@require_auth
def update_user(user_id):
    """Actualizar información de un usuario"""
    try:
        current_user_id = session.get('user_id')
        user_role = session.get('user_role')
        user_company_id = session.get('company_id')
        
        user = User.query.get(user_id)
        if not user:
            return jsonify({'error': 'Usuario no encontrado'}), 404
        
        # Verificar permisos
        can_edit = False
        if user_role == 'super_admin':
            can_edit = True
        elif user_role == 'accountant' and user.company_id == user_company_id:
            can_edit = True
        elif user_id == current_user_id:
            can_edit = True
        
        if not can_edit:
            return jsonify({'error': 'No autorizado'}), 403
        
        data = request.get_json()
        
        # Campos que cualquier usuario puede actualizar de su propio perfil
        if data.get('first_name'):
            user.first_name = data.get('first_name')
        if data.get('last_name'):
            user.last_name = data.get('last_name')
        if data.get('phone'):
            user.phone = data.get('phone')
        
        # Campos que solo admin/accountant pueden actualizar
        if user_role in ['super_admin', 'accountant'] and user_id != current_user_id:
            if data.get('email'):
                # Verificar que el email no exista
                existing_user = User.query.filter(
                    User.email == data.get('email'),
                    User.id != user_id
                ).first()
                if existing_user:
                    return jsonify({'error': 'Email ya existe'}), 409
                user.email = data.get('email')
            
            if data.get('is_active') is not None:
                user.is_active = data.get('is_active')
        
        # Campos que solo super_admin puede actualizar
        if user_role == 'super_admin':
            if data.get('role'):
                valid_roles = ['super_admin', 'accountant', 'employee']
                if data.get('role') in valid_roles:
                    user.role = data.get('role')
            
            if data.get('company_id'):
                # Verificar que la empresa exista
                company = Company.query.get(data.get('company_id'))
                if company:
                    user.company_id = data.get('company_id')
        
        # Cambio de contraseña (solo el propio usuario)
        if user_id == current_user_id and data.get('new_password'):
            if not data.get('current_password'):
                return jsonify({'error': 'Contraseña actual requerida'}), 400
            
            if not user.check_password(data.get('current_password')):
                return jsonify({'error': 'Contraseña actual incorrecta'}), 400
            
            user.set_password(data.get('new_password'))
        
        db.session.commit()
        
        return jsonify({
            'message': 'Usuario actualizado exitosamente',
            'user': user.to_dict()
        }), 200
        
    except Exception as e:
        db.session.rollback()
        return jsonify({'error': f'Error interno del servidor: {str(e)}'}), 500

@user_bp.route('/users/<int:user_id>', methods=['DELETE'])
@require_auth
def delete_user(user_id):
    """Eliminar un usuario"""
    try:
        current_user_id = session.get('user_id')
        user_role = session.get('user_role')
        user_company_id = session.get('company_id')
        
        # No se puede eliminar a sí mismo
        if user_id == current_user_id:
            return jsonify({'error': 'No puedes eliminar tu propio usuario'}), 400
        
        user = User.query.get(user_id)
        if not user:
            return jsonify({'error': 'Usuario no encontrado'}), 404
        
        # Verificar permisos
        can_delete = False
        if user_role == 'super_admin':
            can_delete = True
        elif user_role == 'accountant' and user.company_id == user_company_id and user.role == 'employee':
            can_delete = True
        
        if not can_delete:
            return jsonify({'error': 'No autorizado'}), 403
        
        # Verificar que no tenga facturas asociadas
        if user.created_invoices or user.approved_invoices:
            return jsonify({'error': 'No se puede eliminar usuario con facturas asociadas'}), 400
        
        db.session.delete(user)
        db.session.commit()
        
        return jsonify({'message': 'Usuario eliminado exitosamente'}), 200
        
    except Exception as e:
        db.session.rollback()
        return jsonify({'error': f'Error interno del servidor: {str(e)}'}), 500

@user_bp.route('/users/<int:user_id>/toggle-status', methods=['POST'])
@require_auth
def toggle_user_status(user_id):
    """Activar/desactivar un usuario"""
    try:
        current_user_id = session.get('user_id')
        user_role = session.get('user_role')
        user_company_id = session.get('company_id')
        
        # No se puede desactivar a sí mismo
        if user_id == current_user_id:
            return jsonify({'error': 'No puedes cambiar el estado de tu propio usuario'}), 400
        
        user = User.query.get(user_id)
        if not user:
            return jsonify({'error': 'Usuario no encontrado'}), 404
        
        # Verificar permisos
        can_toggle = False
        if user_role == 'super_admin':
            can_toggle = True
        elif user_role == 'accountant' and user.company_id == user_company_id:
            can_toggle = True
        
        if not can_toggle:
            return jsonify({'error': 'No autorizado'}), 403
        
        user.is_active = not user.is_active
        db.session.commit()
        
        status = 'activado' if user.is_active else 'desactivado'
        
        return jsonify({
            'message': f'Usuario {status} exitosamente',
            'user': user.to_dict()
        }), 200
        
    except Exception as e:
        db.session.rollback()
        return jsonify({'error': f'Error interno del servidor: {str(e)}'}), 500

