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

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

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

@vector.route('/ja')
@flask_login.login_required
def search_vec_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'\*(.*)\*' 
    print(query_list)
    hash_r = request.args.get('hash')
    hash_r = hash_r.lower()
    hash_len = len(hash_r)
    label = []
            
    if hash_len >= 1:
        f_res = es.search(index = 'sample01', _source = ['Label', 'Title','Publisher', 'ID', 'Vector', '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": "vector_hash", "query": hash_r, "datetime": str(dt_now), "database": "sample01", "view": 20}
        D_es.create(index="log01",body=Log,id=str(dt_now).replace(" ",""))
        for doc in f_res['hits']['hits']:
            dict1 = doc['_source']
            label = dict1['Label']
            t_title = dict1['Title']
            t_publisher = dict1['Publisher']
            t_id = dict1['ID']
            t_vec = dict1['Vector']
            t_e_label = ', '.join(dict1['E_label'])
            t_n_label = ', '.join(dict1['N_label'])
            t_url = dict1['URL']
            t_language = dict1['Language']
            t_type = dict1['Type']
            t_public_date = dict1['Public_date']
        hit_num = f_res['hits']['total']['value']
    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", "Vector"],
        size = 1, query = body)
        dt_now = datetime.datetime.now()
        Log = {"user": current_user.get_id(), "mode": "vector", "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 = dict1['Label']
            t_title = dict1['Title']
            t_publisher = dict1['Publisher']
            t_id = dict1['ID']
            t_vec = dict1['Vector']
            t_e_label = ', '.join(dict1['E_label'])
            t_n_label = ', '.join(dict1['N_label'])
            t_url = dict1['URL']
            t_language = dict1['Language']
            t_type = dict1['Type']
            t_public_date = dict1['Public_date']
    if len(label) >= 1:
        """num = 0
        label_list = []
        
        for l in label:
            label_list.append(l)
            num += 1
            if num == 15:
                break

        label = ', '.join(label_list)"""

        res = es.search(index = 'sample01', _source = ['Label', 'Title','Publisher', 'ID', 'Public_date', 'N_label', 'E_label', 'URL', 'Language', 'Type'],
            size = 21, query = {
                "function_score": {
                "query": {
                    "match_all": {}
                },
                "functions": [
                    {
                    "script_score": {
                        "script": {
                        "source": "cosineSimilarity(params.queryVector, 'Vector') + 1.0",
                        "params": {
                            "queryVector": t_vec
                        }
                                    }
                        }
                    } 
                ]
                }
            })   

        title_list = []
        publisher_list = []
        score_list = []
        ID_list = []
        e_label_list = []
        n_label_list = []
        url_list = []
        language_list = []
        type_list = []
        public_date_list = []

        for doc in res['hits']['hits']:
            dict1 = doc['_source']
            score_list.append(doc['_score'])
            title_list.append(dict1['Title'])
            ID_list.append(dict1['ID'])
            publisher_list.append(dict1['Publisher'])
            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], 'distance': score_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]})
        del hit[0]
        return render_template("search-ja.html", hits = hit_num, hit = hit, l = label, ti = t_title, p = t_publisher, I = t_id, e = t_e_label, n = t_n_label, url = t_url, lang = t_language, type = t_type, p_d = t_public_date)
    else:
        return render_template('form_error-ja.html')

@vector.route('/en')
@flask_login.login_required
def search_vec_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'\*(.*)\*' 
    print(query_list)
    hash_r = request.args.get('hash')
    hash_r = hash_r.lower()
    hash_len = len(hash_r)
    label = []
            
    if hash_len >= 1:
        f_res = es.search(index = 'sample01', _source = ['Label', 'Title','Publisher', 'ID', 'Vector', '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": "vector_hash", "query": hash_r, "datetime": str(dt_now), "database": "sample01", "view": 20}
        D_es.create(index="log01",body=Log,id=str(dt_now).replace(" ",""))
        for doc in f_res['hits']['hits']:
            dict1 = doc['_source']
            label = dict1['Label']
            t_title = dict1['Title']
            t_publisher = dict1['Publisher']
            t_id = dict1['ID']
            t_vec = dict1['Vector']
            t_e_label = ', '.join(dict1['E_label'])
            t_n_label = ', '.join(dict1['N_label'])
            t_url = dict1['URL']
            t_language = dict1['Language']
            t_type = dict1['Type']
            t_public_date = dict1['Public_date']
        hit_num = f_res['hits']['total']['value']
    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", "Vector"],
        size = 1, query = body)
        dt_now = datetime.datetime.now()
        Log = {"user": current_user.get_id(), "mode": "vector", "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 = dict1['Label']
            t_title = dict1['Title']
            t_publisher = dict1['Publisher']
            t_id = dict1['ID']
            t_vec = dict1['Vector']
            t_e_label = ', '.join(dict1['E_label'])
            t_n_label = ', '.join(dict1['N_label'])
            t_url = dict1['URL']
            t_language = dict1['Language']
            t_type = dict1['Type']
            t_public_date = dict1['Public_date']
    if len(label) >= 1:
        """num = 0
        label_list = []
        
        for l in label:
            label_list.append(l)
            num += 1
            if num == 15:
                break

        label = ', '.join(label_list)"""

        res = es.search(index = 'sample01', _source = ['Label', 'Title','Publisher', 'ID', 'Public_date', 'N_label', 'E_label', 'URL', 'Language', 'Type'],
            size = 21, query = {
                "function_score": {
                "query": {
                    "match_all": {}
                },
                "functions": [
                    {
                    "script_score": {
                        "script": {
                        "source": "cosineSimilarity(params.queryVector, 'Vector') + 1.0",
                        "params": {
                            "queryVector": t_vec
                        }
                                    }
                        }
                    } 
                ]
                }
            })   

        title_list = []
        publisher_list = []
        score_list = []
        ID_list = []
        e_label_list = []
        n_label_list = []
        url_list = []
        language_list = []
        type_list = []
        public_date_list = []

        for doc in res['hits']['hits']:
            dict1 = doc['_source']
            score_list.append(doc['_score'])
            title_list.append(dict1['Title'])
            ID_list.append(dict1['ID'])
            publisher_list.append(dict1['Publisher'])
            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], 'distance': score_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]})
        del hit[0]
        return render_template("search-en.html", hits = hit_num, hit = hit, l = label, ti = t_title, p = t_publisher, I = t_id, e = t_e_label, n = t_n_label, url = t_url, lang = t_language, type = t_type, p_d = t_public_date)
    else:
        return render_template('form_error-en.html')