package message

import (
	"github.com/tidbcloud/devops/pkg/infra/clients/accountcli"
	"github.com/tidbcloud/devops/pkg/infra/clients/sendgridcli"
	"github.com/tidbcloud/devops/pkg/infra/config"
	"github.com/tidbcloud/devops/pkg/service"
	"github.com/tidbcloud/devops/pkg/service/message/api"
	"github.com/tidbcloud/devops/pkg/service/message/repo"

	"github.com/tidbcloud/pkgv2/db"
	"go.uber.org/dig"
)

type ServiceParam struct {
	dig.In

	Conf           *config.RootConfig
	DBProvider     db.TransProvider
	AccountClient  accountcli.Client
	SendGridClient sendgridcli.Client
}

type ServiceResult struct {
	dig.Out

	API     api.MessageServiceAPI
	Service service.Service `group:"service"`
}

type svc struct {
	*service.BaseService

	repo       *repo.Repo
	dbp        db.TransProvider
	accountCli accountcli.Client
	sgCli      sendgridcli.Client
}

func NewService(p ServiceParam) (ServiceResult, error) {
	base := service.NewBaseService("MessageService")
	s := &svc{
		BaseService: base,
		repo:        repo.NewRepo(p.DBProvider),
		dbp:         p.DBProvider,
		accountCli:  p.AccountClient,
		sgCli:       p.SendGridClient,
	}

	return ServiceResult{
		API:     s,
		Service: s,
	}, nil
}
