package errors

type BL_ERROR_CODE int

const (
	BL_PANIC   BL_ERROR_CODE = -1
	BL_SUCCESS BL_ERROR_CODE = 0

	BL_UNRECOGNIZED_ERROR    BL_ERROR_CODE = 9999
	BL_PARAMETER_INVALID     BL_ERROR_CODE = 9998
	BL_MARSHAL_ERROR         BL_ERROR_CODE = 9997
	BL_UNMARSHAL_ERROR       BL_ERROR_CODE = 9996
	BL_INTERNAL_SERVER_ERROR BL_ERROR_CODE = 9995
)

type ErrorCodeExplanation struct {
	explanation string
	httpCode    int
}

func (t BL_ERROR_CODE) GetHttpCode() int {
	return explanationContainer[t].httpCode
}

func (t BL_ERROR_CODE) Equal(code int32) bool {
	return code == int32(t)
}

func (t BL_ERROR_CODE) Explain() string {
	return explanationContainer[t].explanation
}

var explanationContainer = map[BL_ERROR_CODE]ErrorCodeExplanation{
	BL_SUCCESS: {"succeed", 200},
	BL_PANIC:   {"panic", 500},

	// system error
	BL_UNRECOGNIZED_ERROR:    {"unrecognized error", 500},
	BL_PARAMETER_INVALID:     {"parameter is invalid", 400},
	BL_MARSHAL_ERROR:         {"marshal error", 500},
	BL_UNMARSHAL_ERROR:       {"marshal error", 500},
	BL_INTERNAL_SERVER_ERROR: {"internal server error", 500},
}
