package common

import "net/http"

// ErrCode [IsException(1 digital)] + errorClass(1 digital) + serviceID(2 digital) + code(5 digital)
// IsException: 1=exception, not exist=error
// errorClass: 4=request error, 5=internal error, 6=business error
// serviceID: customized， 99 is reserved for commonly use
// code: all by customized, 0 and 99999 are reserved
// such as, 149900005(1-4-99-00005) indicator: an exception, a request error, a commonly used error code, a record exist error
type ErrCode int64

const (
	ErrCodeOK ErrCode = 0

	RequestErrCodeStart     ErrCode = 40000000
	requestErrCodeEnd       ErrCode = 49999999
	ErrCodeInvalidArgument  ErrCode = 49900001
	ErrCodeUnauthenticated  ErrCode = 49900002
	ErrCodePermissionDenied ErrCode = 49900003
	ErrCodeRecordNotFound   ErrCode = 49900004
	ErrCodeRecordExist      ErrCode = 49900005
	ErrCodeTooManyRequests  ErrCode = 49900007

	InternalErrCodeStart ErrCode = 50000000
	InternalErrCodeEnd   ErrCode = 59999999
	ErrCodeUnknown       ErrCode = 59900104
	ErrCodeTimeout       ErrCode = 59900103
)

func (c ErrCode) HTTPCode() int {
	switch c {
	case ErrCodeOK:
		return http.StatusOK
	case ErrCodeInvalidArgument:
		return http.StatusBadRequest
	case ErrCodeUnauthenticated:
		return http.StatusUnauthorized
	case ErrCodePermissionDenied:
		return http.StatusForbidden
	case ErrCodeRecordNotFound:
		return http.StatusNotFound
	case ErrCodeRecordExist:
		return http.StatusConflict
	case ErrCodeTooManyRequests:
		return http.StatusTooManyRequests
	case ErrCodeUnknown:
		return http.StatusInternalServerError
	case ErrCodeTimeout:
		return http.StatusGatewayTimeout
	default:
		return http.StatusInternalServerError
	}
}
