package commands

import (
	"testing"

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

func TestTruncPlatforms(t *testing.T) {
	tests := []struct {
		name         string
		platforms    []string
		max          int
		expectedList map[string][]string
		expectedOut  string
	}{
		{
			name:      "arm64 preferred and emulated",
			platforms: []string{"linux/arm64*", "linux/amd64", "linux/amd64/v2", "linux/riscv64", "linux/ppc64le", "linux/s390x", "linux/386", "linux/mips64le", "linux/mips64", "linux/arm/v7", "linux/arm/v6"},
			max:       4,
			expectedList: map[string][]string{
				"linux/amd64": {
					"linux/amd64",
					"linux/amd64/v2",
				},
				"linux/arm": {
					"linux/arm/v7",
					"linux/arm/v6",
				},
				"linux/arm64": {
					"linux/arm64*",
				},
				"linux/ppc64le": {
					"linux/ppc64le",
				},
			},
			expectedOut: "linux/amd64 (+2), linux/arm64*, linux/arm (+2), linux/ppc64le, (5 more)",
		},
		{
			name:      "riscv64 preferred only",
			platforms: []string{"linux/riscv64*"},
			max:       4,
			expectedList: map[string][]string{
				"linux/riscv64": {
					"linux/riscv64*",
				},
			},
			expectedOut: "linux/riscv64*",
		},
		{
			name:      "amd64 no preferred and emulated",
			platforms: []string{"linux/amd64", "linux/amd64/v2", "linux/amd64/v3", "linux/386", "linux/arm64", "linux/riscv64", "linux/ppc64le", "linux/s390x", "linux/mips64le", "linux/mips64", "linux/arm/v7", "linux/arm/v6"},
			max:       4,
			expectedList: map[string][]string{
				"linux/amd64": {
					"linux/amd64",
					"linux/amd64/v2",
					"linux/amd64/v3",
				},
				"linux/arm": {
					"linux/arm/v7",
					"linux/arm/v6",
				},
				"linux/arm64": {
					"linux/arm64",
				},
				"linux/ppc64le": {
					"linux/ppc64le",
				}},
			expectedOut: "linux/amd64 (+3), linux/arm64, linux/arm (+2), linux/ppc64le, (5 more)",
		},
		{
			name:      "amd64 no preferred",
			platforms: []string{"linux/amd64", "linux/386"},
			max:       4,
			expectedList: map[string][]string{
				"linux/386": {
					"linux/386",
				},
				"linux/amd64": {
					"linux/amd64",
				},
			},
			expectedOut: "linux/amd64, linux/386",
		},
		{
			name:      "arm64 no preferred",
			platforms: []string{"linux/arm64", "linux/arm/v7", "linux/arm/v6"},
			max:       4,
			expectedList: map[string][]string{
				"linux/arm": {
					"linux/arm/v7",
					"linux/arm/v6",
				},
				"linux/arm64": {
					"linux/arm64",
				},
			},
			expectedOut: "linux/arm64, linux/arm (+2)",
		},
		{
			name:      "all preferred",
			platforms: []string{"darwin/arm64*", "linux/arm64*", "linux/arm/v5*", "linux/arm/v6*", "linux/arm/v7*", "windows/arm64*"},
			max:       4,
			expectedList: map[string][]string{
				"darwin/arm64": {
					"darwin/arm64*",
				},
				"linux/arm": {
					"linux/arm/v5*",
					"linux/arm/v6*",
					"linux/arm/v7*",
				},
				"linux/arm64": {
					"linux/arm64*",
				},
				"windows/arm64": {
					"windows/arm64*",
				},
			},
			expectedOut: "linux/arm64*, linux/arm* (+3), darwin/arm64*, windows/arm64*",
		},
		{
			name:      "no major preferred",
			platforms: []string{"linux/amd64/v2*", "linux/arm/v6*", "linux/mips64le*", "linux/amd64", "linux/amd64/v3", "linux/386", "linux/arm64", "linux/riscv64", "linux/ppc64le", "linux/s390x", "linux/mips64", "linux/arm/v7"},
			max:       4,
			expectedList: map[string][]string{
				"linux/amd64": {
					"linux/amd64/v2*",
					"linux/amd64",
					"linux/amd64/v3",
				},
				"linux/arm": {
					"linux/arm/v6*",
					"linux/arm/v7",
				},
				"linux/arm64": {
					"linux/arm64",
				},
				"linux/ppc64le": {
					"linux/ppc64le",
				},
			},
			expectedOut: "linux/amd64* (+3), linux/arm64, linux/arm* (+2), linux/ppc64le, (5 more)",
		},
		{
			name:      "no major with multiple variants",
			platforms: []string{"linux/arm64", "linux/arm/v7", "linux/arm/v6", "linux/mips64le/softfloat", "linux/mips64le/hardfloat"},
			max:       4,
			expectedList: map[string][]string{
				"linux/arm": {
					"linux/arm/v7",
					"linux/arm/v6",
				},
				"linux/arm64": {
					"linux/arm64",
				},
				"linux/mips64le": {
					"linux/mips64le/softfloat",
					"linux/mips64le/hardfloat",
				},
			},
			expectedOut: "linux/arm64, linux/arm (+2), linux/mips64le (+2)",
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			tpfs := truncPlatforms(tt.platforms, tt.max)
			assert.Equal(t, tt.expectedList, tpfs.List())
			assert.Equal(t, tt.expectedOut, tpfs.String())
		})
	}
}
