package errs

import "errors"

var (
	// https://tools.ietf.org/html/rfc6749#section-5.2
	ErrOauth2InvalidRequest                 = errors.New("invalid_request")
	ErrOauth2UnauthorizedClient             = errors.New("unauthorized_client")
	ErrOauth2AccessDenied                   = errors.New("access_denied")
	ErrOauth2UnsupportedResponseType        = errors.New("unsupported_response_type")
	ErrOauth2InvalidScope                   = errors.New("invalid_scope")
	ErrOauth2ServerError                    = errors.New("server_error")
	ErrOauth2TemporarilyUnavailable         = errors.New("temporarily_unavailable")
	ErrOauth2InvalidClient                  = errors.New("invalid_client")
	ErrOauth2InvalidGrant                   = errors.New("invalid_grant")
	ErrOauth2UnsupportedGrantType           = errors.New("unsupported_grant_type")
	ErrOauth2CodeChallengeRquired           = errors.New("invalid_request")
	ErrOauth2UnsupportedCodeChallengeMethod = errors.New("invalid_request")
	ErrOauth2InvalidCodeChallengeLen        = errors.New("invalid_request")
	ErrOauth2RedirectURIMismatch            = errors.New("redirect_uri_mismatch")

	// https://datatracker.ietf.org/doc/html/rfc8628#section-3.5
	ErrOauth2IncorrectDeviceCode  = errors.New("incorrect_device_code")
	ErrOauth2AuthorizationPending = errors.New("authorization_pending")
	ErrOauth2SlowDown             = errors.New("slow_down")
	ErrOauth2ExpiredToken         = errors.New("expired_token")

	// err for get userinfo
	ErrOauth2InvalidAccessToken = errors.New("invalid_access_token")
)

var StatusCodes = map[error]int{
	ErrOauth2InvalidRequest:                 400,
	ErrOauth2RedirectURIMismatch:            400,
	ErrOauth2CodeChallengeRquired:           400,
	ErrOauth2UnsupportedCodeChallengeMethod: 400,
	ErrOauth2InvalidCodeChallengeLen:        400,
	ErrOauth2IncorrectDeviceCode:            400,
	ErrOauth2InvalidScope:                   400,
	ErrOauth2UnauthorizedClient:             401,
	ErrOauth2UnsupportedResponseType:        401,
	ErrOauth2InvalidClient:                  401,
	ErrOauth2InvalidGrant:                   401,
	ErrOauth2InvalidAccessToken:             401,
	ErrOauth2ExpiredToken:                   401,
	ErrOauth2UnsupportedGrantType:           401,
	ErrOauth2AuthorizationPending:           401,
	ErrOauth2AccessDenied:                   403,
	ErrOauth2SlowDown:                       429,
	ErrOauth2TemporarilyUnavailable:         503,
	ErrOauth2ServerError:                    500,
}

func GetStatusCode(err error) (statusCode int) {
	statusCode, ok := StatusCodes[err]
	if !ok {
		statusCode = 500
	}
	return
}
