// Copyright (c) The OpenTofu Authors
// SPDX-License-Identifier: MPL-2.0
// Copyright (c) 2023 HashiCorp, Inc.
// SPDX-License-Identifier: MPL-2.0

package command

import (
	"path/filepath"
	"regexp"
	"sort"
	"testing"

	"github.com/opentofu/opentofu/internal/command/arguments"
	"github.com/opentofu/opentofu/internal/command/views"
	"github.com/opentofu/opentofu/internal/command/workdir"
	"github.com/opentofu/opentofu/internal/encryption"
	"github.com/opentofu/opentofu/internal/states/statemgr"
)

// testStateBackups returns the list of backups in order of creation
// (oldest first) in the given directory.
func testStateBackups(t *testing.T, dir string) []string {
	// Find all the backups
	list, err := filepath.Glob(filepath.Join(dir, "*"+DefaultBackupExtension))
	if err != nil {
		t.Fatalf("err: %s", err)
	}

	// Sort them which will put them naturally in the right order
	sort.Strings(list)

	return list
}

func TestStateDefaultBackupExtension(t *testing.T) {
	testCwdTemp(t)

	view, done := testView(t)
	defer done(t)
	sm := &StateMeta{
		Meta{
			WorkingDir: workdir.NewDir("."),
			View:       view,
		},
	}
	viewOptions := arguments.ViewOptions{ViewType: arguments.ViewHuman}
	s, err := sm.State(t.Context(), encryption.Disabled(), views.NewState(viewOptions, view))
	if err != nil {
		t.Fatal(err)
	}

	backupPath := s.(*statemgr.Filesystem).BackupPath()
	match := regexp.MustCompile(`terraform\.tfstate\.\d+\.backup$`).MatchString
	if !match(backupPath) {
		t.Fatal("Bad backup path:", backupPath)
	}
}
