from flask_login import current_user
from flask_socketio import disconnect, Namespace
from app import db, hashids
from app.decorators import socketio_admin_required
from app.models import User


class AdminNamespace(Namespace):
    def on_connect(self):
        # Check if the user is authenticated and is an administrator
        if not (current_user.is_authenticated and current_user.is_administrator):
            disconnect()


    @socketio_admin_required
    def on_set_user_confirmed(self, user_hashid: str, confirmed_value: bool):
        # Decode the user hashid
        user_id = hashids.decode(user_hashid)

        # Validate user_id
        if not isinstance(user_id, int):
            return {
                'code': 400,
                'body': 'user_id is invalid'
            }

        # Validate confirmed_value
        if not isinstance(confirmed_value, bool):
            return {
                'code': 400,
                'body': 'confirmed_value is invalid'
            }

        # Load user from database
        user = User.query.get(user_id)
        if user is None:
            return {
                'code': 404,
                'body': 'User not found'
            }

        # Update user confirmed status
        user.confirmed = confirmed_value
        db.session.commit()

        return {
            'code': 200,
            'body': f'User "{user.username}" is now {"confirmed" if confirmed_value else "unconfirmed"}'
        }