//go:build aws

package test_test

import (
	"path/filepath"
	"strings"
	"testing"

	"github.com/gruntwork-io/terragrunt/pkg/config"
	"github.com/gruntwork-io/terragrunt/test/helpers"
	"github.com/stretchr/testify/require"
)

const (
	testFixtureOverview = "fixtures/docs/02-overview"
)

func TestAwsDocsOverview(t *testing.T) {
	t.Parallel()

	// These docs examples specifically run here
	region := "us-east-1"

	t.Run("step-01-terragrunt.hcl", func(t *testing.T) {
		t.Parallel()

		s3BucketName := "terragrunt-test-bucket-" + strings.ToLower(helpers.UniqueID())

		stepPath := filepath.Join(testFixtureOverview, "step-01-terragrunt.hcl")

		helpers.CleanupTerraformFolder(t, stepPath)
		tmpEnvPath := helpers.CopyEnvironment(t, stepPath)
		rootPath := filepath.Join(tmpEnvPath, stepPath)

		defer helpers.DeleteS3Bucket(t, region, s3BucketName)
		defer func() {
			_, _, err := helpers.RunTerragruntCommandWithOutput(
				t,
				"terragrunt destroy -auto-approve --non-interactive --working-dir "+rootPath,
			)
			require.NoError(t, err)
		}()

		rootTerragruntConfigPath := filepath.Join(rootPath, config.DefaultTerragruntConfigPath)
		helpers.CopyTerragruntConfigAndFillPlaceholders(
			t,
			rootTerragruntConfigPath,
			rootTerragruntConfigPath,
			s3BucketName,
			"not-used",
			region,
		)

		_, _, err := helpers.RunTerragruntCommandWithOutput(
			t,
			"terragrunt run --non-interactive --backend-bootstrap --working-dir "+
				rootPath+" -- apply -auto-approve",
		)
		require.NoError(t, err)
	})

	t.Run("step-02-dependencies", func(t *testing.T) {
		t.Parallel()

		s3BucketName := "terragrunt-test-bucket-" + strings.ToLower(helpers.UniqueID())

		stepPath := filepath.Join(testFixtureOverview, "step-02-dependencies")

		helpers.CleanupTerraformFolder(t, stepPath)
		tmpEnvPath := helpers.CopyEnvironment(t, stepPath)
		rootPath := filepath.Join(tmpEnvPath, stepPath)

		defer helpers.DeleteS3Bucket(t, region, s3BucketName)
		defer func() {
			_, _, err := helpers.RunTerragruntCommandWithOutput(
				t,
				"terragrunt run --all --non-interactive --working-dir "+
					rootPath+" -- destroy -auto-approve")
			require.NoError(t, err)
		}()

		rootTerragruntConfigPath := filepath.Join(rootPath, "root.hcl")
		helpers.CopyTerragruntConfigAndFillPlaceholders(
			t,
			rootTerragruntConfigPath,
			rootTerragruntConfigPath,
			s3BucketName,
			"not-used",
			region,
		)

		_, _, err := helpers.RunTerragruntCommandWithOutput(
			t,
			"terragrunt run --all --non-interactive --backend-bootstrap --working-dir "+rootPath+" -- apply -auto-approve",
		)
		require.NoError(t, err)
	})

	t.Run("step-03-mock-outputs", func(t *testing.T) {
		t.Parallel()

		s3BucketName := "terragrunt-test-bucket-" + strings.ToLower(helpers.UniqueID())

		stepPath := filepath.Join(testFixtureOverview, "step-03-mock-outputs")

		helpers.CleanupTerraformFolder(t, stepPath)
		tmpEnvPath := helpers.CopyEnvironment(t, stepPath)
		rootPath := filepath.Join(tmpEnvPath, stepPath)

		defer helpers.DeleteS3Bucket(t, region, s3BucketName)
		defer func() {
			_, _, err := helpers.RunTerragruntCommandWithOutput(
				t,
				"terragrunt run --all --non-interactive --working-dir "+rootPath+" -- destroy -auto-approve",
			)
			require.NoError(t, err)
		}()

		rootTerragruntConfigPath := filepath.Join(rootPath, "root.hcl")
		helpers.CopyTerragruntConfigAndFillPlaceholders(
			t,
			rootTerragruntConfigPath,
			rootTerragruntConfigPath,
			s3BucketName,
			"not-used",
			region,
		)

		_, _, err := helpers.RunTerragruntCommandWithOutput(
			t,
			"terragrunt run --all --non-interactive --backend-bootstrap --working-dir "+rootPath+" -- apply -auto-approve",
		)
		require.NoError(t, err)
	})

	t.Run("step-04-configuration-hierarchy", func(t *testing.T) {
		t.Parallel()

		s3BucketName := "terragrunt-test-bucket-" + strings.ToLower(helpers.UniqueID())

		stepPath := filepath.Join(testFixtureOverview, "step-04-configuration-hierarchy")

		helpers.CleanupTerraformFolder(t, stepPath)
		tmpEnvPath := helpers.CopyEnvironment(t, stepPath)
		rootPath := filepath.Join(tmpEnvPath, stepPath)

		defer helpers.DeleteS3Bucket(t, region, s3BucketName)
		defer func() {
			_, _, err := helpers.RunTerragruntCommandWithOutput(
				t,
				"terragrunt run --all --non-interactive --working-dir "+rootPath+" -- destroy -auto-approve",
			)
			require.NoError(t, err)
		}()

		rootTerragruntConfigPath := filepath.Join(rootPath, "root.hcl")
		helpers.CopyTerragruntConfigAndFillPlaceholders(
			t,
			rootTerragruntConfigPath,
			rootTerragruntConfigPath,
			s3BucketName,
			"not-used",
			region,
		)

		_, _, err := helpers.RunTerragruntCommandWithOutput(
			t,
			"terragrunt run --all --non-interactive --backend-bootstrap --working-dir "+rootPath+" -- apply -auto-approve",
		)
		require.NoError(t, err)
	})

	t.Run("step-05-exposed-includes", func(t *testing.T) {
		t.Parallel()

		s3BucketName := "terragrunt-test-bucket-" + strings.ToLower(helpers.UniqueID())

		stepPath := filepath.Join(testFixtureOverview, "step-05-exposed-includes")

		helpers.CleanupTerraformFolder(t, stepPath)
		tmpEnvPath := helpers.CopyEnvironment(t, stepPath)
		rootPath := filepath.Join(tmpEnvPath, stepPath)

		defer helpers.DeleteS3Bucket(t, region, s3BucketName)
		defer func() {
			_, _, err := helpers.RunTerragruntCommandWithOutput(
				t,
				"terragrunt run --all --non-interactive --working-dir "+rootPath+" -- destroy -auto-approve",
			)
			require.NoError(t, err)
		}()

		rootTerragruntConfigPath := filepath.Join(rootPath, "root.hcl")
		helpers.CopyTerragruntConfigAndFillPlaceholders(
			t,
			rootTerragruntConfigPath,
			rootTerragruntConfigPath,
			s3BucketName,
			"not-used",
			region,
		)

		_, _, err := helpers.RunTerragruntCommandWithOutput(
			t,
			"terragrunt run --all --non-interactive --backend-bootstrap --working-dir "+rootPath+" -- apply -auto-approve",
		)
		require.NoError(t, err)
	})
}
