package cost

import (
	"context"

	"github.com/pingcap/log"
	"github.com/tidbcloud/cost-collect/pkg/cloud/gcp"
	"github.com/tidbcloud/cost-collect/pkg/config"
	"github.com/tidbcloud/cost-collect/pkg/global"
	"github.com/tidbcloud/tiinf/transport/tieventbus"
)

type Manager struct {
	gcpClient *gcp.BigQueryClient

	eventbus tieventbus.Eventbus
	// eventPublisher is used to publish project metering data into eventbus. The default implementation is `Manager.eventPublisherImp`
	eventPublisher func(ctx context.Context, request global.Request, batchID, projectID string, items []global.Item) error
}

func (t Manager) QueryBill(ctx context.Context, request global.Request) ([]global.Item, error) {
	log.S().Debugf("%d,%d,%s,%s",
		request.TenantID, request.ProjectID, request.StartTime, request.EndTime)

	return GetProviderCost(ctx, request, t.gcpClient)
}

func (t Manager) StreamBill(ctx context.Context, request global.Request) error {
	log.S().Debugf("%d,%d,%s,%s",
		request.TenantID, request.ProjectID, request.StartTime, request.EndTime)

	return t.streamProviderCost(ctx, request)
}

func NewManager(gcpClient *gcp.BigQueryClient) *Manager {
	conf := config.GetConfig()
	m := Manager{
		gcpClient: gcpClient,
		eventbus:  NewEventbus(conf.Server.Eventbus),
	}
	m.eventPublisher = m.publish2eventbusImp
	return &m
}
