package discovery

import (
	"testing"
	"time"
)

func TestRegistryDeleteStale_RemovesOnlyExpiredEntries(t *testing.T) {
	now := time.Date(2026, 2, 27, 12, 0, 0, 0, time.UTC)
	registry := NewRegistry()

	stale := RegistryEntry{
		ID:            "stale-gateway",
		InstanceID:    "stale-instance",
		Service:       "CARD",
		Rail:          RailCardPayout,
		Operations:    []string{OperationSend},
		Version:       "3.0.0",
		Status:        "ok",
		Health:        HealthParams{TimeoutSec: 30},
		LastHeartbeat: now.Add(-31 * time.Second),
	}
	fresh := RegistryEntry{
		ID:            "fresh-gateway",
		InstanceID:    "fresh-instance",
		Service:       "CARD",
		Rail:          RailCardPayout,
		Operations:    []string{OperationSend},
		Version:       "3.0.0",
		Status:        "ok",
		Health:        HealthParams{TimeoutSec: 30},
		LastHeartbeat: now.Add(-5 * time.Second),
	}
	unhealthyButRecent := RegistryEntry{
		ID:            "degraded-gateway",
		InstanceID:    "degraded-instance",
		Service:       "CARD",
		Rail:          RailCardPayout,
		Operations:    []string{OperationSend},
		Version:       "3.0.0",
		Status:        "degraded",
		Health:        HealthParams{TimeoutSec: 30},
		LastHeartbeat: now.Add(-5 * time.Second),
	}

	registry.UpsertEntry(stale, now)
	registry.UpsertEntry(fresh, now)
	registry.UpsertEntry(unhealthyButRecent, now)

	removed := registry.DeleteStale(now)
	if len(removed) != 1 {
		t.Fatalf("unexpected removed count: got=%d want=1", len(removed))
	}

	wantKey := registryEntryKey(normalizeEntry(stale))
	if removed[0] != wantKey {
		t.Fatalf("unexpected removed key: got=%q want=%q", removed[0], wantKey)
	}

	all := registry.List(now, false)
	if len(all) != 2 {
		t.Fatalf("unexpected remaining entries count: got=%d want=2", len(all))
	}
}

func TestRegistryDeleteStale_UsesPerEntryTimeout(t *testing.T) {
	now := time.Date(2026, 2, 27, 12, 0, 0, 0, time.UTC)
	registry := NewRegistry()

	shortTimeout := RegistryEntry{
		ID:            "short-timeout",
		InstanceID:    "short-timeout",
		Service:       "CARD",
		Rail:          RailCardPayout,
		Operations:    []string{OperationSend},
		Version:       "3.0.0",
		Status:        "ok",
		Health:        HealthParams{TimeoutSec: 5},
		LastHeartbeat: now.Add(-21 * time.Second),
	}
	longTimeout := RegistryEntry{
		ID:            "long-timeout",
		InstanceID:    "long-timeout",
		Service:       "CARD",
		Rail:          RailCardPayout,
		Operations:    []string{OperationSend},
		Version:       "3.0.0",
		Status:        "ok",
		Health:        HealthParams{TimeoutSec: 60},
		LastHeartbeat: now.Add(-6 * time.Second),
	}

	registry.UpsertEntry(shortTimeout, now)
	registry.UpsertEntry(longTimeout, now)

	removed := registry.DeleteStale(now)
	if len(removed) != 1 {
		t.Fatalf("unexpected removed count: got=%d want=1", len(removed))
	}

	wantKey := registryEntryKey(normalizeEntry(shortTimeout))
	if removed[0] != wantKey {
		t.Fatalf("unexpected removed key: got=%q want=%q", removed[0], wantKey)
	}
}
