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 = config_.RULE_PARAMS_REGION_APP_TYPE
    key_prefix_dict = {
        '地域分组小时级数据': 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,
        'rov模型预测列表去重后数据': 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 key_con, key_prefix in key_prefix_dict.items():
                    no_update_region_list = []
                    for region in region_code_list:
                        region_key_name = f"{key_prefix}{region}.{app_type}.{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- appType: {app_type}" \
                                   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)
    region_data_monitor(now_date=now_date, now_h=now_h)
    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!")