from flask import render_template, request
from flask import Blueprint
import pandas as pd
import csv
import warnings
warnings.filterwarnings("ignore")
from elasticsearch import Elasticsearch
import collections
import flask_login
from flask_login import current_user
import datetime
import json

graph = Blueprint('graph', __name__, url_prefix='/graph')

@graph.route('/ja')
@flask_login.login_required
def drawheatmap_ja():
    
    year = request.args.get('year')
    num = request.args.get('number')
    column = []
    with open('./dataset/'+year+'-'+num+'.csv') as f:
        reader = csv.reader(f)
        data = [row for row in reader]
    header = data[0]
    del header[18],header[1],header[0]
    for i in range(len(data)):
        if len(data[i][1]) >= 5:
            CVE = 'CVE-' + data[i][0] + '-' + data[i][1]
        else:
            CVE = 'CVE-' + data[i][0] + '-' + data[i][1].zfill(4)
        column.append(CVE)
    del column[0]
    dfdel = pd.read_csv('./dataset/'+year+'-'+num+'.csv', usecols=[2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18])
    data = dfdel.values.tolist()
    datas = []
    for data in data:
        datas.extend(data)
    length = len(column)
    print(datas)
    return render_template('heatmap-ja.html', cve = column, data = datas, len = length)

@graph.route('/en')
@flask_login.login_required
def drawheatmap_en():
    year = request.args.get('year')
    num = request.args.get('number')
    column = []
    with open('./dataset/'+year+'-'+num+'.csv') as f:
        reader = csv.reader(f)
        data = [row for row in reader]
    header = data[0]
    del header[18],header[1],header[0]
    for i in range(len(data)):
        if len(data[i][1]) >= 5:
            CVE = 'CVE-' + data[i][0] + '-' + data[i][1]
        else:
            CVE = 'CVE-' + data[i][0] + '-' + data[i][1].zfill(4)
        column.append(CVE)
    del column[0]
    dfdel = pd.read_csv('./dataset/'+year+'-'+num+'.csv', usecols=[2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18])
    data = dfdel.values.tolist()
    datas = []
    for data in data:
        datas.extend(data)
    length = len(column)
    print(datas)
    return render_template('heatmap-en.html', cve = column, data = datas, len = length)

@graph.route('/ja/CVE')
@flask_login.login_required
def drawpie_ja():
    D_es = Elasticsearch("http://160.248.189.116:9200", http_auth = ('elastic', 'btqJrBAQJvnnp9xW-3iK'))
    es = Elasticsearch("http://164.70.95.77:9200", http_auth = ('elastic', 'wRnciG81ueoSxNs=Qohd'))
    query_r = request.args.get('query')
    dt_now = datetime.datetime.now()
    Log = {"user": current_user.get_id(), "mode": "CVE", "query": query_r, "datetime": str(dt_now), "database": "sample01", "view": 20}
    D_es.create(index="log01",body=Log,id=str(dt_now).replace(" ",""))
    
    title_list = []
    publisher_list = []
    label_list = []
    ID_list = []
    e_label_list = []
    n_label_list = []
    url_list = []
    language_list = []
    type_list = []
    public_date_list = []
    f_res = es.search(index = 'sample01', query = {
            'bool':{
                'should':[
                    {"match_phrase":{"Title": query_r }},
                    {"match_phrase":{"Text": query_r }}
                ]
        }},
        _source = ['Label', 'Title', 'Publisher', 'ID', 'Public_date', 'N_label', 'E_label', 'URL', 'Language', 'Type'],
        size = 1000)
    
    hit_num = f_res['hits']['total']['value']
    for doc in f_res['hits']['hits']:
        dict1 = doc['_source']
        label_list.append(dict1['Label'])
        title_list.append(dict1['Title'])
        publisher_list.append(dict1['Publisher'])
        ID_list.append(dict1['ID'])
        e_label_list.append(', '.join(dict1['E_label']))
        n_label_list.append(', '.join(dict1['N_label']))
        url_list.append(dict1['URL'])
        language_list.append(dict1['Language'])
        type_list.append(dict1['Type'])
        public_date_list.append(dict1['Public_date'])
    
    
    c = collections.Counter(publisher_list)

    value, count = zip(*c.most_common())

    values = list(value)
    counts = list(count)
    
    color_list = []
    color = ["rgba(224,52,38,0.2)","rgba(248,182,32,0.2)","rgba(87,163,55,0.2)","rgba(48,188,173,0.2)","rgba(79,124,186,0.2)","rgba(235,115,179,0.2)","rgba(240,103,25,0.2)","rgba(213,187,33,0.2)","rgba(51,166,92,0.2)","rgba(44,181,192,0.2)","rgba(120,115,192,0.2)","rgba(252,113,158,0.2)","rgba(248,146,23,0.2)","rgba(162,182,39,0.2)","rgba(33,176,135,0.2)","rgba(27,163,198,0.2)","rgba(162,109,194,0.2)","rgba(246,73,113,0.2)","rgba(206,105,190,0.2)"]
    for pub in publisher_list:
        for i in range(len(values)):
            if pub == values[i]:
                color_list.append(color[i])
            else:
                pass


    hit = []
    for i in range(len(title_list)):
        hit.append({'title': title_list[i], 'publisher': publisher_list[i], 'ID': ID_list[i], 'label': label_list[i], 'E_label': e_label_list[i], 'N_label': n_label_list[i], 'URL': url_list[i], 'Language': language_list[i], 'Type': type_list[i], 'Public_date': public_date_list[i], 'color': color_list[i]})

    if len(hit) == 0:
        return render_template("form_error-ja.html")
    else:
        return render_template("search_CVE-ja.html", hit = hit, data = counts, label = values, CVE = query_r, hits = hit_num)

