package app

import (
	"context"

	"github.com/spf13/cobra"
	"github.com/tidbcloud/aws-shared-provider/pkg/auditlog/config"
	"github.com/tidbcloud/aws-shared-provider/pkg/auditlog/worker"
	"github.com/tidbcloud/pkgv2/log"
	"go.uber.org/zap"
)

var (
	taskIds        []string
	o11yBucketName string
	workerName     string
)

func WorkerCmd() *cobra.Command {
	workerCmd := &cobra.Command{
		Use:   "worker",
		Short: "audit-log worker",
		Run: func(cmd *cobra.Command, args []string) {
			// log level default to debug in dev env, and info in other env
			if logLevel == "" {
				logLevel = NonDevLogLevel
				if env == "dev" {
					logLevel = DevLogLevel
				}
			}
			setLogLevel(logLevel)
			logger := log.WithContextL(context.Background())

			auditLogWorkerConfig := config.AuditLogWorkerConfig{
				TaskIds:           taskIds,
				O11yBucketName:    o11yBucketName,
				BucketName:        bucketName,
				Region:            region,
				Env:               env,
				RdsSecretArn:      rdsSecretArn,
				WorkerName:        workerName,
				CloudProviderType: cloudProviderType,
				RdsSecretRegion:   rdsSecretRegion,
			}

			logger.Info("initializing audit-log worker",
				zap.Any("auditLog-worker-config", auditLogWorkerConfig))

			worker, err := worker.NewWorker(auditLogWorkerConfig)
			if err != nil {
				logger.Fatal("failed to create audit log worker", zap.Error(err))
			}

			if err = worker.Run(); err != nil {
				logger.Fatal("failed to run audit log worker", zap.Error(err))
			}
		},
	}

	workerCmd.Flags().StringArrayVar(&taskIds, "task-ids", []string{}, "task ids")
	workerCmd.Flags().StringVar(&logLevel, "log-level", "", "log level")
	workerCmd.Flags().StringVar(&bucketName, "bucket-name", "", "bucket name")
	workerCmd.Flags().StringVar(&region, "region", "", "region")
	workerCmd.Flags().StringVar(&env, "env", "", "env")
	workerCmd.Flags().StringVar(&rdsSecretArn, "rds-secret-arn", "", "rds secret arn")
	workerCmd.Flags().StringVar(&o11yBucketName, "o11y-bucket-name", "", "o11y bucket name")
	workerCmd.Flags().StringVar(&workerName, "worker-name", "", "worker-name")
	workerCmd.Flags().StringVar(&cloudProviderType, "cloud-provider-type", "", "cloud provider type")
	workerCmd.Flags().StringVar(&rdsSecretRegion, "rds-secret-region", "", "region for rds secret")

	return workerCmd
}
