package useralerts

import (
	"context"

	"github.com/pingcap/dbaas/central/db/entity"
	"gorm.io/gorm"
)

var (
	_ UserAlertService = (*DefaultUserAlertsServiceImpl)(nil)
)

type UserAlertService interface {
	GetUserAlertsByProjectID(ctx context.Context, tx *gorm.DB, projectID entity.ID) ([]entity.UserAlert, error)
	DeleteUserAlerts(ctx context.Context, tx *gorm.DB, projectID entity.ID, userIDs ...entity.ID) error
	CreateUserAlert(ctx context.Context, tx *gorm.DB, projectID, userID entity.ID) error
	GetUserAlertByID(ctx context.Context, tx *gorm.DB, id entity.ID) (*entity.UserAlert, error)
	GetUserAlertByUserAndProjectID(ctx context.Context, tx *gorm.DB, userID, projectID entity.ID) (*entity.UserAlert, error)
}

type DefaultUserAlertsServiceImpl struct{}

func (s *DefaultUserAlertsServiceImpl) GetUserAlertsByProjectID(ctx context.Context, tx *gorm.DB, projectID entity.ID) ([]entity.UserAlert, error) {
	var userAlerts []entity.UserAlert

	err := entity.NewUserAlertQuerySet(tx).PreloadUser().ProjectIDEq(projectID).All(&userAlerts)

	return userAlerts, err
}

func (s *DefaultUserAlertsServiceImpl) DeleteUserAlerts(ctx context.Context, tx *gorm.DB, projectID entity.ID, userAlertIDs ...entity.ID) error {
	return entity.NewUserAlertQuerySet(tx).ProjectIDEq(projectID).IDIn(userAlertIDs...).Delete()
}

func (s *DefaultUserAlertsServiceImpl) CreateUserAlert(ctx context.Context, tx *gorm.DB, projectID, userID entity.ID) error {
	return tx.Create(&entity.UserAlert{ProjectID: projectID, UserID: userID}).Error
}

func (s *DefaultUserAlertsServiceImpl) GetUserAlertByID(ctx context.Context, tx *gorm.DB, userAlertID entity.ID) (*entity.UserAlert, error) {
	var userAlert entity.UserAlert

	err := entity.NewUserAlertQuerySet(tx).PreloadUser().IDEq(userAlertID).One(&userAlert)

	return &userAlert, err
}

func (s *DefaultUserAlertsServiceImpl) GetUserAlertByUserAndProjectID(ctx context.Context, tx *gorm.DB, userID, projectID entity.ID) (*entity.UserAlert, error) {
	var userAlert entity.UserAlert

	err := entity.NewUserAlertQuerySet(tx).PreloadUser().UserIDEq(userID).ProjectIDEq(projectID).One(&userAlert)

	return &userAlert, err
}