@graph.route('/en/CVE')
@flask_login.login_required
def drawpie_en():
    D_es = Elasticsearch("http://160.248.189.116:9200", http_auth = ('elastic', 'btqJrBAQJvnnp9xW-3iK'))
    es = Elasticsearch("http://164.70.95.77:9200", http_auth = ('elastic', 'wRnciG81ueoSxNs=Qohd'))
    query_r = request.args.get('query')
    dt_now = datetime.datetime.now()
    Log = {"user": current_user.get_id(), "mode": "CVE", "query": query_r, "datetime": str(dt_now), "database": "sample01", "view": 20}
    D_es.create(index="log01",body=Log,id=str(dt_now).replace(" ",""))
    title_list = []
    publisher_list = []
    label_list = []
    ID_list = []
    e_label_list = []
    n_label_list = []
    url_list = []
    language_list = []
    type_list = []
    public_date_list = []
    f_res = es.search(index = 'sample01', query = {
            'bool':{
                'should':[
                    {"match_phrase":{"Title": query_r }},
                    {"match_phrase":{"Text": query_r }}
                ]
        }},
        _source = ['Label', 'Title', 'Publisher', 'ID', 'Public_date', 'N_label', 'E_label', 'URL', 'Language', 'Type'],
        size = 1000)
    
    hit_num = f_res['hits']['total']['value']
    for doc in f_res['hits']['hits']:
        dict1 = doc['_source']
        label_list.append(dict1['Label'])
        title_list.append(dict1['Title'])
        publisher_list.append(dict1['Publisher'])
        ID_list.append(dict1['ID'])
        e_label_list.append(', '.join(dict1['E_label']))
        n_label_list.append(', '.join(dict1['N_label']))
        url_list.append(dict1['URL'])
        language_list.append(dict1['Language'])
        type_list.append(dict1['Type'])
        public_date_list.append(dict1['Public_date'])
    
    
    c = collections.Counter(publisher_list)

    value, count = zip(*c.most_common())

    values = list(value)
    counts = list(count)
    
    color_list = []
    color = ["rgba(224,52,38,0.2)","rgba(248,182,32,0.2)","rgba(87,163,55,0.2)","rgba(48,188,173,0.2)","rgba(79,124,186,0.2)","rgba(235,115,179,0.2)","rgba(240,103,25,0.2)","rgba(213,187,33,0.2)","rgba(51,166,92,0.2)","rgba(44,181,192,0.2)","rgba(120,115,192,0.2)","rgba(252,113,158,0.2)","rgba(248,146,23,0.2)","rgba(162,182,39,0.2)","rgba(33,176,135,0.2)","rgba(27,163,198,0.2)","rgba(162,109,194,0.2)","rgba(246,73,113,0.2)","rgba(206,105,190,0.2)"]
    for pub in publisher_list:
        for i in range(len(values)):
            if pub == values[i]:
                color_list.append(color[i])
            else:
                pass
    hit = []
    for i in range(len(title_list)):
        hit.append({'title': title_list[i], 'publisher': publisher_list[i], 'ID': ID_list[i], 'label': label_list[i], 'E_label': e_label_list[i], 'N_label': n_label_list[i], 'URL': url_list[i], 'Language': language_list[i], 'Type': type_list[i], 'Public_date': public_date_list[i], 'color': color_list[i]})

    if len(hit) == 0:
        return render_template("form_error-en.html")
    else:
        return render_template("search_CVE-en.html", hit = hit, data = counts, label = values, CVE = query_r, hits = hit_num)