import json
import time

from flask import Flask, request
from log import Log
from config import set_config
from recommend import video_recommend
from category import get_category_videos
from video_recall import PoolRecall
from db_helper import RedisHelper
import traceback
import ast

app = Flask(__name__)
log_ = Log()
config_ = set_config()


@app.route('/healthcheck')
def health_check():
    return 'ok!'


# 首页推荐及tab分类
@app.route('/applet/video/homepage/recommend', methods=['GET', 'POST'])
def homepage_recommend():
    start_time = time.time()
    try:
        request_data = json.loads(request.get_data())
        mid = request_data.get('mid')
        uid = request_data.get('uid')
        category_id = request_data.get('categoryId')
        size = request_data.get('size')
        app_type = request_data.get('appType')
        algo_type = request_data.get('algoType')
        log_.info('request data: {}'.format(request_data))
        # size默认为10
        if not size:
            size = 10
        if category_id in config_.CATEGORY['recommend']:
            # 推荐
            videos = video_recommend(mid=mid, uid=uid, size=size, app_type=app_type, algo_type=algo_type)
            result = {'code': 200, 'message': 'success', 'data': {'videos': videos}}
            log_.info('category_id: {}, mid: {}, uid: {}, result: {}, execute time = {}ms'.format(
                category_id, mid, uid, result, (time.time() - start_time)*1000))
            return json.dumps(result)
        elif category_id in config_.CATEGORY['other']:
            # 其他类别
            videos = get_category_videos()
            result = {'code': 200, 'message': 'success', 'data': {'videos': videos}}
            log_.info('category_id: {}, mid: {}, uid: {}, result: {}, execute time = {}ms'.format(
                category_id, mid, uid, result, (time.time() - start_time) * 1000))
            return json.dumps(result)
        else:
            log_.error('categoryId error, categoryId = {}'.format(category_id))
            result = {'code': -1, 'message': 'fail'}
            return json.dumps(result)

    except Exception as e:
        log_.error(e)
        result = {'code': -1, 'message': 'fail'}
        return json.dumps(result)


# 管理后台实时修改rov
@app.route('/applet/video/update/rov', methods=['GET', 'POST'])
def update_rov():
    result = {'code': 200, 'message': 'success'}
    log_.info('result: {}'.format(result))
    return json.dumps(result)
    # ##### 暂时关闭该接口
    # try:
    #     request_data = json.loads(request.get_data())
    #     log_.info('request data: {}'.format(request_data))
    #     app_type = request_data.get('appType')
    #     video_id = request_data.get('videoId')
    #     rov_score = request_data.get('rovScore')
    #     pool_recall = PoolRecall(app_type=app_type)
    #     rov_pool_key, _ = pool_recall.get_pool_redis_key('rov')
    #     redis_helper = RedisHelper()
    #     redis_helper.update_score_with_value(key_name=rov_pool_key, value=video_id, score=rov_score)
    #     result = {'code': 200, 'message': 'success'}
    #     log_.info('result: {}'.format(result))
    #     return json.dumps(result)
    # except Exception as e:
    #     log_.error(e)
    #     result = {'code': -1, 'message': 'fail'}
    #     return json.dumps(result)


# app热榜
@app.route('/app/video/hot_list', methods=['GET', 'POST'])
def app_video_hot_list():
    try:
        page_size= 10
        request_data = request.get_data()
        print(request_data)
        request_data = json.loads(request_data)
        page = request_data.get('page', 0)
        log_.info('request data: {}'.format(request_data))

        redis_helper = RedisHelper()
        datas = redis_helper.get_data_from_redis('app_video_hot_list')

        if datas is None or len(datas) == 0:
            result = {'code': -1, 'message': 'no data'}
            log_.info('result: {}'.format(result))
            return json.dumps(result)
        datas = ast.literal_eval(datas)
        total_page = int(len(datas)/page_size)
        if page > total_page -1 :
            result = {'code': -1, 'message': 'page exceed max'}
            log_.info('result: {}'.format(result))
            return json.dumps(result)

        result = {'code': 200, 'message': '', 'data':{'total_page':total_page, 'hot_list':datas[page*page_size:page*page_size+page_size]}}
        log_.info('result: {}'.format(result))
        return json.dumps(result)

    except Exception as e:
        log_.error(e)
        print(traceback.format_exc())
        result = {'code': -1, 'message': 'fail'}
        return json.dumps(result)


if __name__ == '__main__':
    app.run()