/*
Copyright © 2024 NAME HERE <EMAIL ADDRESS>
*/
package cmd

import (
	"github.com/spf13/cobra"
	"github.com/tidbcloud/auto-deploy/internal"
	"github.com/tidbcloud/auto-deploy/internal/metrics"
)

var deployAliCloudRegionArgs = internal.DeployAliCloudRegionArgs{}

// deployAliCloudRegionCmd represents the deploy command
var deployAliCloudRegionCmd = &cobra.Command{
	Use:   "deploy-alicloud-region",
	Short: "Deploy AliCloud region services",
	Long: `Deploy all region services for AliCloud. The services is deployed by a deploy job.
All jobs is located in 'jobs-path' folder, And the deploy job can define the 
dependent job via annotation:
    tidbcloud.com/depends-on: cluster-service
And we will run the jobs as unspeced order, but if the job has dependent job,
we will run the dependent job first. If the dependent has also new dependent
job, the new dependent job also be run before dependent job.

For example:
deploy-cli deploy-alicloud-region --jobs-path etc/deploy-jobs/alicloud-nextgen-region-control \
    --region-name us-west-2-test1 \
    --controlplane-role-arn acs:ram::5841052134823325:role/auto-deploy-cli \
    --cloud-region us-west-2 \
    --k8s-config "k8s configuration" \
    --job-options "job options" \
	--meta-uri "oss://dev-auto-deploy-3325/dedicated-regions/{logical_region_name}/meta.yaml"
`,
	RunE: func(cmd *cobra.Command, _ []string) error {
		deployAliCloudRegionArgs.InstanceName = instance
		deployAliCloudRegionArgs.OidcProviderType = oidcProvider
		metrics.AddQueuedDurationMetric()
		metrics.AddPrepareDurationMetric()
		return internal.DeployAliCloudRegion(deployAliCloudRegionArgs)
	},
}

func init() {
	rootCmd.AddCommand(deployAliCloudRegionCmd)
	deployAliCloudRegionCmd.Flags().StringVarP(&deployAliCloudRegionArgs.JobPath, "jobs-path", "j", "etc/deploy-jobs/alicloud-nextgen-region-control", "Batch job directory stores definition yaml file to be deployed")
	deployAliCloudRegionCmd.Flags().StringVarP(&deployAliCloudRegionArgs.RegionName, "region-name", "n", "", "Region name")
	deployAliCloudRegionCmd.Flags().StringVarP(&deployAliCloudRegionArgs.Region, "cloud-region", "r", "", "Cloud region (location) to create k8s, for example: us-west-2, eu-central-1")
	deployAliCloudRegionCmd.Flags().StringVarP(&deployAliCloudRegionArgs.K8s, "k8s-config", "", "", "K8s configurations in yaml format")
	deployAliCloudRegionCmd.Flags().StringVar(&deployAliCloudRegionArgs.OutputBucket, "output-bucket", "", "Bucket to save intput and output, default is ${instance}-auto-deploy")
	deployAliCloudRegionCmd.Flags().StringVar(&deployAliCloudRegionArgs.TerraformStateBucket, "tf-state-bucket", "", "Bucket to save terraform state, default is ${instance}-auto-deploy-tf-state")
	deployAliCloudRegionCmd.Flags().StringVar(&deployAliCloudRegionArgs.RoleArn, "controlplane-role-arn", "", "AliCloud role arn to create k8s")
	deployAliCloudRegionCmd.Flags().StringSliceVar(&deployAliCloudRegionArgs.TidbClusterAccounts, "dataplane-role-arn", []string{}, "Dataplane account arns")
	deployAliCloudRegionCmd.Flags().StringVar(&deployAliCloudRegionArgs.ImageRegistry, "image-registry", "", "Region services and tidb cluster image registry")
	deployAliCloudRegionCmd.Flags().StringVar(&deployAliCloudRegionArgs.JobOptions, "job-options", "", "Job additional options in yaml format")
	deployAliCloudRegionCmd.Flags().StringVar(&deployAliCloudRegionArgs.GlobalOptions, "global-options", "", "The global options in yaml format")
	deployAliCloudRegionCmd.Flags().BoolVar(&deployAliCloudRegionArgs.ForceOverwriteResources, "force-overwrite-resources", false, "Whether overwrite argocd secret")
	deployAliCloudRegionCmd.Flags().StringVarP(&deployAliCloudRegionArgs.MetaURI, "meta-uri", "", "", "Where to store or read metadata of this region")
	deployAliCloudRegionCmd.Flags().StringVarP(&deployAliCloudRegionArgs.DeployType, "deploy-type", "", "DEPLOY_TYPE_DEDICATED", "Which type of region to deploy, default is dedicated, can be DEPLOY_TYPE_DEDICATED, DEPLOY_TYPE_NEXTGEN")
	deployAliCloudRegionCmd.Flags().StringVarP(&deployAliCloudRegionArgs.ServicePlan, "service-plan", "", "Premium", "Which service plan of region to deploy, can be Starter, Essential, Premium, BYOC")

	// mark required flag
	for _, flag := range []string{"jobs-path", "region-name", "cloud-region", "k8s-config", "controlplane-role-arn", "job-options", "meta-uri", "image-registry"} {
		deployAliCloudRegionCmd.MarkFlagRequired(flag)
	}
}
