package config

import (
	"os"
	"path/filepath"
	"testing"

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

func TestLoadConfig(t *testing.T) {
	cfg, err := LoadServiceConfig("../../../example/configforlocal.yaml")
	assert.NoError(t, err)
	assert.Equal(t, "azure", cfg.Vendor)
	assert.False(t, cfg.IsProd())
}

func TestFeatureSwitchTime(t *testing.T) {
	gatename := "test.gate"
	empty := ServiceConfig{InstanceMeteringConfig: &InstanceMeteringConfig{}}
	f := empty.InstanceMeteringConfig.GetFeatureGateFilter(gatename)
	assert.Empty(t, f)
	assert.False(t, f.IsFullSwitch(1736119100))
	assert.False(t, f.IsTenantSwitch("123", 1736119100))
	assert.False(t, f.IsProjectSwitch("123", 1736119100))
	assert.False(t, f.IsClusterSwitch("123", 1736119100))
	id := "123456"
	cfg := ServiceConfig{
		InstanceMeteringConfig: &InstanceMeteringConfig{
			FeatureGateFilter: map[string]FeatureGateFilter{
				gatename: {
					FullSwitchTime: int64(1736119194),
					Tenants: []TenantFilter{
						{
							TenantId:   id,
							SwitchTime: int64(1736119100),
						},
					},
					Projects: []ProjectFilter{
						{
							ProjectId:  id,
							SwitchTime: int64(1736119100),
						},
					},
					Clusters: []ClusterFilter{
						{
							ClusterId:  id,
							SwitchTime: int64(1736119100),
						},
					},
				},
			},
		},
	}
	featuregate := cfg.InstanceMeteringConfig.GetFeatureGateFilter(gatename)
	assert.NotNil(t, featuregate)
	// full switch
	assert.True(t, featuregate.IsFullSwitch(int64(1736119194)))
	assert.False(t, featuregate.IsFullSwitch(int64(1736119193)))
	// tenant switch
	assert.True(t, featuregate.IsTenantSwitch(id, int64(1736119100)))
	assert.True(t, featuregate.IsTenantSwitch(id, int64(1736119194)))
	assert.False(t, featuregate.IsTenantSwitch(id, int64(1736119099)))
	assert.False(t, featuregate.IsTenantSwitch("123", int64(1736119100)))
	assert.True(t, featuregate.IsTenantSwitch("123", int64(1736119194)))
	// tenant greater than switch time
	assert.True(t, featuregate.IsTenantGreaterThanSwitchTime("123457", int64(1736119100)))
	assert.True(t, featuregate.IsTenantGreaterThanSwitchTime("123457", int64(1736119194)))
	assert.False(t, featuregate.IsTenantGreaterThanSwitchTime("123457", int64(1736119099)))
	assert.False(t, featuregate.IsTenantGreaterThanSwitchTime("123455", int64(1736119100)))
	assert.True(t, featuregate.IsTenantGreaterThanSwitchTime("123456", int64(1736119100)))
	assert.True(t, featuregate.IsTenantGreaterThanSwitchTime("123455", int64(1736119194)))
	// project switch
	assert.True(t, featuregate.IsProjectSwitch(id, int64(1736119100)))
	assert.True(t, featuregate.IsProjectSwitch(id, int64(1736119194)))
	assert.False(t, featuregate.IsProjectSwitch(id, int64(1736119099)))
	assert.False(t, featuregate.IsProjectSwitch("123", int64(1736119100)))
	assert.True(t, featuregate.IsProjectSwitch("123", int64(1736119194)))
	// cluster switch
	assert.True(t, featuregate.IsClusterSwitch(id, int64(1736119100)))
	assert.True(t, featuregate.IsClusterSwitch(id, int64(1736119194)))
	assert.False(t, featuregate.IsClusterSwitch(id, int64(1736119099)))
	assert.False(t, featuregate.IsClusterSwitch("123", int64(1736119100)))
	assert.True(t, featuregate.IsClusterSwitch("123", int64(1736119194)))

}

func TestLoadConfig_DefaultPremiumReservedMetaS3Path(t *testing.T) {
	dir := t.TempDir()
	cfgPath := filepath.Join(dir, "serviceconfig.yaml")
	err := os.WriteFile(cfgPath, []byte(`vendor: aws
trafficMetering:
  provider:
    aws:
      billingProvider:
      - account: "123"
        bucketName: "billing-bucket"
        region: "us-west-2"
        perfix: "billing-prefix"
        sourceType: "parquet"
      storeProvider:
        account: "123"
        bucketName: "store-bucket"
        region: "us-west-2"
        perfix: "store-prefix"
`), 0o644)
	assert.NoError(t, err)

	cfg, err := LoadServiceConfig(cfgPath)
	assert.NoError(t, err)
	assert.Equal(t, "premium-reserved-meta", cfg.TrafficMeteringConfig.Provider.AWS.StoreProvider.PremiumReservedMetaS3Path)
}
