import json
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


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():
    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('result: {}'.format(result))
            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('result: {}'.format(result))
            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():
    try:
        request_data = json.loads(request.get_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()
        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')
        datas = eval(datas)

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

        result = {'code': 200, 'message': '', 'data':{'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()