package deps

import (
	"github.com/go-logr/logr"
	"github.com/tidbcloud/escalation-base/support-autoshift/pkg/infra/config"
	"github.com/tidbcloud/escalation-base/support-autoshift/pkg/infra/larkcli"
	"github.com/tidbcloud/escalation-base/support-autoshift/pkg/service"
	autoshiftsvc "github.com/tidbcloud/escalation-base/support-autoshift/pkg/service/autoshift"
	"go.uber.org/dig"
)

type ServiceParams struct {
	dig.In
	Services []service.Service `group:"service"` // injected by dig
}

type Deps struct {
	Container *dig.Container
}

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

func (d *Deps) Init(conf *config.RootConfig, logger logr.Logger) error {
	bases := []any{
		func() *config.RootConfig { return conf },
		func() logr.Logger { return logger },
		larkcli.New,
	}

	for _, f := range bases {
		if err := d.Container.Provide(f); err != nil {
			return err
		}
	}

	services := []any{
		autoshiftsvc.NewService,
	}
	for _, f := range services {
		if err := d.Container.Provide(f); err != nil {
			return err
		}
	}
	if err := d.Container.Provide(service.NewManager); err != nil {
		return err
	}

	return nil
}
