package errcodes

import (
	"testing"
)

func TestSpecificErrorTypes(t *testing.T) {
	// Test Redis lock error
	err := ErrRedisLockAlreadyLocked
	if !IsErr(err) {
		t.Error("Expected IsErr to return true for ErrorCode")
	}

	errcode, ok := AsErr(err)
	if !ok {
		t.Error("Expected AsErr to return true for ErrorCode")
	}
	if errcode != ErrRedisLockAlreadyLocked {
		t.Error("Expected AsErr to return the same error")
	}

	// Test Redis cache miss error
	cacheErr := ErrRedisCacheMiss
	if !IsErr(cacheErr) {
		t.Error("Expected IsErr to return true for cache miss error")
	}

	// Test configuration error
	configErr := ErrConfigInvalidEnv
	if !IsErr(configErr) {
		t.Error("Expected IsErr to return true for config error")
	}

	// Test scheduler error
	schedulerErr := ErrSchedulerTimeoutTooLong
	if !IsErr(schedulerErr) {
		t.Error("Expected IsErr to return true for scheduler error")
	}
}

func TestErrorChecking(t *testing.T) {
	// Example of how to check for specific errors in practice
	err := ErrRedisLockAlreadyLocked

	// Check if it's a specific error type
	if errcode, ok := AsErr(err); ok {
		switch errcode {
		case ErrRedisLockAlreadyLocked:
			// Handle lock already locked case
			t.Log("Handling lock already locked error")
		case ErrRedisCacheMiss:
			// Handle cache miss case
			t.Log("Handling cache miss error")
		case ErrRedisCacheCorrupted:
			// Handle corrupted cache case
			t.Log("Handling corrupted cache error")
		default:
			// Handle other error types
			t.Log("Handling other error type")
		}
	}
}

func TestWrapFunction(t *testing.T) {
	originalErr := ErrRedisCacheMiss
	wrappedErr := Wrap(originalErr, "additional context")

	if !IsErr(wrappedErr) {
		t.Error("Expected wrapped error to be an ErrorCode")
	}

	errcode, ok := AsErr(wrappedErr)
	if !ok {
		t.Error("Expected AsErr to work with wrapped error")
	}

	// The wrapped error should have the same status code as the original
	if errcode.StatusCode != ErrRedisCacheMiss.StatusCode {
		t.Errorf("Expected status code %d, got %d", ErrRedisCacheMiss.StatusCode, errcode.StatusCode)
	}
}
