import requests
import json
import time

from db_helper import HologresHelper, RedisHelper
from config import set_config
from log import Log

config_ = set_config()
log_ = Log()


def request_post(request_url, request_data):
    """
    post 请求 HTTP接口
    :param request_url: 接口URL
    :param request_data: 请求参数
    :return: res_data json格式
    """
    response = requests.post(url=request_url, json=request_data)
    if response.status_code == 200:
        res_data = json.loads(response.text)
        return res_data


def filter_by_pseudo_exposure(app_type, mid, video_ids):
    """
    伪曝光过滤
    :param app_type: 产品标识 type-int
    :param mid: 设备id type-string
    :param video_ids: 需过滤的视频列表 type-list
    :return: filtered_videos  过滤后的列表  type-list
    """
    # 根据Redis缓存中的数据过滤
    redis_helper = RedisHelper()
    # key拼接
    key_name = '{}.{}.{}'.format(config_.PSEUDO_EXPOSURE_KEY_PREFIX, app_type, mid)
    pe_videos_list = redis_helper.get_data_from_set(key_name)
    if not pe_videos_list:
        return video_ids
    pe_videos = [eval(video) for video in pe_videos_list]
    filtered_videos = [video_id for video_id in video_ids if video_id not in pe_videos]
    return filtered_videos


def filter_video_status(video_ids):
    """
    对视频状态进行过滤
    :param video_ids: 视频id列表 type-list
    :return: filtered_videos
    """
    st = time.time()
    sql = "SELECT  video_id" \
          "FROM    {}" \
          "WHERE   audit_status = 5" \
          "AND     applet_rec_status IN (1, 6)" \
          "-- AND     open_status = 1" \
          "-- AND     payment_status = 0" \
          "-- AND     encryption_status != 5" \
          "-- AND     transcoding_status = 3" \
          "AND     video_id IN {};".format(config_.VIDEO_STATUS, tuple(video_ids))
    hologres_helper = HologresHelper()
    data = hologres_helper.get_data(sql=sql)
    filtered_videos = [temp[0] for temp in data]
    et = time.time()
    log_.info('filter video status finished! filtered_videos = {}, execute time = {}ms'.format(
        filtered_videos, (et - st)*1000))


def filter_video_viewed(app_type, mid, uid, video_ids, types=(1,)):
    """
    调用后端接口过滤用户已观看视频
    :param app_type: 产品标识 type-int
    :param mid: mid type-string
    :param uid: uid type-string
    :param video_ids: 视频id列表 type-list
    :param types: 过滤参数 type-tuple, 默认(1, )  1-已观看 2-视频状态 3-是否进入老年人社区 4-话题状态 5-推荐状态
    :return: filtered_videos
    """
    # 调用http接口
    request_data = {"appType": app_type,
                    "mid": mid,
                    "uid": uid,
                    "types": list(types),
                    "videoIds": video_ids}
    result = request_post(request_url=config_.VIDEO_FILTER_URL, request_data=request_data)
    if result['code'] != 0:
        log_.info('过滤失败,types: {}'.format(types))
        return video_ids
    filtered_videos = result['data']
    return filtered_videos


if __name__ == '__main__':
    filter_video_status([1, 2, 3, 5978661])