package api

import (
	"reflect"
	"strings"
	"testing"

	"github.com/samber/lo"
)

func IsUnique[T comparable](collection []T) bool {
	return len(collection) == len(lo.Uniq(collection))
}

func TestTagEnums(t *testing.T) {
	var EnumsOwnerToEnumsMap = map[string][]string{
		reflect.TypeOf(BackendStatus{}).Field(0).Tag.Get("enums"): lo.Keys(lo.Invert(BackendStatusName)),
		reflect.TypeOf(Experiment{}).Field(6).Tag.Get("enums"): append(lo.Keys(lo.Invert(ExperimentStatus2StatusName)),
			ExperimentWaitingApprove),
		reflect.TypeOf(Action{}).Field(0).Tag.Get("enums"): lo.Keys(lo.Invert(ActionKind2KindName)),
		reflect.TypeOf(Target{}).Field(0).Tag.Get("enums"): lo.Keys(lo.Invert(TargetMode2ModeName)),
		reflect.TypeOf(Target{}).Field(1).Tag.Get("enums"): lo.Keys(lo.Invert(TargetComponent2ComponentName)),
	}

	for enumsLine, enumsInstants := range EnumsOwnerToEnumsMap {
		enumsInstantsInTags := strings.Split(enumsLine, ",")
		if !IsUnique(enumsInstantsInTags) || !IsUnique(enumsInstants) {
			t.Fatalf("enums instants in tags %v or enums instants %v in map are not unique",
				enumsInstantsInTags, enumsInstants)
		}
		if len(enumsInstantsInTags) != len(enumsInstants) {
			t.Fatalf("enums instants in tags %v or enums instants %v in map are not equal in length",
				enumsInstantsInTags, enumsInstants)
		}
		if !lo.Every(enumsInstantsInTags, enumsInstants) {
			t.Fatalf("enums instants in tags %v or enums instants %v in map are not equal",
				enumsInstantsInTags, enumsInstants)
		}
	}
}
