package api

import (
	"net/http"
)

type ErrCode string

const (
	ErrCodeOK               ErrCode = "OK"
	ErrCodeInvalidArgument  ErrCode = "INVALID_ARGUMENT"
	ErrCodeFailedPrecond    ErrCode = "FAILED_PRECONDITION"
	ErrCodeOutOfRange       ErrCode = "OUT_OF_RANGE"
	ErrCodeUnauthenticated  ErrCode = "UNAUTHENTICATED"
	ErrCodePermissionDenied ErrCode = "PERMISSION_DENIED"
	ErrCodeNotFound         ErrCode = "NOT_FOUND"
	ErrCodeAborted          ErrCode = "ABORTED"
	ErrCodeAlreadyExists    ErrCode = "ALREADY_EXISTS"
	ErrCodeResourceExhaust  ErrCode = "RESOURCE_EXHAUSTED"
	ErrCodeCancelled        ErrCode = "CANCELLED"
	ErrCodeDataLoss         ErrCode = "DATA_LOSS"
	ErrCodeUnknown          ErrCode = "UNKNOWN"
	ErrCodeInternal         ErrCode = "INTERNAL"
	ErrCodeNotImplemented   ErrCode = "NOT_IMPLEMENTED"
	ErrCodeUnavailable      ErrCode = "UNAVAILABLE"
	ErrCodeDeadlineExceeded ErrCode = "DEADLINE_EXCEEDED"
)

func (c ErrCode) HTTPCode() int {
	switch c {
	case ErrCodeOK:
		return http.StatusOK
	case ErrCodeInvalidArgument, ErrCodeFailedPrecond, ErrCodeOutOfRange:
		return http.StatusBadRequest
	case ErrCodeUnauthenticated:
		return http.StatusUnauthorized
	case ErrCodePermissionDenied:
		return http.StatusForbidden
	case ErrCodeNotFound:
		return http.StatusNotFound
	case ErrCodeAborted, ErrCodeAlreadyExists:
		return http.StatusConflict
	case ErrCodeResourceExhaust:
		return http.StatusTooManyRequests
	case ErrCodeCancelled:
		return 499
	case ErrCodeDataLoss, ErrCodeUnknown, ErrCodeInternal:
		return http.StatusInternalServerError
	case ErrCodeNotImplemented:
		return http.StatusNotImplemented
	case ErrCodeUnavailable:
		return http.StatusServiceUnavailable
	case ErrCodeDeadlineExceeded:
		return http.StatusGatewayTimeout
	default:
		return http.StatusInternalServerError
	}
}
