#! /usr/bin/python3
import time
import datetime
import os
import json
from es_extract import ElasticSearchExporter
from flask import Flask, request, send_file, render_template, redirect, url_for, flash, make_response
import pymongo
import uuid

# load config file
my_path = os.path.abspath(os.path.dirname(__file__))
#path = os.path.join(my_path, '../omnisms-config.cfg')
#with open(path) as f:
#    data = json.load(f)

ELASTICSEARCH_CLUSTER_URL = 'https://search-omnisms-log-prod-li52ocvbitsmnyxgomxhne2rfy.ca-central-1.es.amazonaws.com:443'
MONGO_URL = 'localhost'

app = Flask(__name__)
app.secret_key = 'secret1q2ridj48vc'
client = pymongo.MongoClient(MONGO_URL)
db = client['staytransit']
collection = db['extracts']
data_file_path = os.path.dirname(os.path.realpath(__file__)) + '\\export\\'
os.environ['TZ'] = 'America/New_York'
time.tzset()


def get_query(start, end):
    es_query = "requestStartTimeUTC:[{} TO {}]".format(start, end)
    return es_query


def to_utc(time_string):
    timestamp = time.mktime(datetime.datetime.strptime(time_string, '%Y-%m-%d').timetuple())
    return int(timestamp)


def get_extract(es_query, file_name):
    fields = "id,userRequestStartTime,requestDuration,channel,command,requestStopId," \
             "locationName,hashedRequestorID,APIDuration,APIResponseStatus," \
             "APIResponseMetadataTimeStamp,cacheHit,hour,rawCommand"
    data_file_path = os.path.dirname(os.path.realpath(__file__)) + '/export/'
    exporter = ElasticSearchExporter()
    msg = exporter.export(data_file_path + file_name,
                    ELASTICSEARCH_CLUSTER_URL,
                    "omnisms-log-external*",
                    "sms-entry",
                    es_query,
                    None,
                    100,
                    fields,
                    ",")
    return msg


@app.route('/', methods=['GET'])
def my_form():
    extracts_cursor = collection.find({'status': 'available'})
    extracts_lst = [doc for doc in extracts_cursor]
    sorted_lst = list(reversed(sorted(extracts_lst, key=lambda k: k['created_at'])))
    resp = make_response(render_template("extract_form.html", extracts=sorted_lst))
    resp.headers.set("Access-Control-Allow-Origin", "*")
    return resp


@app.route('/export', methods=['POST'])
def my_form_post():
    start = datetime.datetime.strptime(str(request.form['start']), '%m/%d/%Y').strftime('%Y-%m-%d')
    end = datetime.datetime.strptime(str(request.form['end']), '%m/%d/%Y').strftime('%Y-%m-%d')
    filename = "OmniSMS-Log-" + datetime.datetime.now().strftime("%Y-%m-%d-%H:%M:%S") + ".csv"
    extract_id = str(uuid.uuid4())
    start_utc = to_utc(start)
    end_utc = to_utc(end) + 86400

    es_query = get_query(start_utc, end_utc)
    get_extract(es_query, filename)

    mongo_document = {
        "extract_id": extract_id,
        "created_at": time.time(),
        "created_at_str": datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
        "filename": filename,
        "date": start + " to " + end,
        "status": "available"
    }
    collection.insert_one(mongo_document)
    return redirect(url_for("my_form"))


@app.route("/export/<filename>", methods=['GET', 'POST'])
def get_file(filename):
    try:
        return send_file('./export/' + filename, as_attachment=True)
    except FileNotFoundError:
        flash("File not found")
        return redirect(url_for("my_form"))


@app.route("/delete/<extract_id>", methods=['GET', 'POST'])
def delete_file(extract_id):
    try:
        collection.update_one({'extract_id': extract_id}, {"$set": {"status": "deleted"}}, upsert=False)
        return redirect(url_for("my_form"))
    except FileNotFoundError:
        flash("File not found")
        return redirect(url_for("my_form"))

