package api

import (
	"testing"

	"github.com/gin-gonic/gin"
	"go.uber.org/fx"
	"go.uber.org/fx/fxtest"

	"github.com/pingcap-inc/clinic/pkg/api/datasource"
	"github.com/pingcap-inc/clinic/pkg/api/diagnosis"
	"github.com/pingcap-inc/clinic/pkg/config"
	_proxy "github.com/pingcap-inc/clinic/pkg/proxy"
)

// TestFxDuplicateProvider make sure no error occurs with multiple instance of same type during initialization
func TestFxDuplicateProvider(t *testing.T) {
	addr := config.AddressConfig{
		Host: "localhost",
		Port: 8080,
	}
	rg := gin.Default().RouterGroup
	vmSelectAddr := config.MetricSelectAddressConfig{
		CloudAddress: config.VMClusterAddressConfig{AddressConfig: addr},
		OpAddress:    config.VMClusterAddressConfig{AddressConfig: addr},
	}
	logAddr := config.DatasourceLogConfig{
		OpAddress:    config.LogConfig{Endpoint: "http://localhost"},
		CloudAddress: config.LogConfig{Endpoint: "http://localhost"},
	}
	cfg := &config.Config{
		DiagnosisConfig: config.DiagnosisConfig{
			MetricConfig: config.MetricSingleEndpointConfig{
				VMClusterAddressConfig: config.VMClusterAddressConfig{AddressConfig: addr},
				SelectAddr:             vmSelectAddr.OpAddress,
			},
			LogConfig: config.LogConfig{Endpoint: "http://localhost"},
		},
		DatasourceConfig: config.DatasourceConfig{
			MetricConfig: config.MetricConfig{
				VMClusterAddressConfig: config.VMClusterAddressConfig{AddressConfig: addr},
				SelectAddr:             vmSelectAddr,
			},
			LogConfig: logAddr,
		},
	}
	app := fxtest.New(t,
		fx.Supply(cfg, &rg, &_proxy.TiDBClusterMetricHandler{}, &_proxy.O11yProxyHandler{}),
		datasource.Module,
		diagnosis.Module,
	)
	app.RequireStart()
	app.RequireStop()
}
