package main

import (
	"flag"
	"path/filepath"

	"github.com/tidbcloud/observability/o11ydiagnosis/pkg/tasks"
	"github.com/tidbcloud/observability/o11ydiagnosis/pkg/utils"
	"github.com/tidbcloud/observability/pkg/common/metrics"
	"k8s.io/client-go/util/homedir"
	ctrl "sigs.k8s.io/controller-runtime"
	ctrlmetrics "sigs.k8s.io/controller-runtime/pkg/metrics"
)

var kubeConfigPath string
var region string
var vendor string
var account string
var resourceGroup string
var storageAccount string
var env string
var zeroPrefixExpirationDays int
var deltalakeExpirationDays int
var athenaResultsExpirationDays int
var profileExpirationDays int
var oomRecordExpirationDays int
var keyvizRecordExpirationDays int

func main() {
	flag.StringVar(&kubeConfigPath, "kube-config-path", filepath.Join(homedir.HomeDir(), ".kube", "config"), "(optional) absolute path to the kube config file")
	flag.StringVar(&region, "region", "us-west-2", "region")
	flag.StringVar(&vendor, "vendor", "aws", "vendor")
	flag.StringVar(&account, "account", "autonomous-dev", "account")
	flag.StringVar(&resourceGroup, "resourceGroup", "o11y-dev", "azure resource group of blob storage")
	flag.StringVar(&storageAccount, "storageAccount", "o11ydev", "azure storage account of blob storage")
	flag.StringVar(&env, "env", "prod", "env")
	flag.IntVar(&zeroPrefixExpirationDays, "zero-prefix-expiration-days", int(tasks.DefaultZeroPrefixExpirationDays), "expiration days for 0/, 1/, and diagnosis/data/ prefix fallback lifecycle rules; 0 disables them")
	flag.IntVar(&deltalakeExpirationDays, "deltalake-expiration-days", int(tasks.DefaultDeltalakeExpirationDays), "expiration days for deltalake/ prefix lifecycle rules; 0 disables them")
	flag.IntVar(&athenaResultsExpirationDays, "athena-results-expiration-days", int(tasks.DefaultAthenaResultsExpirationDays), "expiration days for Athena query result prefix lifecycle rules on AWS; 0 disables them")
	flag.IntVar(&profileExpirationDays, "profile-expiration-days", int(tasks.DefaultProfileExpirationDays), "expiration days for per-cluster profile lifecycle rules; 0 disables them")
	flag.IntVar(&oomRecordExpirationDays, "oom-record-expiration-days", int(tasks.DefaultOOMRecordExpirationDays), "expiration days for per-cluster oom_record lifecycle rules; 0 disables them")
	flag.IntVar(&keyvizRecordExpirationDays, "keyviz-record-expiration-days", int(tasks.DefaultKeyvizRecordExpirationDays), "expiration days for per-cluster keyviz regions lifecycle rules; 0 disables them")

	flag.Parse()

	kubeConfig := ctrl.GetConfigOrDie()
	metrics.SetupMetrics(ctrlmetrics.Registry)

	clientGroup := utils.PrepareKubeClient(kubeConfig)
	s3Client := utils.PrepareS3Client(vendor, region, account, resourceGroup, storageAccount)
	tasks.NewO11yDiagnosisTasks(clientGroup, s3Client, region, env)
	tasks.NewLifecycleConfiguration(
		clientGroup,
		s3Client,
		region,
		env,
		vendor,
		tasks.LifecycleExpirationConfig{
			ZeroPrefixExpirationDays:    tasks.ResolveZeroPrefixExpirationDays(int32(zeroPrefixExpirationDays)),
			DeltalakeExpirationDays:     tasks.ResolveDeltalakeExpirationDays(int32(deltalakeExpirationDays)),
			AthenaResultsExpirationDays: tasks.ResolveAthenaResultsExpirationDays(int32(athenaResultsExpirationDays)),
			ProfileExpirationDays:       tasks.ResolveProfileExpirationDays(int32(profileExpirationDays)),
			OOMRecordExpirationDays:     tasks.ResolveOOMRecordExpirationDays(int32(oomRecordExpirationDays)),
			KeyvizRecordExpirationDays:  tasks.ResolveKeyvizRecordExpirationDays(int32(keyvizRecordExpirationDays)),
		},
	)
}
