package deps

import (
	"context"

	"github.com/go-logr/logr"
	"go.uber.org/dig"

	"github.com/tidbcloud/aisupport/packages/sdk-go/infra/logger"
	"github.com/tidbcloud/aisupport/services/agent-sidecar/config"
	"github.com/tidbcloud/aisupport/services/agent-sidecar/internal/app"
	apiproxyhandler "github.com/tidbcloud/aisupport/services/agent-sidecar/internal/app/handlers/apiproxy"
	projecthandler "github.com/tidbcloud/aisupport/services/agent-sidecar/internal/app/handlers/project"
	secretstorehandler "github.com/tidbcloud/aisupport/services/agent-sidecar/internal/app/handlers/secretstore"
	"github.com/tidbcloud/aisupport/services/agent-sidecar/internal/services"
	"github.com/tidbcloud/aisupport/services/agent-sidecar/internal/services/apiproxy"
	"github.com/tidbcloud/aisupport/services/agent-sidecar/internal/services/project"
	"github.com/tidbcloud/aisupport/services/agent-sidecar/internal/services/secretstore"
)

type Deps struct {
	Container *dig.Container
}

func NewDeps() *Deps {
	return &Deps{Container: dig.New()}
}

func (d *Deps) Init(ctx context.Context, conf *config.RootConfig) error {
	factories := []any{
		func() context.Context { return ctx },
		func() *config.RootConfig { return conf },
		func() logr.Logger { return logger.Logger },
		project.NewService,
		secretstore.NewService,
		apiproxy.NewService,
		projecthandler.NewHandler,
		apiproxyhandler.NewHandler,
		secretstorehandler.NewHandler,
		app.NewRPCServer,
		services.NewManager,
	}
	for _, factory := range factories {
		if err := d.Container.Provide(factory); err != nil {
			return err
		}
	}
	return nil
}
