package client

import (
	"testing"

	"github.com/stretchr/testify/assert"
	apierrors "k8s.io/apimachinery/pkg/api/errors"
)

func TestErrorCompatibility(t *testing.T) {

	t.Run("NotFound error is compatible with K8s errors", func(t *testing.T) {
		err := NewNotFound("test-cluster")

		assert.True(t, apierrors.IsNotFound(err))
		assert.False(t, apierrors.IsAlreadyExists(err))
		assert.False(t, apierrors.IsConflict(err))
		assert.Contains(t, err.Error(), "test-cluster")
		assert.Contains(t, err.Error(), "not found")
	})

	t.Run("AlreadyExists error is compatible with K8s errors", func(t *testing.T) {
		err := NewAlreadyExists("test-cluster")

		assert.True(t, apierrors.IsAlreadyExists(err))
		assert.False(t, apierrors.IsNotFound(err))
		assert.False(t, apierrors.IsConflict(err))
		assert.Contains(t, err.Error(), "test-cluster")
		assert.Contains(t, err.Error(), "already exists")
	})

	t.Run("Conflict error is compatible with K8s errors", func(t *testing.T) {
		err := NewConflict("test-cluster", assert.AnError)

		assert.True(t, apierrors.IsConflict(err))
		assert.False(t, apierrors.IsNotFound(err))
		assert.False(t, apierrors.IsAlreadyExists(err))
		assert.Contains(t, err.Error(), "test-cluster")
	})

	t.Run("InternalError is compatible with K8s errors", func(t *testing.T) {
		err := NewInternalError(assert.AnError)

		assert.True(t, apierrors.IsInternalError(err))
		assert.False(t, apierrors.IsNotFound(err))
		assert.Contains(t, err.Error(), "Internal error occurred")
	})

	t.Run("BadRequest error is compatible with K8s errors", func(t *testing.T) {
		err := NewBadRequest("invalid input")

		assert.True(t, apierrors.IsBadRequest(err))
		assert.False(t, apierrors.IsNotFound(err))
		assert.Contains(t, err.Error(), "invalid input")
	})

	t.Run("Predefined errors work with K8s error checkers", func(t *testing.T) {
		assert.True(t, apierrors.IsAlreadyExists(ErrAlreadyExists))
		assert.True(t, apierrors.IsBadRequest(ErrDeleteCond))
		assert.True(t, apierrors.IsBadRequest(ErrTypeInvalid))
		assert.True(t, apierrors.IsBadRequest(ErrValueInvalid))
		assert.True(t, apierrors.IsBadRequest(ErrObjkeyInvalid))
	})
}
