import os
from distutils.util import strtobool

IS_DEBUG = strtobool(os.environ.get('IS_DEBUG', 'false'))

class VQLError(Exception):
    def __init__(self, code, msg=None, detail=''):
        """
        :param code: Error code
        :param msg: Error message, for system display.
        :param detail: Error detail, for debugging.
        - 500: "未知的错误",
        - 501: "图片错误：无法读取",
        - 502: "图片错误：图片损坏",
        - 503: "图片错误：无法获取",
        - 504: "图片错误：无法识别",
        - 505: "图片错误：不存在的key",
        - 506: "图片错误：无法连接数据库",
        - 511: "算子错误：算子处理失败",
        - 512: "算子错误：显存不足",
        - 513: "算子错误：模型不匹配",
        - 514: "算子错误：未找到模型文件",
        - 515: "算子错误：超过重试次数，无法访问地址",
        - 516: "算子错误：不存在的地址",
        - 517: "算子错误：错误的请求格式",
        - 518: "算子错误：非法的算子地址",
        - 550: "IBase错误",
        - 560: "使用错误：过多的请求数据，请减少每个请求中的图片数",
        - 561: "内存错误：shared memory错误",
        - 562: "使用错误: 图片分辨率超出设置范围",
        - 570: "回调错误：处理结果回调失败",
        - 600: "低代码程序错误",
        - 601: "低代码程序错误：程序超时",
        - 602: "低代码程序错误：非法操作",
        - 603: "低代码程序错误：重复定义的变量",
        - 604: "低代码程序错误：代码错误",
        - 700: "鉴权失败: 缺少鉴权信息",
        - 701: "鉴权失败: 无权调用",
        - 702: "鉴权失败: 无法获取",
        - 703: "鉴权失败: 非法鉴权码",
        - 999: "自定义错误"
        """
        
        code2msg = {
            500: "未知的错误",
            501: "图片错误：无法读取",  # 图片文件无法读取
            502: "图片错误：图片损坏",  # 图片文件损坏
            503: "图片错误：无法获取",  # 图片获取失败
            504: "图片错误：无法识别",  # 图片文件不支持
            505: "图片错误：不存在的key",  # Redis模式获取数据时key不存在
            506: "图片错误：无法连接数据库",  # Redis模式获取数据时,无法连接Redis
            511: "算子错误：算子处理失败",  # 不明原因的Atom报错
            512: "算子错误：显存不足",
            513: "算子错误：模型不匹配",
            514: "算子错误：未找到模型文件",
            515: "算子错误：超过重试次数，无法访问地址",  # API的URL或端口错误，无法访问
            516: "算子错误：错误的地址",  # API的路由地址错误
            517: "算子错误：错误的请求格式",  # 入参格式错误
            518: "算子错误：非法的算子地址",  # atom的api地址格式错误
            550: "IBase错误",  # R2Base 错误
            560: "使用错误：过多的请求数据，请减少每个请求中的图片数",  # 请求中的图片数量必须小于共享内存的shard数
            561: "内存错误：shared memory错误",
            562: "使用错误: 图片分辨率超出设置范围",
            570: "回调错误：处理结果回调失败",  # 算法处理结果回调时发生错误
            600: "低代码程序错误：未知错误",  # 低代码模块程序出现错误
            601: "低代码程序错误：程序超时",
            602: "低代码程序错误：非法操作",  # 代码段中包含不允许的操作
            603: "低代码程序错误：重复定义的变量",  # 代码中的自定义变量名已经被使用
            604: "低代码程序错误：代码错误",  # 代码块报错
            700: "鉴权失败: 缺少鉴权信息",  # 缺少鉴权字段
            701: "鉴权失败: 无权调用",  # 鉴权显示无权限调用
            702: "鉴权失败: 无法获取",  # 访问鉴权地址失败
            703: "鉴权失败: 非法鉴权码",  # 鉴权url解密失败
            
            999: "自定义错误"
        }

        self.code = code
        self.detail = detail
        if msg:
            self.msg = msg
        else:
            self.msg = code2msg[code]

    def __str__(self):
        if IS_DEBUG:
            return repr('Code: {}\nmessage: {}\ndetail:{}'.format(self.code, self.msg, self.detail))
        else:
            return repr('[Code {}] {}'.format(self.code, self.msg))
