"""AUCR analysis plugin default flask app blueprint routes."""
# coding=utf-8
import os
import logging
from flask import Blueprint, render_template, request, flash, redirect, current_app
from flask_login import login_required
from werkzeug.utils import secure_filename
from aucr_app.plugins.tasks.mq import index_mq_aucr_task, get_mq_yaml_configs, index_mq_aucr_report
from aucr_app.plugins.analysis.file.upload import allowed_file, create_upload_file
from multiprocessing import Process

analysis_page = Blueprint('analysis', __name__, template_folder='templates')


def upload_to_object_storage_and_remove(file_hash):
    """MQ Process file."""
    index_mq_aucr_task(rabbit_mq_server=current_app.config['RABBITMQ_SERVER'], task_name=file_hash, routing_key="file")


def get_upload_file_hash(file):
    """Return uploaded file hash."""
    upload_file_dir = current_app.config['FILE_FOLDER']
    if current_app.config['OBJECT_STORAGE']:
        rabbit_mq_server_ip = current_app.config['RABBITMQ_SERVER']
        file_hash = str(create_upload_file(file, os.path.join(upload_file_dir)))
        mq_config_dict = get_mq_yaml_configs()
        files_config_dict = mq_config_dict["reports"]
        for item in files_config_dict:
            if "files" in item:
                logging.info("Adding " + str(file_hash) + " " + str(item["files"][0]) + " to MQ")
                index_mq_aucr_report(file_hash, str(rabbit_mq_server_ip), item["files"][0])
        p = Process(target=upload_to_object_storage_and_remove, args=(file_hash,))
        p.start()
    else:
        file_hash = create_upload_file(file, os.path.join(current_app.config['FILE_FOLDER']))
    return file_hash


@analysis_page.route('/upload_file', methods=['GET', 'POST'])
@login_required
def upload_file():
    """Return File Upload flask app analysis blueprint."""
    if request.method == 'POST':
        # check if the post request has the file part
        if 'file' not in request.files:
            flash('No file part')
            return redirect(request.url)
        file = request.files['file']
        # if user does not select file, browser also submit a empty part without filename
        if file.filename == '':
            flash('No selected file, or that file type is not supported')
            return redirect(request.url)
        if file and allowed_file(file.filename):
            filename = secure_filename(file.filename)
            file_hash = get_upload_file_hash(file)
            flash("The " + str(filename) + " md5:" + file_hash + " has been uploaded!")
    return render_template('upload_file.html', title='Upload File')