// Copyright IBM Corp. 2014, 2026
// SPDX-License-Identifier: BUSL-1.1

package command

import (
	"reflect"
	"testing"

	"github.com/hashicorp/cli"
	"github.com/hashicorp/terraform/internal/addrs"
	"github.com/hashicorp/terraform/internal/command/workdir"
	"github.com/hashicorp/terraform/internal/providers"
	"github.com/posener/complete"
)

func TestMetaCompletePredictWorkspaceName(t *testing.T) {

	t.Run("test autocompletion using the local backend", func(t *testing.T) {
		// Create a temporary working directory that is empty
		td := t.TempDir()
		t.Chdir(td)

		ui := new(cli.MockUi)
		meta := &Meta{Ui: ui}

		predictor := meta.completePredictWorkspaceName()

		got := predictor.Predict(complete.Args{
			Last: "",
		})
		want := []string{"default"}
		if !reflect.DeepEqual(got, want) {
			t.Errorf("wrong result\ngot:  %#v\nwant: %#v", got, want)
		}
	})

	t.Run("test autocompletion using a state store", func(t *testing.T) {
		// Create a temporary working directory with state_store config
		td := t.TempDir()
		testCopyDir(t, testFixturePath("state-store-unchanged"), td)
		t.Chdir(td)

		// Set up pluggable state store provider mock
		mockProvider := mockPluggableStateStorageProvider()
		// Mock the existence of workspaces
		mockProvider.MockStates = map[string]interface{}{
			"default": true,
			"foobar":  true,
		}
		mockProviderAddress := addrs.NewDefaultProvider("test")
		providerSource, close := newMockProviderSource(t, map[string][]string{
			"hashicorp/test": {"1.0.0"},
		})
		defer close()

		ui := new(cli.MockUi)
		view, _ := testView(t)
		wd := workdir.NewDir(".")
		wd.OverrideOriginalWorkingDir(td)
		meta := Meta{
			WorkingDir:                wd, // Use the test's temp dir
			Ui:                        ui,
			View:                      view,
			AllowExperimentalFeatures: true,
			testingOverrides: &testingOverrides{
				Providers: map[addrs.Provider]providers.Factory{
					mockProviderAddress: providers.FactoryFixed(mockProvider),
				},
			},
			ProviderSource: providerSource,
		}

		predictor := meta.completePredictWorkspaceName()

		got := predictor.Predict(complete.Args{
			Last: "",
		})
		want := []string{"default", "foobar"}
		if !reflect.DeepEqual(got, want) {
			t.Errorf("wrong result\ngot:  %#v\nwant: %#v", got, want)
		}
	})

	t.Run("test autocompletion using a state store containing no workspaces", func(t *testing.T) {
		// Create a temporary working directory with state_store config
		td := t.TempDir()
		testCopyDir(t, testFixturePath("state-store-unchanged"), td)
		t.Chdir(td)

		// Set up pluggable state store provider mock
		mockProvider := mockPluggableStateStorageProvider()
		// No workspaces exist in the mock
		mockProvider.MockStates = map[string]interface{}{}
		mockProviderAddress := addrs.NewDefaultProvider("test")
		providerSource, close := newMockProviderSource(t, map[string][]string{
			"hashicorp/test": {"1.0.0"},
		})
		defer close()

		ui := new(cli.MockUi)
		view, _ := testView(t)
		wd := workdir.NewDir(".")
		wd.OverrideOriginalWorkingDir(td)
		meta := Meta{
			WorkingDir:                wd, // Use the test's temp dir
			Ui:                        ui,
			View:                      view,
			AllowExperimentalFeatures: true,
			testingOverrides: &testingOverrides{
				Providers: map[addrs.Provider]providers.Factory{
					mockProviderAddress: providers.FactoryFixed(mockProvider),
				},
			},
			ProviderSource: providerSource,
		}

		predictor := meta.completePredictWorkspaceName()

		got := predictor.Predict(complete.Args{
			Last: "",
		})
		if got != nil {
			t.Errorf("wrong result\ngot:  %#v\nwant: %#v", got, nil)
		}
	})
}
