errors = {}

define = (code, message)-> errors[code] = message

define 'UsernamePasswordRequired', "请填写用户名密码"
define 'TruenameRequired', "请填写真实姓名"

define "StaffRequired", "需要员工身份"
define "UserIsStaffAlready", "重复添加！用户已是员工。"

define 'SaleableCountLessThanRequest', "库存不足"
define 'OrderNotFound', "订单不存在"
define 'InvalidOrderStateForConfirm', "订单状态异常"
define 'InvalidOrderStateForCancel', "订单状态异常"
define 'NotHisOrder', "你不能操作该订单"
define 'InvalidOrderStateForPay', "支付：订单状态异常"
define 'NoRightToCancelOrder', "权限不够"
define 'BadStepToCancelOrder', "抱歉！该订单目前不能取消。需要帮助请联系客服。"
define 'BadStepToSend', "订单状态不允许发货"
define 'OrderLineQuantityTooLarge', "购买数量超过限制"
define 'BadOrderQuantity', "购买数量错误"


define "BadStepToReturnOrder", "订单状态不允许退货"
define "BadStepToConfirmReturn", "订单状态错误"

define "ReturnReasonRequired", "请填写退货原因"
define "ReturnPhoneRequired", "请填写联系电话"
define "ReturnOrderNotFound", "退单不存在"

define "RepairReasonRequired", "请填写维修原因"
define "RepairPhoneRequired", "请填写联系电话"

define "BadStepToRepairOrder", "订单状态不允许维修"
define "RepairOrderNotFound", "维修单不存在"

define 'OrderConcurrentModifiedException', "操作过期，请重试"
define "ModelNotFound", "商品找不到"
define "ItemNotFound", "商品找不到"

define "IdConflict", "唯一标示/编号重复！请修改再试"

define "BadApp", "应用身份未通过验证"

define "BadPayWay", "不支持此支付方式"
define "ChangePayTranState", "支付状态修改违法"
define "PayCallbackAmountNotMatch", "支付金额不正确"

define "BadQuanType", "优惠券类型无效"
define "QuanNotSell", "不可销售: 已过销售期或活动已下架"

define "BadChouJiangType", "抽奖类型无效"
define "ChouJiangNotSell", "不可销售: 已过销售期或活动已下架"
define "ChouJiangCountOver", "购买次数超过限制"

define "QuanNotFound", "指定优惠券不存在"
define "QuanCannotUsed", "此优惠券无法使用"
define "QuanNotHis", "优惠券所有者错误"
define "QuanOutDate", "优惠券过期"
define "QuanConcurrentModifiedException", "操作过期无效"

define "InternalError", "服务器出错！"

class MyError extends Error
    constructor: (@code, message)->
        @message = errors[@code] || message
        super @message
    describe: ->
        {code: @code, message: @message, defaultMessage: @message}

class UserError extends MyError
    constructor: (@code, message)->
        super @code, message

class SystemError extends MyError
    constructor: (@code, message)->
        super @code, message
        this.stack = (new Error()).stack

exports.UserError = UserError
exports.SystemError = SystemError