import json
import logging
import datetime
from libs.cache import redis_client
from libs.error import logging_exception
from django.conf import settings
from trans2es.models.portrait_stat import LikeTopicStat

try:
    ps = redis_client.pubsub()
    ps.subscribe("new_topic_impression")
    all_new_topic_impression_count_key = "all_new_topic_impression_count_key"
    for item in ps.listen():
        if item['type'] == 'message':
            new_topic_ids = json.loads(item["data"])
            all_new_topic_impression_count = json.loads(redis_client.get(all_new_topic_impression_count_key))
            insert_topic_ids = []
            for topic in new_topic_ids:
                topic = str(topic)
                if topic in all_new_topic_impression_count:
                    all_new_topic_impression_count[topic] = all_new_topic_impression_count[topic] + 1
                    if all_new_topic_impression_count[topic] > 100:
                        insert_topic_ids.append(int(topic))
                        all_new_topic_impression_count.pop(topic)
                else:
                    all_new_topic_impression_count[topic] = 1
            if insert_topic_ids:
                insert_list = []
                for topic in insert_topic_ids:
                    insert_list.append(
                        LikeTopicStat(create_time=datetime.datetime.today(), update_time=datetime.datetime.today(),
                                          topic_id=topic, is_new_topic=0, topic_ctr_30=0.0, like_rate_30=0.0))
                LikeTopicStat.objects.using(settings.MASTER_DB_NAME).bulk_create(insert_list)
                logging.info("impressions count gt 100 topic ids" + str(insert_topic_ids))
            json_all_new_topic_impression_count = json.dumps(all_new_topic_impression_count)
            logging.info("all_new_topic_impression_count" + str(all_new_topic_impression_count))
            redis_client.set(all_new_topic_impression_count_key, json_all_new_topic_impression_count)
except:
    logging_exception()
    logging.error("redis new topic sub error!")