import traceback
import datetime
import json
import time
from odps import ODPS
from db_helper import RedisHelper
from utils import send_msg_to_feishu
from config import set_config
from log import Log

config_ = set_config()
log_ = Log()


def main(project, table):
    try:
        view_pv_sum = 0
        click_pv_sum = 0
        # 获取广告ad_idea_id对应的曝光次数和点击次数
        odps = ODPS(
            access_id=config_.ODPS_CONFIG['ACCESSID'],
            secret_access_key=config_.ODPS_CONFIG['ACCESSKEY'],
            project=project,
            endpoint=config_.ODPS_CONFIG['ENDPOINT'],
        )
        records = odps.read_table(name=table)
        ad_idea_data = []
        for item in records:
            ad_idea_id = item['ad_idea_id']
            view_pv = item['view_pv']
            click_pv = item['click_pv']
            if ad_idea_id is None or ad_idea_id == '':
                continue
            try:
                view_pv = int(view_pv)
            except:
                view_pv = 0
            try:
                click_pv = int(click_pv)
            except:
                click_pv = 0
            if view_pv < click_pv:
                continue
            param_alpha = click_pv
            param_beta = view_pv - click_pv
            ad_idea_data.append({'ad_idea_id': ad_idea_id, 'param': [param_alpha, param_beta]})
            view_pv_sum += view_pv
            click_pv_sum += click_pv
        log_.info(f"ad_idea_data count: {len(ad_idea_data)}")
        log_.info(f"ad_idea_data: {ad_idea_data}")
        # 更新redis
        redis_helper = RedisHelper()
        i = 0
        for ad_idea in ad_idea_data:
            try:
                key_name = f"{config_.THOMPSON_PARAM_KEY_PREFIX}{ad_idea['ad_idea_id']}"
                value = json.dumps(ad_idea['param'])
                redis_helper.set_data_to_redis(key_name=key_name, value=value, expire_time=24 * 3600)
                i += 1
            except:
                continue
        # 更新均值
        key_name = f"{config_.THOMPSON_PARAM_KEY_PREFIX}-1"
        click_pv_avg = click_pv_sum / len(ad_idea_data)
        view_pv_avg = view_pv_sum / len(ad_idea_data)
        param1 = int(click_pv_avg * 1.2)
        param2 = int(view_pv_avg) - int(click_pv_avg)
        value = json.dumps([param1, param2])
        redis_helper.set_data_to_redis(key_name=key_name, value=value, expire_time=24 * 3600)
        i += 1
        log_.info(f"to redis count: {i}")
        log_.info(f"mean: {value}")
    except Exception as e:
        log_.error(f"广告Thompson参数更新失败, exception: {e}, traceback: {traceback.format_exc()}")
        send_msg_to_feishu(
            webhook=config_.FEISHU_ROBOT['server_robot'].get('webhook'),
            key_word=config_.FEISHU_ROBOT['server_robot'].get('key_word'),
            msg_text=f"rov-offline{config_.ENV_TEXT} - 广告Thompson参数更新失败\n"
                     f"exception: {e}\n"
                     f"traceback: {traceback.format_exc()}"
        )


if __name__ == '__main__':
    project = 'loghubods'
    table = 'ad_own_data_vc'
    now_date = datetime.datetime.today()
    dt = datetime.datetime.strftime(now_date, '%Y%m%d %H:%M:%S')
    log_.info(f"dt: {dt}")
    start_time = time.time()
    main(project=project, table=table)
    log_.info(f"excuteTime: {(time.time() - start_time) * 1000}ms")