from flask import request, jsonify
from flask import Blueprint

import warnings
warnings.filterwarnings("ignore")
from elasticsearch import Elasticsearch
import re
import json
import datetime

import flask_login

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

@view.route('/')
def search_view():
    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()
    if query_r == "        ":
        pass
    else:
        query_list = query_r.split(" ")
        view_r = request.args.get('view')
        mode_r = request.args.get('mode')
        database = request.args.get('database')
        p = r'\*(.*)\*' 
        t_vec = []
        
        if view_r == None:
            view_r = 3
        else:
            pass
        if mode_r == None:
            mode_r == 'vector'
        else:
            pass
        if database == None:
            database_r = 'sample01'
        elif database == "2021":
            database_r = "sample02"
        elif database == "2022-1":
            database_r = "sample01"
        dt_now = datetime.datetime.now()
        Log = {"user": "Viewer", "mode": view_r, "query": query_r, "view": view_r, "database": database_r, "datetime": str(dt_now)}
        
        D_es.create(index="log01",body=Log,id=str(dt_now).replace(" ",""))
        
        if mode_r == "keyword":
            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
                    }}
            res = es.search(index = database_r, size = view_r, _source = ['Title','Publisher', 'Public_date', 'URL'],
            query = body)

        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 = database_r, query = body, size = 1,
            _source = ["Vector"])
            for doc in f_res['hits']['hits']:
                dict1 = doc['_source']
                t_vec = dict1['Vector']
            if len(t_vec) == 0:
                return jsonify({'result': 'No search results.'})
            else:

                res = es.search(index = database_r, size = view_r, _source = ['Title','Publisher', 'Public_date', 'URL'],
                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 = []
            url_list = []
            public_date_list = []

            for doc in res['hits']['hits']:
                dict1 = doc['_source']
                title_list.append(dict1['Title'])
                publisher_list.append(dict1['Publisher'])
                url_list.append(dict1['URL'])
                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], 'URL': url_list[i], 'Public_date': public_date_list[i]})
            if len(hit) == 0:
                return jsonify({'result': 'No search results.'})
            else:
                return jsonify(hit)