package errcode

import (
	"google.golang.org/grpc/codes"
	"google.golang.org/grpc/status"
)

// header error code ,start:100
var (
	ErrHeaderRequestId     = NewError(101, "Header Request-Id Not Found")
	ErrHeaderAuthorization = NewError(102, "Header Authorization Not Found")
	ErrHeaderSecretKey     = NewError(103, "Header Secret-Key Not Found")
	ErrHeaderMustParams    = NewError(104, "Header Must Params")
)

// standard error code ,start:110
var (
	ErrEmpty         = NewError(110, "Data Is Empty")
	ErrRequestParse  = NewError(111, "Request Parse Fail")
	ErrRequestMust   = NewError(112, "Request Params Required")
	ErrPermission    = NewError(113, "Permission Denied")
	ErrJsonUnmarshal = NewError(114, "Json Unmarshal Fail")
	ErrJsonMarshal   = NewError(115, "Json Marshal Fail")
	ErrInternal      = NewError(116, "Internal Server Error")
)

// jwt error code ,start:130
var (
	ErrJWTAuthNotFound     = NewError(131, "JWT Authorization Not Found")
	ErrJWTBase64Decode     = NewError(132, "JWT Authorization Base64 Decode Error")
	ErrJWTAuthParseFail    = NewError(133, "JWT Authorization Fail")
	ErrJWTAuthKeyId        = NewError(134, "JWT Key:Id Incorrect")
	ErrJWTAuthKeyIdentity  = NewError(135, "JWT Key:Identity Incorrect")
	ErrJWTAuthTokenChanged = NewError(136, "JWT Authorization Changed")
	ErrJWTAuthExpire       = NewError(137, "JWT Authorization Expire")
	ErrJWTJsonDecode       = NewError(138, "JWT Authorization JSON Decode Error")
	ErrJWTJsonEncode       = NewError(139, "JWT Authorization JSON Encode Error")
	ErrJWTSecretKey        = NewError(139, "JWT SecretKey Error")
)

// model error code ,start:150
var (
	ErrDB    = NewError(151, "DB Fatal Error")
	ErrRedis = NewError(152, "Redis Fatal Error")
	ErrMq    = NewError(153, "MQ Fatal Error")
	ErrOss   = NewError(154, "OSS Fatal Error")
	ErrRpc   = NewError(155, "RPC Fatal Error")
	ErrApm   = NewError(156, "APM Fatal Error")
	ErrEtcd  = NewError(157, "Etcd Fatal Error")
)

// google grpc error status.
var (
	OK                    = NewError(171, "OK")
	ErrCanceled           = NewError(172, "Canceled")
	ErrUnknown            = NewError(173, "Unknown")
	ErrInvalidArgument    = NewError(174, "Invalid Argument")
	ErrDeadlineExceeded   = NewError(175, "Deadline Exceeded")
	ErrAlreadyExists      = NewError(176, "Already Exists")
	ErrPermissionDenied   = NewError(177, "Permission Denied")
	ErrResourceExhausted  = NewError(178, "Resource Exhausted")
	ErrFailedPrecondition = NewError(179, "Failed Precondition")
	ErrAborted            = NewError(181, "Aborted")
	ErrOutOfRange         = NewError(182, "Out Of Range")
	ErrUnimplemented      = NewError(183, "Unimplemented")
	ErrUnavailable        = NewError(184, "Unavailable")
	ErrDataLoss           = NewError(185, "Data Loss")
	ErrUnauthenticated    = NewError(186, "Unauthenticated")
)

func NewError(code int, msg string) error {
	return status.New(codes.Code(code), msg).Err()
}

// custom error,status code:500
func ErrFatal(code int, msg string) error {
	return status.New(codes.Code(code), msg).Err()
}

func ErrNotFound(code int, msg string) error {
	return status.New(codes.Code(code), msg).Err()
}