#!/usr/bin/env python
# -*- coding: utf-8 -*-

from __future__ import unicode_literals, absolute_import, print_function
from gm_rpcd.all import bind
import logging
import traceback
import json
from search.utils.topic import TopicUtils
from libs.es import ESPerform
from libs.cache import redis_client
from search.utils.common import *


def get_highlight(fields=[]):
    field_highlight = {
        'fields': {k: {} for k in fields},
        'pre_tags': ['<%s>' % 'ems'],
        'post_tags': ['</%s>' % 'ems'],
    }
    return field_highlight


@bind("physical/search/query_tag")
def query_tag(query,offset,size):
    try:
        """
        q = {
            "query":{
                "bool":{
                    "must":[
                        {"term":{"is_online":True}},
                        {"term": {"is_deleted": False}}
                    ],
                    "should":[
                        {"multi_match":{
                            "query": query,
                            "fields":["name"],
                            "operator":"and"}}
                    ],
                    "minimum_should_match":1
                }
            },
            "sort":[
                {"near_new_topic_num":{"order":"desc"}},
                {'_score': {"order": "desc"}}
            ],
            "_source": {
                "includes": ["id", "name"]
            }
        }
        q["highlight"] = get_highlight(["name"])            
        """

        q = {
            "suggest":{
                    "tips-suggest":{
                            "prefix":query,
                            "completion":{
                                "field":"suggest",
                                "contexts":{
                                    "is_online": [True],
                                    "is_deleted": [False]
                                }
                            }
                    }
            },
            "sort": [
                {"near_new_topic_num": {"order": "desc"}}
            ],
            "_source": {
                "include": ["id", "name", "is_deleted", "is_online"]
            }
        }

        ret_list = list()

        result_dict = ESPerform.get_search_results(ESPerform.get_cli(),sub_index_name="tag",query_body=q,offset=offset,size=size,is_suggest_request=True)
        for tips_item in result_dict["suggest"]["tips-suggest"]:
            for hit_item in tips_item["options"]:
                #if len(hit_item["contexts"])==2:
                if hit_item["_source"]["is_deleted"]==False and hit_item["_source"]["is_online"]==True:
                    hitLight = u'<ems>%s</ems>' % query
                    hit_item["_source"]["highlight"] = hit_item["_source"]["name"].replace(query,hitLight)
                    ret_list.append(hit_item["_source"])

        return {"tag_list": ret_list}
    except:
        logging.error("catch exception,err_msg:%s" % traceback.format_exc())
        return {"tag_list": []}


@bind("physical/search/query_by_tag_type")
def query_by_tag_type(tag_type_id,offset,size):
    try:
        q = {
            "query":{
                "bool":{
                    "must":[
                        {"term":{"is_online":True}},
                        {"term": {"is_deleted": False}}
                    ],
                    "filter":{"term":{"tag_type": tag_type_id}}
                }
            },
            "sort":[
                {"near_new_topic_num":{"order":"desc"}}
            ],
            "_source": {
                "includes": ["id", "name"]
            }
        }

        ret_list = list()
        result_dict = ESPerform.get_search_results(ESPerform.get_cli(),sub_index_name="tag",query_body=q,offset=offset,size=size)
        for hit_item in result_dict["hits"]:
            ret_list.append(hit_item["_source"])

        return {"tag_list": ret_list}
    except:
        logging.error("catch exception,err_msg:%s" % traceback.format_exc())
        return {"tag_list": []}