package main

import (
	"context"
	"fmt"
	"time"

	"github.com/pingcap/dbaas/billing2/model/billing"

	"github.com/pingcap/dbaas/billing2/constant"
	"github.com/pingcap/dbaas/billing2/utils"

	"github.com/pingcap/dbaas/billing2/handler/cloudmarketplacehandler"
	"github.com/pingcap/dbaas/billing2/handler/cloudmarketplacehandler/cloudimpl"

	"github.com/pingcap/dbaas/billing2/handler/paymenthandler"
	"github.com/pingcap/dbaas/billing2/handler/paymenthandler/impl"
	"github.com/pingcap/dbaas/billing2/handler/ratehandler"

	"github.com/gin-contrib/pprof"
	"github.com/pingcap/dbaas/billing2/handler/eventbushandler"
	"github.com/pingcap/dbaas/billing2/handler/gcphandler/auth"
	"github.com/pingcap/dbaas/billing2/handler/sqsmeasurehandler"
	"github.com/tidbcloud/tiinf/sdk/auditlog"

	"github.com/gin-gonic/gin"
	"github.com/pingcap/dbaas/billing2/api"
	"github.com/pingcap/dbaas/billing2/config"
	"github.com/pingcap/dbaas/billing2/db"
	"github.com/pingcap/dbaas/billing2/handler/cachehandler"
	"github.com/pingcap/dbaas/billing2/utils/log"
	"github.com/pingcap/dbaas/billing2/utils/memlimit"
	"github.com/pingcap/dbaas/billing2/utils/panicIf"
	"github.com/pingcap/dbaas/billing2/utils/sentry"
	"go.uber.org/zap"
)

func main() {
	gin.DisableConsoleColor()
	panicIf.Error(config.Init())
	memlimit.SetupFromCgroup()

	_, err := db.Initialize()
	panicIf.Error(err)
	cachehandler.Init()
	ratehandler.Init()
	panicIf.Error(auth.InitWebIdentityEnv())
	panicIf.Error(sentry.SetupLoggerAndSentry())
	engine, err := api.NewService()
	panicIf.Error(err)
	pprof.Register(engine)
	panicIf.Error(auditlog.InitAuditLogSDK(context.Background(), time.Second))
	panicIf.Error(sqsmeasurehandler.SetDefaultMeasureSender())
	log.Info("get container app name", zap.Any("name", utils.GetContainerAppName()))
	if utils.GetContainerAppName() == constant.ContainerAppNameBilling2 {
		panicIf.Error(sqsmeasurehandler.Get().RunSqsMeasure())
		billing.RunPricingWorker()
	}
	panicIf.Error(eventbushandler.Get().Run())
	paymenthandler.SetPaymentHandler(&impl.PaymentHandlerImpl{})
	cloudmarketplacehandler.SetMarketplaceHandler(&cloudimpl.MarketplaceHandlerImpl{})

	log.Fatal("start billing server failed", zap.Error(engine.Run(fmt.Sprintf(":%d", config.Get().GetInt(config.BillingServerPort)))))
}
