package workers

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

var creditsModel = &marketing.CreditsPackageModel{}

func CloseExhaustedCreditsPackage() {
	ids, err := creditsModel.GetAllExhaustedPackageIDs()
	if err != nil {
		log.Error("failed get all exhausted packages", zap.Error(err))
	}
	err = concurrency.RunInPoolWithIDs(
		config.Get().GetUint(config.DefaultWorkerConcurrency),
		func(creditID uint) {
			err = creditsModel.CloseCreditsPackage(creditID, entity.CreditsPackageClosedReason_Exhausted)
			if err != nil {
				log.Error("failed to closed exhausted package", zap.Uint("creditsID", creditID), zap.Error(err))
			} else {
				log.Info("close exhausted package", zap.Uint("creditsID", creditID), zap.Error(err))
			}
		},
		ids,
	)
	if err != nil {
		log.Error("failed to close exhausted packages", zap.Error(err))
	}
}

func CloseExpiredCreditsPackage() {
	ids, err := creditsModel.GetAllExpiredPackageIDs()
	if err != nil {
		log.Error("failed get all expired packages", zap.Error(err))
	}
	err = concurrency.RunInPoolWithIDs(
		config.Get().GetUint(config.DefaultWorkerConcurrency),
		func(creditID uint) {
			err = creditsModel.CloseCreditsPackage(creditID, entity.CreditsPackageClosedReason_Expired)
			if err != nil {
				log.Error("failed to closed expired package", zap.Uint("creditsID", creditID), zap.Error(err))
			} else {
				log.Info("close expired package", zap.Uint("creditsID", creditID), zap.Error(err))
			}
		},
		ids,
	)
	if err != nil {
		log.Error("failed to close expired packages", zap.Error(err))
	}
}

func OpenNeedOpenCreditsPackage() {
	ids, err := creditsModel.GetAllNeedOpenPackagesIDs()
	if err != nil {
		log.Error("failed get all need open packages", zap.Error(err))
	}
	err = concurrency.RunInPoolWithIDs(
		config.Get().GetUint(config.OpenCreditsPackageConcurrency),
		func(creditID uint) {
			err = creditsModel.OpenCreditsPackage(creditID)
			if err != nil {
				log.Error("failed to open packages", zap.Uint("creditsID", creditID), zap.Error(err))
			} else {
				log.Info("open credits packages", zap.Uint("creditsID", creditID), zap.Error(err))
			}
		},
		ids,
	)
	if err != nil {
		log.Error("failed open need open packages", zap.Error(err))
	}
}
