package config

import (
	"testing"

	"dataservices/commons/constants"

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

func TestValidateStaticRoutes(t *testing.T) {
	valid := ServerlessConfig{
		StaticRoutes: []ServerlessRouteItem{{
			Host:   "gateway.example.com",
			Port:   4000,
			UseTLS: true,
		}},
	}
	require.NoError(t, valid.ValidateStaticRoutes())

	invalid := ServerlessConfig{
		StaticRoutes: []ServerlessRouteItem{{
			UseTLS: true,
		}},
	}
	require.ErrorContains(t, invalid.ValidateStaticRoutes(), "invalid static route")

	duplicated := ServerlessConfig{
		StaticRoutes: []ServerlessRouteItem{
			{ProjectId: 1, ClusterId: 2, Region: "cn-hangzhou", Cloud: constants.ClusterCloudProviderAliCloud, Host: "a", Port: 4000},
			{ProjectId: 1, ClusterId: 2, Region: "cn-shanghai", Cloud: constants.ClusterCloudProviderAliCloud, Host: "b", Port: 4000},
		},
	}
	require.ErrorContains(t, duplicated.ValidateStaticRoutes(), "duplicated static route")

	invalidSelector := ServerlessConfig{
		StaticRoutes: []ServerlessRouteItem{{
			ProjectId: 1,
			Host:      "gateway.example.com",
			Port:      4000,
		}},
	}
	require.ErrorContains(t, invalidSelector.ValidateStaticRoutes(), "invalid static route selector")

	ambiguousDefault := ServerlessConfig{
		StaticRoutes: []ServerlessRouteItem{
			{Host: "a", Port: 4000},
			{ProjectId: 1, ClusterId: 2, Host: "b", Port: 4000},
		},
	}
	require.ErrorContains(t, ambiguousDefault.ValidateStaticRoutes(), "default static route requires exactly one route entry")
}

func TestFindStaticRoute(t *testing.T) {
	cfg := ServerlessConfig{
		StaticRoutes: []ServerlessRouteItem{{
			Host:   "gateway.example.com",
			Port:   4000,
			UseTLS: true,
		}},
	}
	route, ok := cfg.FindStaticRoute(123, 456)
	require.True(t, ok)
	require.Equal(t, "gateway.example.com", route.Host)

	cfg = ServerlessConfig{
		StaticRoutes: []ServerlessRouteItem{{
			ProjectId: 1,
			ClusterId: 2,
			Host:      "gateway.example.com",
			Port:      4000,
		}},
	}
	route, ok = cfg.FindStaticRoute(1, 2)
	require.True(t, ok)
	require.Equal(t, uint64(1), route.ProjectId)

	_, ok = cfg.FindStaticRoute(3, 4)
	require.False(t, ok)
}

func TestValidateAliCloudRegionalConfig(t *testing.T) {
	cfg := &CentralConfig{}
	require.NoError(t, cfg.ValidateAliCloudRegionalConfig())

	cfg.ServerConf.DeployMode = "region"
	cfg.ServerlessConf.Provider = constants.ClusterCloudProviderAliCloud
	require.ErrorContains(t, cfg.ValidateAliCloudRegionalConfig(), "staticRoutes is empty")

	cfg.ServerlessConf.StaticRoutes = []ServerlessRouteItem{{
		Host:   "gateway.example.com",
		Port:   4000,
		UseTLS: true,
	}}
	require.NoError(t, cfg.ValidateAliCloudRegionalConfig())
}
