# -*- encoding: utf-8 -*-
# -----------------------------------------------------------------------------
# @File Name  : errorhandler.py
# @Time       : 2020/11/25 上午9:19
# @Author     : X. Peng
# @Email      : acepengxiong@163.com
# @Software   : PyCharm
# -----------------------------------------------------------------------------
import time

import requests
from flask import jsonify, make_response, request

from app.api.engine import config, env, redis
from app.config.errors import Errors
from app.api.engine import logging


class CustomFlaskErr(Exception):
    # 默认的返回码
    status_code = 200

    # 自己定义了一个 return_code,作为更细颗粒度的错误代码
    def __init__(self, return_code=None, status_code=None, payload=None):
        Exception.__init__(self)
        self.return_code = return_code
        if status_code is not None:
            self.status_code = status_code
        self.payload = payload

    # 构造要返回的错误代码和错误信息的 dict
    def to_dict(self):
        rv = dict(self.payload or ())

        # 增加 dict key: return code
        rv['statusCode'] = self.return_code

        # 增加 dict key: message, 具体内容由常量定义文件中通过 return_code 转化而来
        rv['message'] = Errors.MSG[self.return_code]

        return rv
def add_errorhandler(app):
    @app.errorhandler(CustomFlaskErr)
    def handle_flask_error(error):
        # response 的 json 内容为自定义错误代码和错误信息
        response = jsonify(error.to_dict())

        # response 返回 error 发生时定义的标准错误代码
        response.status_code = error.status_code

        return response

    @app.errorhandler(500)
    def handle_flask_error(error):
        # response 的 json 内容为自定义错误代码和错误信息
        response = jsonify({'statusCode': '9999', 'message': '服务器错误'})

        # response 返回 error 发生时定义的标准错误代码
        response.status_code = 200

        return response


    @app.before_request
    def before_request():
        # token鉴权
        token = request.headers.get('tampToken', '')
        url = config[env]['token_auth_url']
        if request.path in ['/tamp_order/micro_shop/topUpOrderNotify', '/tamp_order/micro_shop/consumeOrderNotify']:
            pass
        else:
                # requests.adapters.DEFAULT_RETRIES = 5  # 增加重连次数
                # s = requests.session()
                # s.keep_alive = False
                # res = s.get(url+'?tampToken='+token, timeout=2)
                # resp = res.json()
                # if resp['statusCode'] != "0000":
                # request.user_id = resp['attributes']
            user_id = redis.get('s:sid:'+token)
            if not user_id:
                logging.error('鉴权失败,token:'+token)
                raise CustomFlaskErr(Errors.TOKEN_INVALID)
            if isinstance(user_id, bytes):
                request.user_id = user_id.decode().replace('"', '')
            else:
                request.user_id = user_id.replace('"', '')
        request.return_success = {'statusCode': "0000", 'message': 'ok'}

    @app.after_request
    def after_request(response):
        return response