package userbehavior

import (
	"context"
	"strings"

	"github.com/tidbcloud/devops/api"
	ubent "github.com/tidbcloud/devops/entity/userbehavior"
	"github.com/tidbcloud/devops/pkg/infra/errs"
)

func (s *svc) SuppressGTMEmail(ctx context.Context, param SuppressGTMEmailParam) (*SuppressGTMEmailResult, error) {
	if param.TenantID == 0 {
		return nil, errs.APIErrorf(api.ErrCodeInvalidArgument, "tenant_id is required")
	}
	param.CampaignName = strings.TrimSpace(param.CampaignName)
	if param.CampaignName == "" {
		return nil, errs.APIErrorf(api.ErrCodeInvalidArgument, "campaign_name is required")
	}
	param.Source = strings.TrimSpace(param.Source)
	if param.Source == "" {
		return nil, errs.APIErrorf(api.ErrCodeInvalidArgument, "source is required")
	}
	param.Reason = strings.TrimSpace(param.Reason)
	if param.Reason == "" {
		return nil, errs.APIErrorf(api.ErrCodeInvalidArgument, "reason is required")
	}

	ret, err := s.repo.SuppressGTMEmail(ctx, &ubent.GTMEmailSuppression{
		TenantID:     param.TenantID,
		CampaignName: param.CampaignName,
		Source:       param.Source,
		Reason:       param.Reason,
	})
	if err != nil {
		return nil, err
	}

	status := GTMEmailSuppressStatusNotFoundButSuppressed
	if ret.AlreadySentOrSending {
		status = GTMEmailSuppressStatusAlreadySentOrSending
	} else if ret.CancelledCount > 0 {
		status = GTMEmailSuppressStatusCancelled
	}

	return &SuppressGTMEmailResult{
		Status:         status,
		CancelledCount: ret.CancelledCount,
	}, nil
}
