#!/usr/bin/env python3
# -*-coding:UTF-8 -*

'''
    Flask functions and routes for the trending modules page
'''
import redis
import datetime
import calendar
from Date import Date
import flask
from flask import Flask, render_template, jsonify, request, Blueprint

from Role_Manager import login_admin, login_analyst
from flask_login import login_required

import Paste

# ============ VARIABLES ============
import Flask_config

app = Flask_config.app
cfg = Flask_config.cfg
baseUrl = Flask_config.baseUrl
r_serv_charts = Flask_config.r_serv_charts
r_serv_sentiment = Flask_config.r_serv_sentiment

sentiments = Blueprint('sentiments', __name__, template_folder='templates')

# ============ FUNCTIONS ============

def get_date_range(num_day):
    curr_date = datetime.date.today()
    date = Date(str(curr_date.year)+str(curr_date.month).zfill(2)+str(curr_date.day).zfill(2))
    date_list = []

    for i in range(0, num_day+1):
        date_list.append(date.substract_day(i))
    return date_list


# ============ ROUTES ============

@sentiments.route("/sentiment_analysis_trending/")
@login_required
@login_analyst
def sentiment_analysis_trending():
    return render_template("sentiment_analysis_trending.html")


@sentiments.route("/sentiment_analysis_getplotdata/", methods=['GET'])
@login_required
@login_analyst
def sentiment_analysis_getplotdata():
    # Get the top providers based on number of pastes
    oneHour = 60*60
    sevenDays = oneHour*24*7
    dateStart = datetime.datetime.now()
    dateStart = dateStart.replace(minute=0, second=0, microsecond=0)
    dateStart_timestamp = calendar.timegm(dateStart.timetuple())

    getAllProviders = request.args.get('getProviders')
    provider = request.args.get('provider')
    allProvider = request.args.get('all')
    if getAllProviders == 'True':
        if allProvider == "True":
            range_providers = r_serv_charts.smembers('all_provider_set')

            return jsonify(list(range_providers))
        else:
            range_providers = r_serv_charts.zrevrangebyscore('providers_set_'+ get_date_range(0)[0], '+inf', '-inf', start=0, num=8)
            # if empty, get yesterday top providers
            range_providers = r_serv_charts.zrevrangebyscore('providers_set_'+ get_date_range(1)[1], '+inf', '-inf', start=0, num=8) if range_providers == [] else range_providers


            # if still empty, takes from all providers
            if range_providers == []:
                print('today provider empty')
                range_providers = r_serv_charts.smembers('all_provider_set')

            return jsonify(list(range_providers))

    elif provider is not None:
        to_return = {}

        cur_provider_name = provider + '_'
        list_date = {}
        for cur_timestamp in range(int(dateStart_timestamp), int(dateStart_timestamp)-sevenDays-oneHour, -oneHour):
            cur_set_name = cur_provider_name + str(cur_timestamp)

            list_value = []
            for cur_id in r_serv_sentiment.smembers(cur_set_name):
                cur_value = (r_serv_sentiment.get(cur_id))
                list_value.append(cur_value)
            list_date[cur_timestamp] = list_value
        to_return[provider] = list_date

        return jsonify(to_return)
    return "Bad request"



@sentiments.route("/sentiment_analysis_plot_tool/")
@login_required
@login_analyst
def sentiment_analysis_plot_tool():
    return render_template("sentiment_analysis_plot_tool.html")



@sentiments.route("/sentiment_analysis_plot_tool_getdata/", methods=['GET'])
@login_required
@login_analyst
def sentiment_analysis_plot_tool_getdata():
    getProviders = request.args.get('getProviders')

    if getProviders == 'True':
        providers = []
        for cur_provider in r_serv_charts.smembers('all_provider_set'):
            providers.append(cur_provider)
        return jsonify(providers)

    else:
        query = request.args.get('query')
        query = query.split(',')
        Qdate = request.args.get('Qdate')

        date1 = (Qdate.split('-')[0]).split('/')
        date1 = datetime.date(int(date1[2]), int(date1[0]), int(date1[1]))

        date2 = (Qdate.split('-')[1]).split('/')
        date2 = datetime.date(int(date2[2]), int(date2[0]), int(date2[1]))

        timestamp1 = calendar.timegm(date1.timetuple())
        timestamp2 = calendar.timegm(date2.timetuple())

        oneHour = 60*60
        oneDay = oneHour*24

        to_return = {}
        for cur_provider in query:
            list_date = {}
            cur_provider_name = cur_provider + '_'
            for cur_timestamp in range(int(timestamp1), int(timestamp2)+oneDay, oneHour):
                cur_set_name = cur_provider_name + str(cur_timestamp)

                list_value = []
                for cur_id in r_serv_sentiment.smembers(cur_set_name):
                    cur_value = (r_serv_sentiment.get(cur_id))
                    list_value.append(cur_value)
                list_date[cur_timestamp] = list_value
            to_return[cur_provider] = list_date

        return jsonify(to_return)

# ========= REGISTRATION =========
app.register_blueprint(sentiments, url_prefix=baseUrl)
