package discovery

import "testing"

func TestNormalizeRailOperations(t *testing.T) {
	got := NormalizeRailOperations([]string{
		"send",
		"observe.confirm",
		"external.credit",
		"fx.convert",
		"payout.crypto",
		"unknown",
	})

	want := []string{
		RailOperationSend,
		RailOperationObserveConfirm,
		RailOperationExternalCredit,
		RailOperationFXConvert,
	}
	if len(got) != len(want) {
		t.Fatalf("unexpected operations count: got=%d want=%d", len(got), len(want))
	}
	for i := range want {
		if got[i] != want[i] {
			t.Fatalf("unexpected operation[%d]: got=%q want=%q", i, got[i], want[i])
		}
	}
}

func TestExpandRailOperationRejectsLegacyAliases(t *testing.T) {
	if got := ExpandRailOperation("payout.fiat"); len(got) != 0 {
		t.Fatalf("expected no expansion for legacy alias, got=%v", got)
	}
}

func TestIsKnownRail(t *testing.T) {
	if !IsKnownRail("crypto") {
		t.Fatalf("expected crypto rail to be known")
	}
	if IsKnownRail("telegram") {
		t.Fatalf("did not expect telegram rail to be known")
	}
}

func TestNormalizeRailRejectsLegacyAliases(t *testing.T) {
	if IsKnownRail("provider_settlement") {
		t.Fatalf("did not expect provider_settlement alias to be known")
	}
	if IsKnownRail("card_payout") {
		t.Fatalf("did not expect card_payout alias to be known")
	}
	if IsKnownRail("RAIL_SETTLEMENT") {
		t.Fatalf("did not expect RAIL_SETTLEMENT alias to be known")
	}
}

func TestGatewayOperationSetsAreCanonicalOnly(t *testing.T) {
	tests := []struct {
		name string
		got  []string
		want []string
	}{
		{
			name: "crypto rail gateway operations",
			got:  CryptoRailGatewayOperations(),
			want: []string{
				OperationBalanceRead,
				OperationSend,
				OperationExternalDebit,
				OperationExternalCredit,
				OperationFee,
				OperationObserveConfirm,
			},
		},
		{
			name: "card payout rail gateway operations",
			got:  CardPayoutRailGatewayOperations(),
			want: []string{
				OperationSend,
				OperationExternalCredit,
				OperationObserveConfirm,
			},
		},
		{
			name: "provider settlement rail gateway operations",
			got:  ProviderSettlementRailGatewayOperations(),
			want: []string{
				OperationFXConvert,
				OperationObserveConfirm,
			},
		},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			if len(tt.got) != len(tt.want) {
				t.Fatalf("unexpected operations count: got=%d want=%d", len(tt.got), len(tt.want))
			}
			for i := range tt.want {
				if tt.got[i] != tt.want[i] {
					t.Fatalf("unexpected operation[%d]: got=%q want=%q", i, tt.got[i], tt.want[i])
				}
			}
		})
	}
}
