import json
import time
import traceback
from gevent import monkey
monkey.patch_all()

from flask import Flask, request
from log import Log
from config import set_config
from words_func import get_words, update_wechat_score_data, get_today_words
from update_common_words import add_words2mysql

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


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


# 获取热点词库中的所有词
@app.route('/hot/word/getAllWords', methods=['GET', 'POST'])
def get_all_words():
    try:
        start_time = time.time()
        request_data = json.loads(request.get_data())
        page_num = request_data.get('pageNum', 1)
        page_size = request_data.get('pageSize', 100)
        words = get_words(page_num=page_num, page_size=page_size)
        result = {'code': 200, 'message': 'success', 'data': {'words': words}}
        log_message = {
            'requestUri': '/hot/word/getAllWords',
            'logTimestamp': int(time.time() * 1000),
            'result': result,
            'executeTime': (time.time() - start_time) * 1000
        }
        log_.info(log_message)
        return json.dumps(result)
    except Exception as e:
        log_.error(traceback.format_exc())
        result = {'code': -1, 'message': 'fail'}
        return json.dumps(result)


# 更新热点词的微信指数
@app.route('/hot/word/updateWechatScore', methods=['GET', 'POST'])
def update_wechat_score():
    try:
        start_time = time.time()
        request_data = json.loads(request.get_data())
        data = request_data.get('data', None)
        update_wechat_score_data(data=data)
        result = {'code': 200, 'message': 'success'}
        log_.info(f"executeTime = {(time.time() - start_time) * 1000}")
        return json.dumps(result)
    except Exception as e:
        log_.error(traceback.format_exc())
        result = {'code': -1, 'message': 'fail'}
        return json.dumps(result)


# 更新飞书指定表格中的数据到热点词库
@app.route('/hot/word/updateWords', methods=['GET', 'POST'])
def update_words():
    try:
        start_time = time.time()
        request_data = json.loads(request.get_data())
        sheet_name = request_data.get('sheet_name')
        source = request_data.get('source')
        if sheet_name is not None and source is not None:
            add_words2mysql(sheet_name=sheet_name, source=source)
            result = {'code': 200, 'message': 'success'}
        else:
            log_.error(f"sheet_name = {sheet_name}, source = {source}")
            result = {'code': -1, 'message': 'fail'}
        log_message = {
            'requestUri': '/hot/word/updateWords',
            'logTimestamp': int(time.time() * 1000),
            'result': result,
            'executeTime': (time.time() - start_time) * 1000
        }
        log_.info(log_message)
        return json.dumps(result)
    except Exception as e:
        log_.error(traceback.format_exc())
        result = {'code': -1, 'message': 'fail'}
        return json.dumps(result)


# 获取热点词库中当天更新的所有热词
@app.route('/hot/word/getTodayWords', methods=['GET', 'POST'])
def get_today_all_words():
    try:
        start_time = time.time()
        request_data = json.loads(request.get_data())
        page_num = request_data.get('pageNum', 1)
        page_size = request_data.get('pageSize', 100)
        words = get_today_words(page_num=page_num, page_size=page_size)
        result = {'code': 200, 'message': 'success', 'data': {'words': words}}
        log_message = {
            'requestUri': '/hot/word/getTodayWords',
            'logTimestamp': int(time.time() * 1000),
            'result': result,
            'executeTime': (time.time() - start_time) * 1000
        }
        log_.info(log_message)
        return json.dumps(result)
    except Exception as e:
        log_.error(traceback.format_exc())
        result = {'code': -1, 'message': 'fail'}
        return json.dumps(result)


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