# -*- 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鉴权
        # 安卓,ios取token
        token = ''
        if request.headers.get('env') in ['ios', 'android']:
            token = request.headers.get('tampToken', '')
        elif request.headers.get('env') in ['wechat', 'xcx']:
            token = request.cookies.get('qimsession', '')
        if request.path in ['/tamp_order/micro_shop/topUpOrderNotify', '/tamp_order/micro_shop/consumeOrderNotify']:
            pass
        else:
            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):
        response.headers['Access-Control-Allow-Origin'] = '*'
        response.headers['Access-Control-Allow-Methods'] = 'PUT,GET,POST,DELETE,OPTIONS'
        response.headers['Access-Control-Allow-Headers'] = (
                "Content-Type,Referer,Accept,Origin,User-Agent"
                "field,Cache-Control,X-Requested-With"
            )
        return response