package report

import (
	"context"
	"time"

	"github.com/tidbcloud/serverless-metering/pkg/config"
	"github.com/tidbcloud/serverless-metering/pkg/repository"
	"github.com/tidbcloud/serverless-metering/pkg/store"
)

type MeteringManager struct {
	workers     []*meteringWorker
	tickSeconds int
}

func NewMeteringManager(storage store.Storage, repo repository.ClusterBranchRepo) (*MeteringManager, error) {
	workerDefault, err := newDefaultMeteringWorker(storage, repo)
	if err != nil {
		return nil, err
	}
	// workerStorageMedium, err := newStorageMediumWorker(storage, repo)
	// if err != nil {
	// 	return nil, err
	// }
	workerStorageMediumOneDay, err := newStorageMediumWorkerOneDay(storage, repo)
	if err != nil {
		return nil, err
	}

	manager := &MeteringManager{
		workers:     []*meteringWorker{workerDefault, workerStorageMediumOneDay},
		tickSeconds: config.Global().Report.TickSeconds,
	}

	return manager, nil
}

func (m *MeteringManager) Run() {
	ticker := time.NewTicker(time.Second * time.Duration(m.tickSeconds))
	for {
		<-ticker.C
		m.runOneRound(false)
	}
}

func (m *MeteringManager) Debug() {
	m.runOneRound(true)
}

func (m *MeteringManager) runOneRound(debug bool) {
	ctx := context.TODO()
	for _, worker := range m.workers {
		worker.Run(ctx, debug)
	}
}
