package jira

import (
	"context"
	"fmt"
	"slices"

	jiraent "github.com/tidbcloud/devops/entity/jira"
	"github.com/tidbcloud/devops/pkg/infra/utils/repoopt"
	jirasvcapi "github.com/tidbcloud/devops/pkg/service/jira/api"
	"github.com/tidbcloud/devops/pkg/service/jira/repo"
)

func (s *svc) ListIssueTriageTagDefinitions(ctx context.Context, param jirasvcapi.ListIssueTriageTagDefinitionsParam) ([]*jiraent.IssueTriageTagDefinition, error) {
	options := []repoopt.Option{}

	if param.TypesIn != nil {
		options = append(options, repo.IssueTriageTagDefinitionOption.TypesIn(*param.TypesIn))
	}
	if param.NamesIn != nil {
		options = append(options, repo.IssueTriageTagDefinitionOption.NamesIn(*param.NamesIn))
	}
	if len(param.LabelsContain) > 0 {
		options = append(options, repo.IssueTriageTagDefinitionOption.LabelsContain(param.LabelsContain))
	}

	return s.repo.ListIssueTriageTags(ctx, options...)
}

func (s *svc) CreateIssueTriageTagDefinition(ctx context.Context, tag *jiraent.IssueTriageTagDefinition) (*jiraent.IssueTriageTagDefinition, error) {
	var createdTag *jiraent.IssueTriageTagDefinition
	var err error

	if !slices.Contains(jiraent.IssueTriageTagTypeValues, tag.Type) {
		return nil, fmt.Errorf("invalid issue triage tag type: %s", tag.Type)
	}

	err = s.db.Transaction(ctx, func(txCtx context.Context) error {
		createdTag, err = s.repo.CreateIssueTriageTag(txCtx, tag)
		return err
	})

	return createdTag, err
}

func (s *svc) DeleteIssueTriageTagDefinition(ctx context.Context, name string, typ jiraent.IssueTriageTagType) error {
	var err error

	err = s.db.Transaction(ctx, func(txCtx context.Context) error {
		_, err = s.repo.DeleteIssueTriageTag(txCtx, name, typ)
		return err
	})
	return err
}
