package main

import (
	"context"
	"flag"

	"github.com/tidbcloud/account/commons/eventbus"

	"github.com/tidbcloud/account/admin/api"
	"github.com/tidbcloud/account/admin/models"
	"github.com/tidbcloud/account/central/jobqueue"
	"github.com/tidbcloud/account/central/jobs"
	"github.com/tidbcloud/account/central/utils"
	"github.com/tidbcloud/account/commons/config"
	"github.com/tidbcloud/pkgv2/auth/auth0"
	"github.com/tidbcloud/tiinf/monitor/tilog"
	"github.com/tidbcloud/tiinf/monitor/titracing"
	"go.uber.org/zap"
)

const (
	defaultConfigPath = "/etc/dbaas/config.yaml"
)

var (
	configPath = flag.String("config-path", defaultConfigPath, "dbaas configuration file path")
)

func main() {
	flag.Parse()
	ctx := context.Background()

	// init config
	if err := config.InitConfig(*configPath); err != nil {
		tilog.Fatal(ctx, "Initialize configuration failed", zap.Error(err))
	}
	portalAuth0 := auth0.Conf{
		Audience:                 config.Global().Auth0Config.ManagementPortalAuth0Audience,
		Secret:                   []byte(config.Global().Auth0Config.ManagementPortalAuth0Secret),
		Domain:                   config.Global().Auth0Config.ManagementPortalAuth0Domain,
		ClientCredentialAudience: config.Global().Auth0Config.ManagementPortalAuth0ClientAudience,
	}

	// init shoot cache & database
	models.InitMySQL(false)
	if err := api.InitTokenValidator(portalAuth0); err != nil {
		tilog.Fatal(ctx, "failed to init token validator", zap.Error(err))
	}

	if err := models.InitAdminModel(); err != nil {
		tilog.Fatal(ctx, "failed to init admin model", zap.Error(err))
	}

	err := utils.SetupLoggerAndSentry()
	if err != nil {
		tilog.Fatal(ctx, "failed to setup logger and sentry", zap.Error(err))
	}

	if !config.IsLocalEnv() {

		err = eventbus.Get().Run()
		if err != nil {
			tilog.Fatal(ctx, "Initialize event bus handler failed", zap.Error(err))
		}
	}

	// init job queue
	if err := jobqueue.InitDefaultJobQueue(ctx,
		config.Global().JobQueueConfig.JobQueueURL,
		config.Global().JobQueueConfig.JobQueueDLURL,
		config.Global().JobQueueConfig.JobQueueRegion,
		config.Global().JobQueueConfig.JobQueueTimeout,
	); err != nil {
		tilog.Fatal(ctx, "failed to init job queue", zap.Error(err))
	}
	if err = jobs.InitDeps(); err != nil {
		tilog.Fatal(ctx, "failed to init salesforce client", zap.Error(err))
	}

	_, err = titracing.InitJaeger("account-admin")
	if err != nil {
		tilog.Panic(ctx, "create trace provider failed", zap.Error(err))
	}
	// listen and serve on 0.0.0.0:8080 by default
	r := api.InitRouter()
	tilog.Fatal(ctx, "failed to start admin server", zap.Error(r.Run(config.Global().ServerConfig.AdminListenAddr)))
}
