from flask import render_template, request, send_file, session, redirect
from omp.search import search_files
from omp.utils import *
from omp import app, bcrypt

import time

@app.route("/login", methods=["GET", "POST"])
@app.route("/panel/login", methods=["GET", "POST"])
def login():
    if 'logged_in' in session:
        return redirect('/panel')
    if request.method == 'POST':
        print('login')
        username = request.form['username']
        password = request.form['password']
        print(request.form)
        pw_hash = bcrypt.generate_password_hash(password)
        print(pw_hash)
        pw_ok = bcrypt.check_password_hash(app.config['ADMIN_PASSWORD'], password)
        pw_ok2 = bcrypt.check_password_hash(app.config['ADMIN_PASSWORD'], pw_hash)
        print(pw_ok)
        if pw_ok:
            session['logged_in'] = True
            session['username'] = username
            return redirect('/panel')
        else:
            return 'login failed'
    elif request.method == 'GET':
        return render_template("pages/login.html")
    else:
        return 'error, wrong request type'

@app.route('/logout')
@app.route('/panel/logout')
def logout():
    del session['logged_in']
    return redirect('/panel/login')

@app.route("/")
@app.route("/panel/")
def index():
    if 'logged_in' not in session:
        return redirect('/panel/login')
    uptime = get_command_output('uptime')
    hostname = get_command_output('hostname')
    clients = get_client_list(app.config['EXPORT_PATHS'])
    data = {'uptime': uptime, 'hostname':hostname, 'username':session['username'],
            'clients':clients}
    return render_template("pages/index.html", data=data)

@app.route("/panel/search", methods=["GET", "POST"])
@app.route("/search", methods=["GET", "POST"])
def search():
    if 'logged_in' not in session:
        return redirect('/panel/login')
    if request.method == 'POST':
        # ImmutableMultiDict([('folder', 'export'), ('clientName', 'rak1'), ('nobo', 'nobo'), ('query', 'a'), ('from-date', ''), ('to-date', '')])

        folder = request.form['folder'] # TODO sanitize
        query = query=request.form['query'] # TODO sanitize
        client_name = request.form['clientName']
        nobo = request.form.get('nobo', '')
        source = request.form.get('fileSources', '')
        results = []
        start = time.time()
        if folder == 'import': # TODO determine folder properly, imported RMQ or OURS, EXPORTED list folders available, put in config
            if app.config['PARSER_TYPE'] in ['UOF', 'LS']:
                if source == 'ours':
                    search_path = app.config['OUR_FILES']
                elif source == 'provider':
                    search_path = app.config['IMPORT_PATH']
            else:  # For FM parser
                search_path = app.config['IMPORT_PATH']
            if not_whitelisted(search_path):
                return f"{search_path} path not allowedv {app.config['PATH_WHITELIST']}"
        elif folder == 'export':
            if nobo == 'nobo':
                search_path = f"/odds/{client_name}/processed"
            else:
                search_path = f"/odds/{client_name}"
            if not_whitelisted(search_path):
                return f"{search_path} path not allowedv {app.config['PATH_WHITELIST']}"
        elif folder == 'alerts':
            search_path = app.config['ALERTS_PATH']
            if not_whitelisted(search_path):
                return f"{search_path} path not allowedv {app.config['PATH_WHITELIST']}"
        elif folder == 'delta':
            search_path = app.config['DELTA_PATH']
            if not_whitelisted(search_path):
                return f"{search_path} path not allowedv {app.config['PATH_WHITELIST']}"
        else:
            results = []
        results = search_files(path=search_path, query=query)
        end = time.time()
        elapsed = round(end - start, 3)
        return render_template('pages/search_results.html', data=results, elapsed=elapsed, num_results=len(results))
    elif request.method == 'GET':
        clients = get_client_list(app.config['EXPORT_PATHS'])
        print(clients)
        data = {'clients':clients}
        return render_template("pages/search_form.html", data=data)

@app.route("/show/<path:path>")
@app.route("/panel/show/<path:path>")
def showfile(path):
    if 'logged_in' not in session:
        return redirect('/panel/login')
    path = '/' + path
    if not_whitelisted(path):
        return 'Error'
    data = {}
    data['lines'] = read_file(path=path)
    data['file_path'] = path
    data['file_size'] = file_size(path)
    return render_template('pages/show_file.html', data=data)

@app.route("/download/<path:path>")
@app.route("/panel/download/<path:path>")
def download_file(path):
    if 'logged_in' not in session:
        return redirect('/panel/login')
    path = '/' + path
    if is_whitelisted(path=path):
        return send_file(path, as_attachment=True, mimetype='text/xml')
    else:
        return ':/'

@app.route("/log-viewer")
@app.route("/panel/log-viewer")
def log_viewer():
    if 'logged_in' not in session:
        return redirect('/panel/login')
    import_path = app.config['IMPORT_PATH']
    export_path = app.config['EXPORT_PATHS'][0]
    processed_path = app.config['IMPORT_PATH']

    stuck = count_files(import_path)
    wfe = count_files(export_path)
    processed = count_files(processed_path)

    data = {'stuck': stuck, 'wfe': wfe, 'processed': processed}
    return render_template("pages/log_viewer.html", data=data)

@app.route("/documentation")
@app.route("/panel/documentation")
def docs():
    if 'logged_in' not in session:
        return redirect('/panel/login')
    return render_template("pages/documentation.html")
