import simplejson as json
import traceback
from datetime import date
from concurrent.futures import ThreadPoolExecutor
from tornado.web import RequestHandler
from model.log import logger
from model.common import errors
log = logger()
from model.DateUtils import DateUtils

class BaseHandler(RequestHandler,DateUtils):
    def __init__(self, application, request, **kwargs):
        RequestHandler.__init__(self, application, request, **kwargs)
        self._status_code = 200
        self.executor = ThreadPoolExecutor(200)
        self.set_default_headers()

    def options(self):
        # 返回方法1
        self.set_status(200)
        self.finish()

    def set_default_headers(self):
        super().set_default_headers()
        # 设置允许的请求头
        self.set_header("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE,OPTIONS")
        self.set_header("X-XSS-Protecion", "1")
        self.set_header("Content-Security-Policy", "default-src 'self'")
        self.set_header("Access-Control-Allow-Credentials", "true")
        # 设置一些自己定义的请求头
        self.set_header("Access-Control-Allow-Headers",
                        "Content-Type, Depth, User-Agent, Token, Origin, X-Requested-With, Accept, Authorization")
        self.set_header("Content-Type", "application/json; charset=UTF-8")
        self.set_header("Access-Control-Allow-Origin","*")


    def write_json(self, data, status_code=200, msg='success',total=1):
        self.write(json.dumps({'status': {'msg': msg, "RetCode": status_code},'total':total,'data': data}))




    def get_args(self):
        di=json.loads(self.request.body.decode())
        if isinstance(di,str):
            di=json.loads(di)
        return di

    def write_error(self, status_code, msg=None, **kwargs):

        if self.settings.get("serve_traceback") and "exc_info" in kwargs:
            # in debug mode, try to send a traceback
            lines = []
            for line in traceback.format_exception(*kwargs["exc_info"]):
                lines.append(line)

            self.write_json(dict(traceback=''.join(lines)), status_code, self._reason)

        elif msg:
            self.write_json(None, status_code, msg)
        else:
            self.write_json(None, status_code, self._reason)

    def _authentication(self):
        """
        :return: True, 认证通过, False 认证不通过
        """
        return True
        log.info("author %s" % self.request.headers)
        # log.info(self.request.remote_ip)
        if self.request.headers.get("Gip_real") == '183.129.168.74':
            return True

        if not self.request.headers.get("Authorization"):

            return False
        else:
            # redis 中判断值是否存在
            # ur = UserRedisComm()
            # key = "admin_account_check%s" % (self.request.headers.get("Authorization"))
            # return True if ur.r.get(key) else False
            return True