package basic

// StatusResponse 公司自定义状态码
type StatusResponse struct {
	Code    int    // 状态码
	Message string // 状态码相关解析
}

var (
	CodeOK         = &StatusResponse{200, "success"}            // 成功
	CodeApiErr     = &StatusResponse{500, "api error"}          // API错误
	CodeSaveErr    = &StatusResponse{501, "failed to save"}     // 保存失败
	CodeServiceErr = &StatusResponse{510, "server logic error"} // 服务逻辑错误
	CodeUnAuth     = &StatusResponse{401, "unauthorized"}       // 未授权

	CodeEmailNotFoundErr  = &StatusResponse{5050, "email not found"}  // 未找到email
	CodeUserIdNotFoundErr = &StatusResponse{5051, "user not found"}   // 未找到用户
	CodePasswordErr       = &StatusResponse{5052, "invalid password"} // 无效密码

	CodeSafeValueRangeErr = &StatusResponse{5040, "value not in range"}    // 值不在范围内
	CodeTemplateErr       = &StatusResponse{5040, "template parsed error"} // 模板解析错误

	CodeOrderNotFoundErr      = &StatusResponse{5030, "order not found"}                   //未找到订单
	CodeCloudOrderNotFoundErr = &StatusResponse{5031, "cloud order not found"}             //未找到云仓订单
	CodeOrderNotCancelledErr  = &StatusResponse{5032, "current order cannot be cancelled"} // 当前订单无法取消

	CodePayNotFoundErr = &StatusResponse{5020, "pay info not found"}      // 支付信息无法查询
	CodePayCancelOk    = &StatusResponse{5021, "cancellation successful"} // 支付取消成功
	CodePayCancelNotOk = &StatusResponse{5022, "cancellation failed"}     // 支付取消失败

	CodeGuestDupErr = &StatusResponse{5010, "user is already guest and does not need to reapply"} // 用户已经是访客用户,无需重复申请
	CodeGuestGenErr = &StatusResponse{5011, "serialization failed for guest ID"}                  // 访客ID序列化失败

	CodeDbUpdateErr         = &StatusResponse{5000, "database update error"}               // 数据库更新错误
	CodeRequestParamsErr    = &StatusResponse{5002, "invalid request parameters"}          // 请求参数无效
	CodeDbRecordNotFoundErr = &StatusResponse{5003, "database record not found"}           //数据库中未找到记录
	CodeDbCreateErr         = &StatusResponse{5004, "failed to create record in database"} // 数据库中创建记录失败
	CodeDbSqlErr            = &StatusResponse{5005, "database error"}                      // 数据库错误
	CodeJsonErr             = &StatusResponse{5006, "JSON error"}                          // JSON解析错误

	CodeAesCbcEncryptionErr = &StatusResponse{5106, "encryption data err"} // 加密数据失败
	CodeAesCbcDecryptionErr = &StatusResponse{5107, "decryption data err"} // 解密数据失败
)

type Response struct {
	Code    int         `json:"code"`
	Message string      `json:"msg"`
	Data    interface{} `json:"data"`
}

// Set 设置Response的Code和Message值
func (resp *Response) Set(Code int, Message string) *Response {
	return &Response{
		Code:    Code,
		Message: Message,
	}
}

// Set 设置整个Response
func (resp *Response) SetWithData(Code int, Message string, Data interface{}) *Response {
	return &Response{
		Code:    Code,
		Message: Message,
		Data:    Data,
	}
}

// SetStatus 设置默认StatusResponse(内部自定义) 默认msg, 可以带data, data只使用一个参数
func (resp *Response) SetStatus(sr *StatusResponse, data ...interface{}) *Response {
	newResp := &Response{
		Code:    sr.Code,
		Message: sr.Message,
	}

	switch len(data) {
	case 0:
		// 0 直接返回
	case 1:
		if err, ok := data[0].(error); ok {
			newResp.Message = err.Error()
		} else {
			newResp.Data = data[0]
		}
	case 2:
		var dataIndex = 0
		if err, ok := data[dataIndex].(error); ok {
			newResp.Message = err.Error()
			dataIndex++
		} else {
			panic("data只接收1或2个 data 或 error.Error() 和 data ")
		}
		newResp.Data = data[1]
	default:
		panic("data只接收1或2个 data, error.Error() 和 data ")
	}

	return newResp
}

// SetStatusWithMessage 设置默认StatusResponse(内部自定义) 非默认msg, 可以带data, data只使用一个参数
func (resp *Response) SetStatusWithMessage(sr *StatusResponse, msg string, data ...interface{}) *Response {
	newResp := &Response{
		Code:    sr.Code,
		Message: msg,
	}

	switch len(data) {
	case 0:
		// 0 直接返回
	case 1:
		newResp.Data = data[0]
	default:
		panic("data只接收一个 data")
	}

	return newResp
}

func (resp *Response) SetStatusAddMessage(sr *StatusResponse, msg string, data ...interface{}) *Response {
	newResp := &Response{
		Code:    sr.Code,
		Message: sr.Message + ":" + msg,
	}

	switch len(data) {
	case 0:
		// 0 直接返回
	case 1:
		newResp.Data = data[0]
	default:
		panic("data只接收一个 data")
	}
	return newResp
}