package internal

import (
	"os"

	"github.com/juju/errors"
	log "github.com/sirupsen/logrus"

	"github.com/tidbcloud/auto-deploy/internal/argocd"
	cloud_provider "github.com/tidbcloud/auto-deploy/internal/cloud-provider"
	"github.com/tidbcloud/auto-deploy/internal/constants"
	"github.com/tidbcloud/auto-deploy/internal/job"
	"github.com/tidbcloud/auto-deploy/internal/meta"
	oidc_provider "github.com/tidbcloud/auto-deploy/internal/oidc-provider"
	"github.com/tidbcloud/auto-deploy/internal/types"
)

func DestroyO11yAwsRegionK8s(args DestroyAwsRegionK8sArgs) error {
	logger := log.WithFields(log.Fields{
		"instance": args.InstanceName,
		"name":     args.RegionName,
		"meta-uri": args.MetaURI,
	})
	logger.Debug("Start to destory aws region k8s")

	account, err := types.FromAwsArn(args.RoleArn)
	if err != nil {
		return err
	}
	oidcProvider, err := oidc_provider.GetProvider(args.OidcProviderType)
	if err != nil {
		return err
	}
	logger.WithField("oidc-provider", args.OidcProviderType).Debug("Get load oidc provider")

	cloudProvider, err := cloud_provider.NewAWSCloudProvider(oidcProvider, *account, args.Region)
	if err != nil {
		return err
	}
	logger.WithField("account", account.AwsRole.AccountId).Debug("Auth to AWS")

	homeDir, err := os.UserHomeDir()
	if err != nil {
		return errors.Annotatef(err, "Failed to get home dir")
	}
	cloudProvider.WriteToLocal(homeDir, []types.Account{})
	logger.WithField("home-dir", homeDir).Info("Write temp credential files to host")

	region, err := meta.LoadRegionControl(args.MetaURI, args.InstanceName, args.RegionName)
	if err != nil {
		return err
	}
	logger.Debug("Loaded region meta")

	if region.Region != args.Region {
		return errors.BadRequestf("Region not match with meta %s != %s", region.Region, args.Region)
	}

	if region.CloudProviderType != types.AWS {
		return errors.BadRequestf("Region cloud provider is not %s", types.AWS)
	}

	cloudProvider.WriteToLocal(homeDir, region.TidbClusterAccounts)
	logger.WithField("home-dir", homeDir).Info("Write credential files to host")

	region.CloudProvider = cloudProvider
	region.OidcProvider = oidcProvider
	region.LatestRunId = oidcProvider.GetRunID()
	region.K8s.CredentialSecretName = constants.AWS_SECRET_NAME
	region.K8s.CredentialSecret = cloudProvider.GetAuthConfigYaml(constants.AWS_SECRET_NAME, region.TidbClusterAccounts)

	err = job.RunFinalizerJobs(region)
	if err != nil {
		return err
	}

	err = argocd.UnregisterK8s(&region.K8s)
	if err != nil {
		return err
	}

	err = cloudProvider.DestroyK8s(&region.K8s)
	if err != nil {
		logger.WithField("error", err).Error("Failed to destroy o11y aws region k8s")
		return err
	}

	region.JobOutputs = make(map[string]types.JobOutput)
	logger.Info("Finished to destroy o11y aws region k8s")
	err = meta.SaveRegionControl(args.MetaURI, *region)
	if err != nil {
		region.Print()
	}
	return err
}
