package featureflags

import (
	"os"
	"strings"
	"testing"

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

func Test_enableFeaturesFromFlags(t *testing.T) {
	is := assert.New(t)

	supportedFeatures := []Feature{"supported", "supported2", "supported3", "supported4", "supported5"}

	t.Run("supported features should be supported", func(t *testing.T) {
		Init(supportedFeatures)

		for _, featureFlag := range supportedFeatures {
			is.True(IsSupported(featureFlag))
		}
	})

	t.Run("unsupported features should not be supported", func(t *testing.T) {
		Init(supportedFeatures)

		is.False(IsSupported("unsupported"))
	})

	tests := []struct {
		cliFeatureFlags []string
		envFeatureFlags []string
	}{
		{[]string{"supported", "supported2"}, []string{"supported3", "supported4"}},
	}

	for _, test := range tests {
		Init(supportedFeatures)

		os.Unsetenv("PORTAINER_FEATURE_FLAGS")
		os.Setenv("PORTAINER_FEATURE_FLAGS", strings.Join(test.envFeatureFlags, ","))

		t.Run("testing", func(t *testing.T) {
			Parse(test.cliFeatureFlags)
			supported := toFeatureMap(test.cliFeatureFlags, test.envFeatureFlags)

			// add env flags to supported flags
			for _, featureFlag := range test.envFeatureFlags {
				supported[Feature(featureFlag)] = true
			}

			for _, featureFlag := range supportedFeatures {
				if _, ok := supported[featureFlag]; ok {
					is.True(IsEnabled(featureFlag))
				} else {
					is.False(IsEnabled(featureFlag))
				}
			}
		})
	}
}

// helper
func toFeatureMap(cliFeatures []string, envFeatures []string) map[Feature]bool {
	m := map[Feature]bool{}
	for _, s := range cliFeatures {
		m[Feature(s)] = true
	}

	for _, s := range envFeatures {
		m[Feature(s)] = true
	}

	return m
}