package jira

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

	"github.com/tidbcloud/devops/pkg/infra/asset"
	"github.com/tidbcloud/devops/pkg/infra/clients/jiracli"
	"github.com/tidbcloud/devops/pkg/infra/config"
	"github.com/tidbcloud/devops/pkg/service"
	jirasvcapi "github.com/tidbcloud/devops/pkg/service/jira/api"
	"github.com/tidbcloud/devops/pkg/service/jira/issueloader"
	"github.com/tidbcloud/devops/pkg/service/jira/repo"

	"github.com/tidbcloud/pkgv2/db"
)

type ServiceParam struct {
	dig.In

	Conf       *config.RootConfig
	Logger     logr.Logger
	DBProvider db.TransProvider
	Asset      asset.Asset
	Jira       jiracli.JiraClient
}

type ServiceResult struct {
	dig.Out

	API     jirasvcapi.JiraServiceAPI
	Service service.Service `group:"service"`
}

type svc struct {
	*service.BaseService

	conf        config.AlertServiceConfig
	db          db.TransProvider
	repo        repo.Repo
	jiraClient  jiracli.JiraClient
	issueLoader issueloader.IssueLoader
}

func NewService(p ServiceParam) (ServiceResult, error) {
	base := service.NewBaseService("JiraService", service.WithDummy(p.Conf.Services.Alert.Dummy))
	if p.Conf.Services.Alert.Dummy {
		return ServiceResult{
			API:     &jirasvcapi.DummyJiraServiceAPI{},
			Service: base,
		}, nil
	}

	s := &svc{
		BaseService: base,
		conf:        p.Conf.Services.Alert,
		db:          p.DBProvider,
		repo:        repo.NewRepo(p.DBProvider, p.Asset.Sub("jira_service")),
		jiraClient:  p.Jira,
		issueLoader: issueloader.NewIssueLoader(p.Jira),
	}

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