from threading import Thread
from functools import wraps
from flask import session, request
from app import webapp

def async(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        thr = Thread(target=func, args=args, kwargs=kwargs)
        thr.start()
    return wrapper

def user_session(func):
    @wraps(func)
    def wrapper(**kwargs):
        from app.models import Utils
        if Utils.getParam(request.args, 'session', default=None):
            user_data = session.get('_user', None)
            if user_data and user_data['is_admin']:
                session.clear()

        user_data = session.get('_user', None)
        kwargs['props'] = {'user': user_data,
                            'cdn': webapp.config['S3_HOST']+'website/',
                            'host': webapp.config['HOST']+'/' 
                          }
        return func(**kwargs)
    return wrapper

def is_user(func):
    @wraps(func)
    def wrapper(**kwargs):
        from app.models import Utils
        #TODO move it to check app version or some other reliable source
        user_data = session.get('_user', None)
        if (Utils.getParam(request.form, 'ref') == 'web' and
                (user_data is None or
                    (user_data and user_data['user_id'] != Utils.getParam(request.form, 'user_id', 'int')))):
                        return Utils.errorResponse({'status': 'false'}, 'HTTP_STATUS_CODE_CLIENT_ERROR')
        return func(**kwargs)
    return wrapper