def logout():
    try:
        logout_user()
        return jsonify({'message': 'Вы успешно вышли из системы', 'path': '/login'})
    except Exception:
        app.logger.exception(process_log_string(request))
        raise
def source_video(video):
    try:
        return send_from_directory(app.config['UPLOAD_FOLDER'], filename=video,
                                   as_attachment=False, mimetype='video/mp4')
    except Exception:
        app.logger.exception(process_log_string(request))
        raise
def status_tasks():
    try:
        tasks_id = op.get_user_tasks(current_user.username)
        all_user_task = {}
        for uuid in tasks_id:
            all_user_task[uuid] = video_processing.AsyncResult(uuid).state
        response = {
            'tasks': all_user_task
        }
        return jsonify(response), 200
    except Exception:
        app.logger.exception(process_log_string(request))
        raise
def register():
    try:
        if current_user.is_authenticated:
            return jsonify({'message': 'Вы уже зарегестрированы', 'path': '/'})
        username = request.json.get('login', None)
        password = request.json.get('password', None)
        reg = op.add_user_to_db(username=str(username), password=str(password))
        if reg:
            return jsonify({'message': 'Вы успешно зарегестрированы', 'path': '/login'})
        else:
            return jsonify({'message': 'Пользователь с таким именем уже существует', 'path': '/register'})
    except Exception:
        app.logger.exception(process_log_string(request))
        raise
def delete_task():
    try:
        task_id = request.args['task_id']
        op.delete_user_task_id(task_id)

        path = app.config['UPLOAD_FOLDER']
        filename = request.args['filename']
        op.delete_user_video(path, filename)
        response = {
            'filename': filename,
            'task_id': task_id
        }
        return jsonify(response), 200
    except Exception:
        app.logger.exception(process_log_string(request))
        raise
def result_task(task_id):
    try:
        task = video_processing.AsyncResult(task_id)
        if task.state == 'PENDING':  # Цвет -> Синий
            response = {
                'task_id': task_id,
                'state': task.state,
                'task_result': {
                    'filename': None,
                    'video': None
                },
                'info': str(task.info)  # Содержит task.result в формате json
            }
        elif task.state != 'FAILURE':  # Цвет -> Зеленый/Желтай
            response = {
                'task_id': task_id,
                'state': task.state,
                'task_result': task.result,
                'info': str(task.info),
            }
            if task.state == 'SUCCESS':  # Цвет -> Зеленый
                # Здесь можно получить результат после выполнения
                response = {
                    'task_id': task_id,
                    'state': task.state,
                    'task_result': task.result,
                    'info': str(task.info),
                    'date_done': task.date_done.strftime('%H:%M | %d %B %Y')
                }
        else:  # Цвет -> Красный
            # Ошибка на стороне сервера (или где-то еще)
            response = {
                'task_id': task_id,
                'state': task.state,
                'task_result': {
                    'filename': None,
                    'video': None
                },
                'info': str(task.info)  # Информация об ошибке
            }
        return jsonify(response), 200
    except Exception:
        app.logger.exception(process_log_string(request))
        raise
def load_video():
    try:
        if 'file' not in request.files:
            return jsonify({'file': 'Ошибка загрузки видео'})
        file = request.files['file']
        matrix = eval(request.form['matrix'])
        width = float(request.form['width'])
        if file.filename == '':
            return jsonify({'file': 'Нет выбранного файла'})
        filename = secure_filename(file.filename)
        path = os.path.join(app.config['UPLOAD_FOLDER'], filename)
        file.save(path)
        print("[INFO] starting save video...")
        username = current_user.username
        task = video_processing.delay(path, filename, matrix, width)
        op.send_task_progress(task.id, username)
        return jsonify({'file': filename, 'task_id': task.id, 'status': task.state}), 202
    except Exception:
        app.logger.exception(process_log_string(request))
        raise
def all_result_tasks():
    try:
        response = []
        tasks_id = op.get_user_tasks(current_user.username)
        for uuid in tasks_id:
            result = video_processing.AsyncResult(uuid)
            if result.state == 'PENDING':
                task = {
                    'task_id': uuid,
                    'filename': None,
                    'video': None,
                    'status': result.state
                }
                response.append(task)
            elif result.state != 'FAILURE':
                task = {
                    'task_id': uuid,
                    'filename': result.result['filename'],
                    'video': None,
                    'status': result.state
                }
                if result.state == 'SUCCESS':
                    task = {
                        'task_id': uuid,
                        'filename': result.result['filename'],
                        'video': result.result['video'],
                        'status': result.state
                    }
                response.append(task)
            else:
                task = {
                    'task_id': uuid,
                    'filename': None,
                    'video': None,
                    'status': result.state
                }
                response.append(task)
        return jsonify(response), 200
    except Exception:
        app.logger.exception(process_log_string(request))
        raise
def login():
    try:
        if current_user.is_authenticated:
            # Можно пробовать не отправлять username, так как он перезаписывает уже существующий
            return jsonify({'message': 'Вы уже авторизировались в системе',
                            'username': current_user.username, 'path': '/'})
        username = request.json.get('login', None)
        password = request.json.get('password', None)
        if op.check_validate_user(username=username, password=password):
            # Поскольку авторизация проходит не с помощью JWT токена
            # Ставим remember=True, иначе будут проблемы
            # Альтернатива -> поставить GET запрос и каждый раз проверять current_user
            op.check_login_user(username=username, remember=True)
            return jsonify({'message': 'Вы успешно авторизировались в системе',
                            'username': username, 'path': '/'})
        else:
            return jsonify({'message': 'Неверный ввод пользователя или пароля',
                            'username': None, 'path': '/login'})
    except Exception:
        app.logger.exception(process_log_string(request))
        raise
def catch_all(path):
    try:
        return render_template("index.html")
    except Exception:
        app.logger.exception(process_log_string(request))
        raise
def index():
    try:
        return render_template('index.html')
    except Exception:
        app.logger.exception(process_log_string(request))
        raise