package workers

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

func CreateCostQuotaInvoiceByTenant(tenantID uint) {
	model := (&creditriskcontrol.CostQuotaModel{})
	paymentModel := (&paymentsub.PaymentModel{})
	payable, err := paymentModel.Payable(tenantID)
	if err != nil {
		log.Error("failed check payable in cost quota invoice generate", zap.Uint("tenantID", tenantID), zap.Error(err))
		return
	}
	if !payable {
		return
	}
	billingconfigModel := &billingconfig.BillingConfigModel{}
	billingConfigID, err := billingconfigModel.GetActiveBillingConfigID(tenantID)
	if err != nil {
		return
	}
	payment, err := paymentModel.GetActivePaymentMethod(tenantID, billingConfigID)
	if err != nil {
		log.Error("failed to get payment method in cost quota invoice generate", zap.Uint("tenantID", tenantID), zap.Error(err))
		return
	}
	if (!payment.Payable) || (payment.PaymentType != entity.PaymentType_STRIPE) {
		return
	}

	if payment.ManagedBySales {
		return
	}

	generated, err := model.CreateCostQuotaInvoice(tenantID, billingConfigID)
	if err != nil {
		log.Error("failed to generate cost quota invoice", zap.Uint("tenantID", tenantID), zap.Error(err))
	} else {
		if generated {
			log.Info("success generated cost quota invoice", zap.Uint("tenantID", tenantID))
		}
	}
}

func CreateCostQuotaInvoice() error {
	if !config.Get().GetBool(config.EnableCreateCostQuotaInvoice) {
		log.Info("skip create cost quota invoice by config")
		return nil
	}
	return concurrency.RunInPoolWithAllTenants(
		config.Get().GetUint(config.DefaultWorkerConcurrency),
		CreateCostQuotaInvoiceByTenant,
	)
}
