package handler

import (
	"testing"
	"time"

	corev1 "k8s.io/api/core/v1"
	networkingv1 "k8s.io/api/networking/v1"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"

	"github.com/stretchr/testify/assert"
)

// capability_id: rainbond.resource-center.match-selector
func TestLabelsMatchSelector(t *testing.T) {
	assert.True(t, labelsMatchSelector(
		map[string]string{"app": "demo"},
		map[string]string{"app": "demo", "version": "v1"},
	))
	assert.False(t, labelsMatchSelector(
		map[string]string{"app": "demo", "component": "web"},
		map[string]string{"app": "demo"},
	))
	assert.False(t, labelsMatchSelector(
		map[string]string{"app": "demo"},
		map[string]string{"app": "other"},
	))
	assert.False(t, labelsMatchSelector(
		nil,
		map[string]string{"app": "demo"},
	))
}

// capability_id: rainbond.resource-center.collect-ingress-services
func TestCollectIngressServiceNames(t *testing.T) {
	ingress := networkingv1.Ingress{
		Spec: networkingv1.IngressSpec{
			DefaultBackend: &networkingv1.IngressBackend{
				Service: &networkingv1.IngressServiceBackend{Name: "default-svc"},
			},
			Rules: []networkingv1.IngressRule{
				{
					IngressRuleValue: networkingv1.IngressRuleValue{
						HTTP: &networkingv1.HTTPIngressRuleValue{
							Paths: []networkingv1.HTTPIngressPath{
								{
									Backend: networkingv1.IngressBackend{
										Service: &networkingv1.IngressServiceBackend{Name: "api-svc"},
									},
								},
								{
									Backend: networkingv1.IngressBackend{
										Service: &networkingv1.IngressServiceBackend{Name: "web-svc"},
									},
								},
							},
						},
					},
				},
			},
		},
	}

	assert.ElementsMatch(t, []string{"default-svc", "api-svc", "web-svc"}, collectIngressServiceNames(ingress))
}

// capability_id: rainbond.resource-center.event-summary
func TestToResourceEventInfo(t *testing.T) {
	lastTime := metav1.NewTime(time.Date(2026, 3, 18, 10, 0, 0, 0, time.UTC))
	event := corev1.Event{
		Type:           "Warning",
		Reason:         "FailedScheduling",
		Message:        "0/3 nodes are available",
		Count:          2,
		LastTimestamp:  lastTime,
		FirstTimestamp: lastTime,
	}

	info := toResourceEventInfo(event)
	assert.Equal(t, "Warning", info.Type)
	assert.Equal(t, "FailedScheduling", info.Reason)
	assert.Equal(t, "0/3 nodes are available", info.Message)
	assert.Equal(t, int32(2), info.Count)
	assert.Equal(t, lastTime.String(), info.LastTimestamp)
}