package k8stest

import (
	"k8s.io/api/core/v1"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

var (
	mockedKubernetesClient *MockKubernetesClient
)

// MockKubernetesClient is a mocked implementation of k8s.KubernetesClientApi
type MockKubernetesClient struct {
	Services []v1.Service
}

// GetServices returns a list of services in a given namespace
func (mock *MockKubernetesClient) GetServices(namespace string) ([]v1.Service, error) {
	var services []v1.Service
	for _, service := range mock.Services {
		if service.Namespace == namespace {
			services = append(services, service)
		}
	}
	return services, nil
}

// GetMockedKubernetesClient returns a mocked implementation of k8s.KubernetesClientApi
func GetMockedKubernetesClient() *MockKubernetesClient {
	if mockedKubernetesClient != nil {
		return mockedKubernetesClient
	}
	InitializeMockedKubernetesClient(nil)
	return mockedKubernetesClient
}

// InitializeMockedKubernetesClient initializes a MockKubernetesClient with a given list of services
func InitializeMockedKubernetesClient(services []v1.Service) {
	mockedKubernetesClient = &MockKubernetesClient{
		Services: services,
	}
}

// CreateTestServices creates a mocked service for testing purposes
func CreateTestServices(name, namespace string, port int32) v1.Service {
	return v1.Service{
		ObjectMeta: metav1.ObjectMeta{
			Name:      name,
			Namespace: namespace,
		},
		Spec: v1.ServiceSpec{
			Ports: []v1.ServicePort{{Name: "http", Protocol: v1.ProtocolTCP, Port: port}},
		},
	}
}