package store

// Group D (hub v0.47.0 offsite multi-endpoint) — the endpoint list/delete store surface.
// GetWGEndpoint's LIMIT-1 lowest-id semantics stay untouched (allocation/sync contract).

import (
	"database/sql"
	"testing"
)

func TestListWGEndpoints_OrderAndDelete(t *testing.T) {
	s := newTestStore(t)

	// Empty → empty list, no error.
	eps, err := s.ListWGEndpoints()
	if err != nil || len(eps) != 0 {
		t.Fatalf("empty list = %v / %v", eps, err)
	}

	// Insert out of order → returned ordered by endpoint_id.
	for _, id := range []string{"ep2", "ep0", "ep1"} {
		if err := s.SetWGEndpoint(&WGEndpoint{
			EndpointID: id, DNSName: id + ".felhom.eu", WGPort: 443,
			ServerPubkey: "pk-" + id, TunnelSubnet: "10.77.0.0/24", PBSTunnelIP: "10.77.0.1",
		}); err != nil {
			t.Fatal(err)
		}
	}
	eps, err = s.ListWGEndpoints()
	if err != nil || len(eps) != 3 {
		t.Fatalf("list = %d eps / %v, want 3", len(eps), err)
	}
	for i, want := range []string{"ep0", "ep1", "ep2"} {
		if eps[i].EndpointID != want {
			t.Errorf("eps[%d] = %s, want %s (id order)", i, eps[i].EndpointID, want)
		}
	}

	// GetWGEndpoint (the allocation/sync endpoint) still returns the LOWEST id.
	ep, err := s.GetWGEndpoint()
	if err != nil || ep.EndpointID != "ep0" {
		t.Errorf("GetWGEndpoint = %+v / %v, want ep0 (lowest id wins)", ep, err)
	}

	// Delete removes exactly the named row; unknown id → sql.ErrNoRows.
	if err := s.DeleteWGEndpoint("ep1"); err != nil {
		t.Fatalf("DeleteWGEndpoint: %v", err)
	}
	eps, _ = s.ListWGEndpoints()
	if len(eps) != 2 || eps[0].EndpointID != "ep0" || eps[1].EndpointID != "ep2" {
		t.Errorf("after delete = %+v, want [ep0 ep2]", eps)
	}
	if err := s.DeleteWGEndpoint("ghost"); err != sql.ErrNoRows {
		t.Errorf("unknown delete = %v, want sql.ErrNoRows", err)
	}
}
