package worker

import (
	"context"
	"fmt"
	"time"

	"github.com/pingcap/dbaas/central/config"
	"github.com/pingcap/dbaas/central/db"
	"github.com/pingcap/dbaas/central/db/entity"
	"github.com/pingcap/dbaas/central/model/util"
)

const (
	FirstOptionalReminderTimeout  = 24 * time.Hour
	SecondOptionalReminderTimeout = 7 * 24 * time.Hour
)

func (c BgContext) NewTenantEmailNotify() error {
	ctx := context.Background()

	t, err := c.GetTenantEntity()
	if err != nil {
		return err
	}

	if t.Plan != entity.TenantPlanNewUser {
		return nil
	}

	user, err := c.GetAdminUser(t.Email)
	if err != nil {
		return err
	}

	dbProvider := db.NewProvider()
	notificationMgr := util.NewNotificationMgr()
	tx := dbProvider.WriteDB(ctx)

	vars := map[string]string{
		"userName": user.FirstName,
		"url":      fmt.Sprintf("https://%s", config.Global().ServerConfig.FrontendDNS),
	}
	if t.CreatedAt.Add(SecondOptionalReminderTimeout).Before(time.Now()) {
		if err := notificationMgr.SendNotificationOnce(ctx, tx, t.ID, entity.NotificationSceneOptional2, string(entity.NotificationSceneOptional2), func() error {
			return c.GetMailHandler().SendMailWithTemplate(ctx, []string{t.Email}, config.EmailSubjectOptionalReminder, config.TNNewUserOptionalReminder, vars, nil)
		}); err != nil {
			return err
		}
	} else if t.CreatedAt.Add(FirstOptionalReminderTimeout).Before(time.Now()) {
		if err := notificationMgr.SendNotificationOnce(ctx, tx, t.ID, entity.NotificationSceneOptional, string(entity.NotificationSceneOptional), func() error {
			return c.GetMailHandler().SendMailWithTemplate(ctx, []string{t.Email}, config.EmailSubjectOptionalReminder, config.TNNewUserOptionalReminder, vars, nil)
		}); err != nil {
			return err
		}
	}
	return nil
}
