from flask_login import current_user
from flask_socketio import join_room
from app import hashids, socketio
from app.decorators import socketio_login_required
from app.models import Corpus


@socketio.on('GET /corpora/<corpus_id>')
@socketio_login_required
def get_corpus(corpus_hashid):
    corpus_id = hashids.decode(corpus_hashid)
    corpus = Corpus.query.get(corpus_id)
    if corpus is None:
        return {'options': {'status': 404, 'statusText': 'Not found'}}
    if not (
        corpus.is_public
        or corpus.user == current_user
        or current_user.is_administrator()
    ):
        return {'options': {'status': 403, 'statusText': 'Forbidden'}}
    return {
        'body': corpus.to_json_serializable(),
        'options': {
            'status': 200,
            'statusText': 'OK',
            'headers': {'Content-Type: application/json'}
        }
    }


@socketio.on('SUBSCRIBE /corpora/<corpus_id>')
@socketio_login_required
def subscribe_corpus(corpus_hashid):
    corpus_id = hashids.decode(corpus_hashid)
    corpus = Corpus.query.get(corpus_id)
    if corpus is None:
        return {'options': {'status': 404, 'statusText': 'Not found'}}
    if not (
        corpus.is_public
        or corpus.user == current_user
        or current_user.is_administrator()
    ):
        return {'options': {'status': 403, 'statusText': 'Forbidden'}}
    join_room(f'/corpora/{corpus.hashid}')
    return {'options': {'status': 200, 'statusText': 'OK'}}