package workers

import (
	"github.com/pingcap/dbaas/billing2/config"
	"github.com/pingcap/dbaas/billing2/model/marketing/plan"
	"github.com/pingcap/dbaas/billing2/utils/concurrency"
	"github.com/pingcap/dbaas/billing2/utils/log"
	"go.uber.org/zap"
)

func POCSyncCredits() error {
	model := &plan.TenantPlanModel{}
	tenantIDs, err := model.GetAllPOCActiveTenantIDs()
	if err != nil {
		return err
	}
	err = concurrency.RunInPoolWithIDs(
		config.Get().GetUint(config.DefaultWorkerConcurrency),
		func(tenantID uint) {
			err = model.SyncPOCCreditsSalesforce(tenantID)
			if err != nil {
				log.Error("failed to sync poc credits", zap.Uint("tenantID", tenantID), zap.Error(err))
			}
		},
		tenantIDs,
	)
	return nil
}

func POCCleanup() error {
	model := &plan.TenantPlanModel{}
	tenantIDs, err := model.GetAllPOCClosingTenantIDs()
	if err != nil {
		return err
	}
	err = concurrency.RunInPoolWithIDs(
		config.Get().GetUint(config.DefaultWorkerConcurrency),
		func(tenantID uint) {
			err = model.POCCleanup(tenantID)
			if err != nil {
				log.Error("failed to cleanup poc", zap.Uint("tenantID", tenantID), zap.Error(err))
			}
		},
		tenantIDs,
	)
	return err
}

func POCCreditsEmailReminder() error {
	model := &plan.TenantPlanModel{}
	tenantIDs, err := model.GetAllPOCActiveTenantIDs()
	if err != nil {
		return err
	}
	err = concurrency.RunInPoolWithIDs(
		config.Get().GetUint(config.DefaultWorkerConcurrency),
		func(tenantID uint) {
			err = model.SendPOCReminderEmail(tenantID)
			if err != nil {
				log.Error("failed to send poc credits reminder email", zap.Uint("tenantID", tenantID), zap.Error(err))
			}
		},
		tenantIDs,
	)
	return err
}
