// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: BUSL-1.1
package read

import (
	"testing"

	"github.com/mitchellh/cli"
	"github.com/stretchr/testify/require"
)

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

	type tc struct {
		args           []string
		expectedCode   int
		expectedErrMsg string
	}

	cases := map[string]tc{
		"nil args": {
			args:           nil,
			expectedCode:   1,
			expectedErrMsg: "Please provide required arguments",
		},
		"empty args": {
			args:           []string{},
			expectedCode:   1,
			expectedErrMsg: "Please provide required arguments",
		},
		"missing file path": {
			args:           []string{"-f"},
			expectedCode:   1,
			expectedErrMsg: "Please input file path",
		},
		"provide type and name": {
			args:           []string{"a.b.c"},
			expectedCode:   1,
			expectedErrMsg: "Must specify two arguments: resource type and resource name",
		},
		"provide type and name with -f": {
			args:           []string{"a.b.c", "name", "-f", "test.hcl"},
			expectedCode:   1,
			expectedErrMsg: "You need to provide all information in the HCL file if provide its file path",
		},
		"provide type and name with -f and other flags": {
			args:           []string{"a.b.c", "name", "-f", "test.hcl", "-namespace", "default"},
			expectedCode:   1,
			expectedErrMsg: "You need to provide all information in the HCL file if provide its file path",
		},
		"does not provide resource name after type": {
			args:           []string{"a.b.c", "-namespace", "default"},
			expectedCode:   1,
			expectedErrMsg: "Must provide resource name right after type",
		},
	}

	for desc, tc := range cases {
		t.Run(desc, func(t *testing.T) {
			ui := cli.NewMockUi()
			c := New(ui)

			require.Equal(t, tc.expectedCode, c.Run(tc.args))
			require.NotEmpty(t, ui.ErrorWriter.String())
		})
	}
}

func TestResourceRead(t *testing.T) {
	// TODO: add read test after apply checked in
	//if testing.Short() {
	//	t.Skip("too slow for testing.Short")
	//}
	//
	//t.Parallel()
	//
	//a := agent.NewTestAgent(t, ``)
	//defer a.Shutdown()
	//client := a.Client()
	//
	//ui := cli.NewMockUi()
	//c := New(ui)

	//_, _, err := client.Resource().Apply()
	//require.NoError(t, err)
	//
	//args := []string{}
	//
	//code := c.Run(args)
	//require.Equal(t, 0, code)
}