from flask import render_template, request
from flask import Blueprint
import re
import datetime
import json

import warnings
warnings.filterwarnings("ignore")
from elasticsearch import Elasticsearch
import flask_login
from flask_login import current_user

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

@keyword.route('/ja')
@flask_login.login_required
def search_key_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').replace('　', ' ').lower()
    query_list = query_r.split(" ")
    p = r'\*(.*)\*'
    
    hash_r = request.args.get('hash')
    hash_r = hash_r.lower()
    hash_len = len(hash_r)
    title_list = []
    publisher_list = []
    label_list = []
    ID_list = []
    e_label_list = []
    n_label_list = []
    url_list = []
    language_list = []
    type_list = []
    public_date_list = []
    if hash_len >= 1:
        f_res = es.search(index = 'sample01', 
            _source = ['Label', 'Title', 'Publisher', 'ID', 'Public_date', 'N_label', 'E_label', 'URL', 'Language', 'Type'],
            size = 1,
            query = {'prefix':{'Text': hash_r }})
        dt_now = datetime.datetime.now()
        Log = {"user": current_user.get_id(), "mode": "keyword_hash", "query": hash_r, "datetime": str(dt_now), "database": "sample01", "view": 20}
        D_es.create(index="log01",body=Log,id=str(dt_now).replace(" ",""))
        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'])
    else:
        ss = []
        mm = []
        for i in query_list:
            r = re.findall(p, i)
            if len(r)==0:
                q=i
                if q.isalnum() == True:
                    ss.append({"match":{"Text": q }})
                    ss.append({"match":{"Title": q }})
                else:
                    ss.append({"match_phrase":{"Text": q }})
                    ss.append({"match_phrase":{"Title": q }})
            else:
                q=r[0]
                if q.isalnum() == True:
                    mm.append({"match":{"Text": q }})
                    ss.append({"match":{"Title": q }})
                else:
                    mm.append({"match_phrase":{"Text": q }})
                    ss.append({"match_phrase":{"Title": q }})
        if len(mm)==0:
            body = {
                    "bool":{
                        "should":ss
                }}
        else:
            body = {"bool":{
                        "should":ss,
                        "must":mm
                        }
                    }

        f_res = es.search(index = 'sample01', _source = ["Label", "Title","Publisher", "ID", "Public_date", "N_label", "E_label", "URL", "Language", "Type"],
        size = 20, query = body)
        dt_now = datetime.datetime.now()
        Log = {"user": current_user.get_id(), "mode": "keyword", "query": query_r, "datetime": str(dt_now), "database": "sample01", "view": 20}
        D_es.create(index="log01",body=Log,id=str(dt_now).replace(" ",""))
        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"])
    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]})
    print(hit)
    if len(hit) == 0:
        return render_template("form_error-ja.html")
    else:
        return render_template("search_keyword-ja.html", hit = hit, hits = hit_num) 
        
@keyword.route('/en')
@flask_login.login_required
def search_key_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').replace('　', ' ').lower()
    query_list = query_r.split(" ")
    p = r'\*(.*)\*'
    
    hash_r = request.args.get('hash')
    hash_r = hash_r.lower()
    hash_len = len(hash_r)
    title_list = []
    publisher_list = []
    label_list = []
    ID_list = []
    e_label_list = []
    n_label_list = []
    url_list = []
    language_list = []
    type_list = []
    public_date_list = []
    if hash_len >= 1:
        f_res = es.search(index = 'sample01', 
            _source = ['Label', 'Title', 'Publisher', 'ID', 'Public_date', 'N_label', 'E_label', 'URL', 'Language', 'Type'],
            size = 1,
            query = {'prefix':{'Text': hash_r }})
        dt_now = datetime.datetime.now()
        Log = {"user": current_user.get_id(), "mode": "keyword_hash", "query": hash_r, "datetime": str(dt_now), "database": "sample01", "view": 20}
        D_es.create(index="log01",body=Log,id=str(dt_now).replace(" ",""))
        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'])
    else:
        ss = []
        mm = []
        for i in query_list:
            r = re.findall(p, i)
            if len(r)==0:
                q=i
                if q.isalnum() == True:
                    ss.append({"match":{"Text": q }})
                    ss.append({"match":{"Title": q }})
                else:
                    ss.append({"match_phrase":{"Text": q }})
                    ss.append({"match_phrase":{"Title": q }})
            else:
                q=r[0]
                if q.isalnum() == True:
                    mm.append({"match":{"Text": q }})
                    ss.append({"match":{"Title": q }})
                else:
                    mm.append({"match_phrase":{"Text": q }})
                    ss.append({"match_phrase":{"Title": q }})
        if len(mm)==0:
            body = {
                    "bool":{
                        "should":ss
                }}
        else:
            body = {"bool":{
                        "should":ss,
                        "must":mm
                        }
                    }

        f_res = es.search(index = 'sample01', _source = ["Label", "Title","Publisher", "ID", "Public_date", "N_label", "E_label", "URL", "Language", "Type"],
        size = 20, query = body)
        dt_now = datetime.datetime.now()
        Log = {"user": current_user.get_id(), "mode": "keyword", "query": query_r, "datetime": str(dt_now), "database": "sample01", "view": 20}
        D_es.create(index="log01",body=Log,id=str(dt_now).replace(" ",""))
        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"])
    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]})
    print(hit)
    if len(hit) == 0:
        return render_template("form_error-en.html")
    else:
        return render_template("search_keyword-en.html", hit = hit, hits = hit_num) 
        