package main

import (
	"context"
	"time"

	log "github.com/sirupsen/logrus"
	"github.com/tidbcloud/metering/pkg/common/config"
	"github.com/tidbcloud/metering/pkg/common/constants"
	"github.com/tidbcloud/metering/pkg/facade"
	"github.com/tidbcloud/metering/pkg/facade/mgmt"
	"github.com/tidbcloud/metering/pkg/schedule"
)

func main() {
	startTime := time.Now().Unix() / 60 * 60

	serviceConfig := config.ServiceConfig{
		Port:        80,
		MetricsPort: 8080,
		Vendor:      "aws",
		Region:      "us-west-2",
		Env:         "dev",
		LogLevel:    "debug",
		Bucket:      "dedicated-metering-ft-us-west-2",
		InstanceMeteringConfig: &config.InstanceMeteringConfig{
			StartTime:               startTime,
			CloudProviders:          []string{"aws", "gcp", "azure"},
			MgmtGrpcTarget:          "127.0.0.1:80",
			BillingReportSwitchTime: startTime - 60,
			TenantWithSwitchTimes:   []config.TenantFilter{},
		},
	}
	config.Init(serviceConfig)

	ctx := context.TODO()
	initCheckpoint(ctx, startTime)

	facade.MockMeasureSender(&LocalPrintMeasureSender{})

	facade.MockTiDBClusterMetaQuerier(mgmt.NewTiDBMgmtGrpcService(ctx, &LocalGrpcService{
		StartTimestamp: startTime,
	}))

	schedule.ClusterMetaTask().AsyncTicker()
	schedule.InstanceBillingTask().AsyncTicker()
	schedule.InstanceReportTask().AsyncTicker()

	// Starts in 5 minutes and lasts for 10 minutes
	time.Sleep(time.Minute * 5)
	for assertTs := startTime; assertTs <= startTime+600; assertTs += 60 {
		assertCheckpointPushed(assertTs)
		assertDataExists(assertTs)
		assertBillingData(assertTs)

		log.Infof("assertion passed %d", assertTs)
		time.Sleep(time.Minute)
	}
}

func initCheckpoint(ctx context.Context, startTime int64) {
	// set checkpoint
	err := facade.GetCheckpointReaderWriter(ctx).SaveCheckpoint(ctx, constants.ClusterMetaTaskName, startTime-60)
	if err != nil {
		panic(err)
	}
	err = facade.GetCheckpointReaderWriter(ctx).SaveCheckpoint(ctx, constants.BillingTaskName, startTime-60)
	if err != nil {
		panic(err)
	}
	err = facade.GetCheckpointReaderWriter(ctx).SaveCheckpoint(ctx, constants.ReportTaskName, startTime-60)
	if err != nil {
		panic(err)
	}
}
