import datetime
from config import set_config
from utils import RedisHelper, send_msg_to_feishu
from log import Log

config_, _ = set_config()
log_ = Log()
redis_helper = RedisHelper()

region_code = config_.REGION_CODE


def rov_data_monitor(now_date, now_h):
    """rov模型预测列表"""
    if now_h > 6:
        rov_key_name = f"{config_.RECALL_KEY_NAME_PREFIX}{now_date}"
        if not redis_helper.key_exists(key_name=rov_key_name):
            msg_text = f"\n- 所属项目: rov-server/rov-offline" \
                       f"\n- 告警名称: 离线更新数据未按时更新告警" \
                       f"\n- 所属环境: {config_.ENV_TEXT}" \
                       f"\n- now_date: {now_date}" \
                       f"\n- now_h: {now_h}" \
                       f"\n- 告警描述: rov模型预测列表数据未按时更新"
            log_.info(f"msg_text = {msg_text}")
            send_msg_to_feishu(
                webhook=config_.FEISHU_ROBOT['server_robot'].get('webhook'),
                key_word=config_.FEISHU_ROBOT['server_robot'].get('key_word'),
                msg_text=msg_text
            )


def region_data_monitor(now_date, now_h, rule_params, key_prefix_dict):
    """地域分组数据"""
    region_code_list = [code for region, code in region_code.items()] +\
                       [code for city, code in config_.CITY_CODE.items()]
    # print(region_code_list)
    for param in rule_params.get('params_list'):
        data_key = param.get('data')
        rule_key = param.get('rule')
        for key_con, key_prefix in key_prefix_dict.items():
            # if key_con == '不区分地域相对24h筛选后剩余去重后数据' and rule_key != 'rule4':
            #     continue
            no_update_region_list = []
            for region in region_code_list:
                region_key_name = f"{key_prefix}{region}:{data_key}:{rule_key}:{now_date}:{now_h}"
                if not redis_helper.key_exists(key_name=region_key_name):
                    no_update_region_list.append(region)
            if len(no_update_region_list) == len(region_code_list):
                msg_text = f"\n- 所属项目: rov-server/rov-offline" \
                           f"\n- 告警名称: 离线更新数据未按时更新告警" \
                           f"\n- 所属环境: {config_.ENV_TEXT}" \
                           f"\n- now_date: {now_date}" \
                           f"\n- now_h: {now_h}" \
                           f"\n- 告警描述: {key_con}未按时更新, data_key={data_key}, rule_key={rule_key}"
                log_.info(f"msg_text = {msg_text}")
                send_msg_to_feishu(
                    webhook=config_.FEISHU_ROBOT['server_robot'].get('webhook'),
                    key_word=config_.FEISHU_ROBOT['server_robot'].get('key_word'),
                    msg_text=msg_text
                )


def special_videos_monitor(now_date, now_h):
    """特殊mid(屏蔽名单)指定视频列表"""
    if now_h > 4:
        rov_key_name = f"{config_.KEY_NAME_PREFIX_SPECIAL_VIDEOS}{now_date}"
        if not redis_helper.key_exists(key_name=rov_key_name):
            msg_text = f"\n- 所属项目: rov-server/rov-offline" \
                       f"\n- 告警名称: 离线更新数据未按时更新告警" \
                       f"\n- 所属环境: {config_.ENV_TEXT}" \
                       f"\n- now_date: {now_date}" \
                       f"\n- now_h: {now_h}" \
                       f"\n- 告警描述: 特殊mid(屏蔽名单)指定视频列表数据未按时更新"
            log_.info(f"msg_text = {msg_text}")
            send_msg_to_feishu(
                webhook=config_.FEISHU_ROBOT['server_robot'].get('webhook'),
                key_word=config_.FEISHU_ROBOT['server_robot'].get('key_word'),
                msg_text=msg_text
            )


def whole_movies_monitor(now_date, now_h):
    """完整影视资源列表"""
    rov_key_name = f"{config_.RECALL_KEY_NAME_PREFIX_WHOLE_MOVIES}{now_date}.{now_h}"
    if not redis_helper.key_exists(key_name=rov_key_name):
        msg_text = f"\n- 所属项目: rov-server/rov-offline" \
                   f"\n- 告警名称: 离线更新数据未按时更新告警" \
                   f"\n- 所属环境: {config_.ENV_TEXT}" \
                   f"\n- now_date: {now_date}" \
                   f"\n- now_h: {now_h}" \
                   f"\n- 告警描述: 完整影视资源列表数据未按时更新"
        log_.info(f"msg_text = {msg_text}")
        send_msg_to_feishu(
            webhook=config_.FEISHU_ROBOT['server_robot'].get('webhook'),
            key_word=config_.FEISHU_ROBOT['server_robot'].get('key_word'),
            msg_text=msg_text
        )


