package message

import (
	"context"

	"github.com/tidbcloud/account/internel/dao/entity"
	"gorm.io/gorm"
)

var _ MessageDaoIface = (*MessageDao)(nil)

type MessageDaoIface interface {
	GetEmailReminder(ctx context.Context, tx *gorm.DB, orgID uint64, scene string, identifier string) (*entity.EmailReminder, error)
	CreateEmailReminder(ctx context.Context, tx *gorm.DB, orgID uint64, scene string, identifier string) (*entity.EmailReminder, error)
	DeleteEmailReminder(ctx context.Context, tx *gorm.DB, orgID uint64, scene string, identifier string) error
}

type MessageDao struct{}

func NewDao() MessageDaoIface {
	return &MessageDao{}
}

func (m MessageDao) GetEmailReminder(ctx context.Context, tx *gorm.DB, orgID uint64, scene string, identifier string) (*entity.EmailReminder, error) {
	var emailReminder entity.EmailReminder

	err := entity.NewEmailReminderQuerySet(tx.WithContext(ctx)).TenantIDEq(entity.ID(orgID)).SceneEq(entity.NotificationScene(scene)).IdentifierEq(identifier).One(&emailReminder)

	return &emailReminder, err
}

func (m MessageDao) CreateEmailReminder(ctx context.Context, tx *gorm.DB, orgID uint64, scene string, identifier string) (*entity.EmailReminder, error) {
	var emailReminder = entity.EmailReminder{
		TenantID:   entity.ID(orgID),
		Scene:      entity.NotificationScene(scene),
		Identifier: identifier,
	}

	err := tx.WithContext(ctx).Create(&emailReminder).Error
	if err != nil {
		return nil, err
	}

	return &emailReminder, nil
}

func (m MessageDao) DeleteEmailReminder(ctx context.Context, tx *gorm.DB, orgID uint64, scene string, identifier string) error {
	return entity.NewEmailReminderQuerySet(tx.WithContext(ctx)).TenantIDEq(entity.ID(orgID)).SceneEq(entity.NotificationScene(scene)).IdentifierEq(identifier).Delete()
}
