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

import logging
import traceback
import json
from libs.es import ESPerform


class UserUtils(object):
    @classmethod
    def get_attention_user_list(cls,user_id_list,self_user_id):
        """
        :remark 获取指定用户列表 关注的 用户列表
        :param user_id:
        :return:
        """
        try:
            q = dict()
            q["query"] = {
                "terms":{
                    "user_id":user_id_list
                }
            }
            q["_source"] = {
                "include":["attention_user_id_list","user_id"]
            }

            result_dict = ESPerform.get_search_results(ESPerform.get_cli(), "user", q, offset=0, size=len(user_id_list))

            self_attention_user_id_list = []
            recursion_attention_user_id_list = []
            for hit_item in result_dict["hits"]:
                if hit_item["_source"]["user_id"] == self_user_id:
                    self_attention_user_id_list = [item["user_id"] for item in hit_item["_source"]["attention_user_id_list"]]
                else:
                    recursion_attention_user_id_list = [item["user_id"] for item in hit_item["_source"]["attention_user_id_list"]]

            return (self_attention_user_id_list,recursion_attention_user_id_list)
        except:
            logging.error("catch exception,err_msg:%s" % traceback.format_exc())
            return ([],[])

    @classmethod
    def ___get_should_term_list(cls,ori_list,field_name="tag_list"):
        try:
            should_term_list = list()
            for term_id in ori_list:
                term_dict = {
                    "term":{
                        field_name:{"value":term_id}
                    }
                }
                should_term_list.append(term_dict)
            return should_term_list
        except:
            logging.error("catch exception,err_msg:%s" % traceback.format_exc())
            return []

    @classmethod
    def get_recommend_user_list(cls,self_attention_user_id_list,recursion_attention_user_id_list,offset,size):
        """
        :remark 获取推荐用户列表
        :param attention_user_id_list:
        :param recursion_attention_user_id_list:
        :return:
        """
        try:
            q = dict()
            q["query"] = dict()

            recursion_attention_user_list = cls.___get_should_term_list(recursion_attention_user_id_list,field_name="user_id")

            functions_list = [
                {
                    "filter":{
                        "bool":{
                            "should":recursion_attention_user_list
                        }
                    },
                    "weight":10
                },
                {
                    "gauss": {
                        "latest_topic_time_val": {
                            "scale": "600",
                            "decay": 0.1
                        }
                    }
                }
            ]
            query_function_score = {
                "query": {
                    "bool": {
                        "should": [
                            {"term": {"is_recommend": True}},
                            {"term": {"is_online": True}},
                        ],
                        "minimum_should_match":2,
                        "must_not":{
                            "terms":{
                                "user_id":self_attention_user_id_list
                            }
                        }
                    }
                },
                "score_mode": "sum",
                "boost_mode": "sum",
                "functions": functions_list
            }
            q["query"]["function_score"] = query_function_score
            q["_source"] = {
                "include":["user_id"]
            }
            result_dict = ESPerform.get_search_results(ESPerform.get_cli(), sub_index_name="user", query_body=q,
                                                       offset=offset, size=size)

            recommend_user_list = list()
            for item in result_dict["hits"]:
                recommend_user_list.append(item["_source"]["user_id"])

            return recommend_user_list
        except:
            logging.error("catch exception,err_msg:%s" % traceback.format_exc())
            return []