package main

import (
	"context"
	"flag"

	"github.com/tidbcloud/tiinf/monitor/tilog"
	"github.com/tidbcloud/tiinf/sdk/auditlog"
	"github.com/tidbcloud/tiinf/transport/http/tigin"
	"github.com/tidbcloud/tiinf/transport/tieventbus"
	"go.uber.org/zap"

	"github.com/tidbcloud/auditlog/configs"
	"github.com/tidbcloud/auditlog/internal/dao"
	"github.com/tidbcloud/auditlog/internal/entity"
	"github.com/tidbcloud/auditlog/internal/handler"
)

var (
	configPath = flag.String("config", "/etc/dbaas/config.yaml", "DBaaS configuration file path")
)

func main() {
	flag.Parse()
	configs.SetConfigPath(*configPath)

	ctx := context.TODO()
	tilog.Info(ctx, "auditservice-subscriber start")

	// Init Eventbus
	eventbus, err := tieventbus.NewEventbus(tieventbus.EventbusConfig{
		AppName: auditlog.EventBusAppName,
	})
	if err != nil {
		tilog.Panic(ctx, "failed to init eventbus", zap.Error(err))
		return
	}

	// Init db
	cfg := configs.GetConfig()
	if err := entity.InitDB(cfg, false); err != nil {
		tilog.Panic(ctx, "failed to init db", zap.Error(err))
		return
	}

	// init service
	db := entity.GetDB()
	handler.InitAuditService(ctx, cfg, db, dao.NewAuditDao())

	// Register EventHandleFunc
	eventbus.RegisterHandler(
		tieventbus.HandlerConfig{
			EventType:  auditlog.EventBusEventType,
			Group:      auditlog.EventBusGroup,
			HandleFunc: handler.ProcessAuditLog,
			DataStruct: &auditlog.Event{},
		},
	)

	tilog.Info(ctx, "start to running auditservice-scheduler")
	err = eventbus.Run()
	if err != nil {
		tilog.Error(ctx, "failed to run eventbus", zap.Error(err))
	}

	engine := tigin.Default()
	engine.GET("/healthz", tigin.Ping)
	engine.GET("/ping", tigin.Ping)

	engine.Run("0.0.0.0:11000") //nolint:errcheck
}