def get_redis_data_keys(now_date, now_h):
    # 检查所需列表是否已更新好
    redis_data_keys = []
    # rov模型预测列表
    if now_h > 6:
        rov_key_name = f"{config_.RECALL_KEY_NAME_PREFIX}{now_date}"
        redis_data_keys.append(rov_key_name)
    # 地域分组小时级列表
    rule_params = config_.RULE_PARAMS_REGION_APP_TYPE
    key_prefix_list = [
        config_.RECALL_KEY_NAME_PREFIX_REGION_BY_H,
        config_.RECALL_KEY_NAME_PREFIX_DUP1_REGION_24H_H,
        config_.RECALL_KEY_NAME_PREFIX_DUP2_REGION_24H_H,
        config_.RECALL_KEY_NAME_PREFIX_DUP_REGION_H
    ]
    region_code_list = [code for region, code in region_code.items()]
    for app_type, params in rule_params.items():
        for data_key, data_param in params['data_params'].items():
            for rule_key, rule_param in params['rule_params'].items():
                for region in region_code_list:
                    if region == '-1':
                        region_key_name = [f"{key_prefix_list[-1]}{region}.{app_type}.{data_key}.{rule_key}.{now_date}.{now_h}"]
                    else:
                        region_key_name = [f"{key_prefix}{region}.{app_type}.{data_key}.{rule_key}.{now_date}.{now_h}"
                                           for key_prefix in key_prefix_list]
                    redis_data_keys.extend(region_key_name)

    return redis_data_keys


def monitor(now_date, now_h):
    # rov_data_monitor(now_date=now_date, now_h=now_h)
    key_prefix_dict_24h = {
        '地域分组小时级数据': config_.RECALL_KEY_NAME_PREFIX_REGION_BY_H,
        '地域分组相对24h去重后数据': config_.RECALL_KEY_NAME_PREFIX_DUP1_REGION_24H_H,
        '不区分地域相对24h去重后数据': config_.RECALL_KEY_NAME_PREFIX_DUP2_REGION_24H_H,
        '不区分地域相对24h筛选后剩余去重后数据': config_.RECALL_KEY_NAME_PREFIX_DUP3_REGION_24H_H,
        # 'rov模型预测列表去重后数据': config_.RECALL_KEY_NAME_PREFIX_DUP_REGION_H,
    }
    region_data_monitor(now_date=now_date, now_h=now_h, rule_params=config_.RULE_PARAMS_REGION_APP_TYPE,
                        key_prefix_dict=key_prefix_dict_24h)
    # key_prefix_dict_48h = {
    #     '地域分组小时级数据': config_.RECALL_KEY_NAME_PREFIX_REGION_BY_H,
    #     '地域分组相对24h去重后数据': config_.RECALL_KEY_NAME_PREFIX_DUP1_REGION_24H_H,
    #     '不区分地域相对48h去重后数据': config_.RECALL_KEY_NAME_PREFIX_DUP2_REGION_48H_H,
    #     '不区分地域相对48h筛选后剩余去重后数据': config_.RECALL_KEY_NAME_PREFIX_DUP3_REGION_48H_H,
    #     'rov模型预测列表去重后数据': config_.RECALL_KEY_NAME_PREFIX_DUP_REGION_H,
    # }
    # region_data_monitor(now_date=now_date, now_h=now_h, rule_params=config_.RULE_PARAMS_REGION_APP_TYPE_48H,
    #                     key_prefix_dict=key_prefix_dict_48h)
    special_videos_monitor(now_date=now_date, now_h=now_h)
    # whole_movies_monitor(now_date=now_date, now_h=now_h)


if __name__ == '__main__':
    now_date = datetime.datetime.today().strftime('%Y%m%d')
    now_h = datetime.datetime.now().hour
    log_.info(f"now_date = {now_date}, now_h = {now_h}")
    monitor(now_date=now_date, now_h=now_h)
    log_.info("end!")