package main

import (
	"context"
	"fmt"

	"github.com/tidbcloud/devops/pkg/infra/config"
	"github.com/tidbcloud/devops/pkg/infra/deps"
	"github.com/tidbcloud/devops/pkg/infra/log"
	metrics "github.com/tidbcloud/devops/pkg/infra/metrics/devops-server"

	"go.opentelemetry.io/contrib/propagators/b3"
	"go.opentelemetry.io/otel"
	"go.opentelemetry.io/otel/propagation"
	sdktrace "go.opentelemetry.io/otel/sdk/trace"
)

func setup(ctx context.Context, conf *config.RootConfig) (*deps.Deps, error) {
	err := log.InitLogger(&conf.Log)
	if err != nil {
		return nil, fmt.Errorf("failed to init logger: %s", err)
	}
	err = log.InitAccessLogger(&conf.Log)
	if err != nil {
		return nil, fmt.Errorf("failed to init access logger: %s", err)
	}

	initTrace()

	metrics.RegisterMetrics()

	deps := deps.NewDeps()
	err = deps.Init(conf, log.Logger)
	if err != nil {
		return nil, fmt.Errorf("failed to init deps: %s", err)
	}

	return deps, nil
}

func initTrace() {
	tp := sdktrace.NewTracerProvider(
		sdktrace.WithSampler(sdktrace.AlwaysSample()),
	)
	otel.SetTracerProvider(tp)

	p := propagation.NewCompositeTextMapPropagator(
		propagation.TraceContext{},
		b3.New(), // used by tiinf
	)
	otel.SetTextMapPropagator(p)
}
