package message

import (
	"context"
	"sync"

	"github.com/tidbcloud/account/commons/config"
	"github.com/tidbcloud/account/commons/database"
	"github.com/tidbcloud/account/commons/mail"

	"github.com/tidbcloud/account/internel/dao"
	"github.com/tidbcloud/account/internel/dao/entity"
	mailv2 "github.com/tidbcloud/pkgv2/mail/v2"
	"gorm.io/gorm"
)

var _ MessageSvcIface = (*MessageSvc)(nil)

type MessageSvcIface interface {
	SendEmailByLabels(ctx context.Context, subject string, orgID uint64, scene string, identifier string, toLabel string, ccLabels []string, templateID string, templateVars map[string]string) (*entity.EmailReminder, error)
	SendEmail(ctx context.Context, subject string, orgID uint64, scene string, identifier string, emails []string, ccEmails []string, templateID string, templateVars map[string]string) (*entity.EmailReminder, error)
	HoldEmailUniqueID(ctx context.Context, orgID uint64, scene string, identifier string) (*entity.EmailReminder, error)
	ClearEmailUniqueID(ctx context.Context, orgID uint64, scene string, identifier string) error
	QueryEmailUniqueID(ctx context.Context, orgID uint64, scene string, identifier string) (*entity.EmailReminder, error)
}

type MessageSvc struct {
	db         *gorm.DB
	hub        *dao.DaoHub
	mailFacade mailv2.Facade
}

func NewMessageSvc(db *gorm.DB, hub *dao.DaoHub, facade mailv2.Facade) MessageSvcIface {
	return &MessageSvc{
		db:         db,
		hub:        hub,
		mailFacade: facade,
	}
}

var (
	messageSvcInitOnce sync.Once
	messageSvcInstance MessageSvcIface
)

func GetMessageSvc() (MessageSvcIface, error) {
	messageSvcInitOnce.Do(func() {
		messageSvcInstance = NewMessageSvc(database.DBConn.DB, dao.GetDaoHub(), mail.NewMailFacade(config.Global()))
	})
	return messageSvcInstance, nil
}
