package newrelic

import (
	"context"
	dbaasConfig "github.com/tidbcloud/metrics-server/central/config"
	secretprovider "github.com/tidbcloud/pkgv2/secret/provider"
	"go.opentelemetry.io/collector/component"
	"go.opentelemetry.io/collector/config"
	"go.opentelemetry.io/collector/exporter/exporterhelper"
	"time"
)

const (
	typeStr                          = "multinewrelic"
	defaultTenantCapacity            = 32
	errorTimeoutDuration             = 60 * time.Second
	distributionAggregatedHistoryTTL = 3600
)

func NewFactory() component.ExporterFactory {
	return component.NewExporterFactory(
		typeStr,
		createDefaultConfig,
		component.WithMetricsExporter(createMetricsExporter, component.StabilityLevelStable),
	)
}

func createDefaultConfig() config.Exporter {
	return &Config{
		ExporterSettings: config.NewExporterSettings(config.NewComponentID(typeStr)),
		TimeoutSettings:  exporterhelper.TimeoutSettings{Timeout: 15 * time.Second},
		RetrySettings:    exporterhelper.NewDefaultRetrySettings(),
		QueueSettings:    exporterhelper.NewDefaultQueueSettings(),
	}
}

func createMetricsExporter(
	ctx context.Context,
	set component.ExporterCreateSettings,
	c config.Exporter,
) (component.MetricsExporter, error) {
	cfg := c.(*Config)

	// Init aws kms encryptor from dbaas config.
	cmkArn := dbaasConfig.Global().ServerConfig.CMKArn
	kmsEnc, err := secretprovider.NewSecretEncryptor(cmkArn)
	if err != nil {
		return nil, err
	}

	exp, err := newMultiNewRelicExporter(set.Logger, cfg, kmsEnc, set)
	if err != nil {
		return nil, err
	}

	return exporterhelper.NewMetricsExporterWithContext(
		ctx,
		set,
		cfg,
		exp.Export,
		exporterhelper.WithTimeout(cfg.TimeoutSettings),
		exporterhelper.WithRetry(cfg.RetrySettings),
		exporterhelper.WithQueue(cfg.QueueSettings),
		exporterhelper.WithShutdown(exp.Shutdown),
	)
}
