package concurrency

import (
	"github.com/pingcap/dbaas/billing2/handler/centralhandler"
	"github.com/pingcap/dbaas/billing2/utils/log"
	"github.com/pingcap/dbaas/billing2/utils/timeutils"
	"go.uber.org/zap"
)

func RunInPoolWithIDs(capacity uint, f func(uint), IDs []uint) error {
	if len(IDs) == 0 {
		return nil
	}
	if capacity > uint(len(IDs)) {
		// do not start up useless goroutine
		capacity = uint(len(IDs))
	}
	pool, err := NewPool(capacity)
	if err != nil {
		return err
	}
	now := timeutils.GetNow()
	pool.SetNow(now)
	pool.Start()
	for i := 0; i != len(IDs); i++ {
		id := IDs[i]
		pool.Submit(func() { f(id) })
	}
	pool.Wait()
	return nil
}

func RunInPoolWithAllTenants(capacity uint, f func(tenantID uint)) error {
	tenants, err := centralhandler.GetCentralHandler().GetAllTenants()
	if err != nil {
		log.Error("failed to get tenants in worker.", zap.Error(err))
		return err
	}
	tenantIDs := make([]uint, len(tenants))
	for i, tenant := range tenants {
		tenantIDs[i] = tenant.TenantID
	}
	return RunInPoolWithIDs(capacity, f, tenantIDs)
}
