package error

type StatusCode int64

const (
	// StatusReasonUnknown StatusCode = 1408

	StatusInternalErr StatusCode = 1500

	StatusNotFound StatusCode = 1404

	StatusRequestErr StatusCode = 1400

	StatusConflictErr StatusCode = 1409

	StatusProcessing StatusCode = 1102
)

type ClinicErr struct {
	code StatusCode
	err  error
}

func ProcessingError(err error) *ClinicErr {
	return NewError(StatusProcessing, err)
}

func InternalError(err error) *ClinicErr {
	return NewError(StatusInternalErr, err)
}

func NotFoundError(err error) *ClinicErr {
	return NewError(StatusNotFound, err)
}

func RequestError(err error) *ClinicErr {
	return NewError(StatusRequestErr, err)
}

//func InternalError(err error) *ClinicErr {
//	return NewError(StatusReasonUnknown, err)
//}

func NewError(code StatusCode, err error) *ClinicErr {
	if err == nil {
		return nil
	}

	return &ClinicErr{
		code: code,
		err:  err,
	}
}

func (e *ClinicErr) Error() string {
	return e.err.Error()
}

func (e *ClinicErr) IsInternalErr() bool {
	return e.code == StatusInternalErr
}

func (e *ClinicErr) IsConflictErr() bool {
	return e.code == StatusConflictErr
}

func (e *ClinicErr) IsNotFound() bool {
	return e.code == StatusNotFound
}

func (e *ClinicErr) IsRequestErr() bool {
	return e.code == StatusRequestErr
}

func (e *ClinicErr) IsProcessingErr() bool {
	return e.code == StatusProcessing
}

func (e *ClinicErr) Code() int64 {
	return int64(e.code)
}
