package system

import (
	"context"
	"errors"
	"strings"
)

type EmailRepo interface {
	Send(context.Context, []string, string, string) error
	DefaultRecipients() []string
	Enabled() bool
}

type EmailUsecase struct{ repo EmailRepo }

func NewEmailUsecase(repo EmailRepo) *EmailUsecase { return &EmailUsecase{repo: repo} }

func (uc *EmailUsecase) Send(ctx context.Context, to, subject, body string) error {
	return uc.repo.Send(ctx, strings.Split(to, ","), subject, body)
}

func (uc *EmailUsecase) Test(ctx context.Context) error {
	recipients := uc.repo.DefaultRecipients()
	if len(recipients) == 0 {
		return errors.New("未配置测试邮件收件人")
	}
	return uc.repo.Send(ctx, recipients, "test", "test")
}

func (uc *EmailUsecase) Alert(ctx context.Context, subject, body string) error {
	if !uc.repo.Enabled() {
		return nil
	}
	// ErrorToEmail splits the configured comma-separated recipient
	// string, while its explicit test endpoint deliberately sends the whole
	// value as one recipient. Keep those two contracts separate.
	configured := uc.repo.DefaultRecipients()
	recipients := make([]string, 0, len(configured))
	for _, value := range configured {
		parts := strings.Split(value, ",")
		if len(parts) > 1 && parts[len(parts)-1] == "" {
			parts = parts[:len(parts)-1]
		}
		recipients = append(recipients, parts...)
	}
	return uc.repo.Send(ctx, recipients, subject, body)
}
