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

package api

import (
	"testing"

	"github.com/hashicorp/nomad/api/internal/testutil"
	"github.com/shoenig/test/must"
)

// TestCSIVolumes_CRUD fails because of a combination of removing the job to plugin creation
// pathway and checking for plugin existence (but not yet health) at registration time.
// There are two possible solutions:
// 1. Expose the test server RPC server and force a Node.Update to fingerprint a plugin
// 2. Build and deploy a dummy CSI plugin via a job, and have it really fingerprint
func TestCSIVolumes_CRUD(t *testing.T) {
	testutil.Parallel(t)

	c, s, root := makeACLClient(t, nil, nil)
	defer s.Stop()
	v := c.CSIVolumes()

	// Successful empty result
	vols, qm, err := v.List(nil)
	must.NoError(t, err)
	// must.Positive(t, qm.LastIndex) TODO(tgross), this was always broken?
	_ = qm
	must.SliceEmpty(t, vols)

	_ = root
	// FIXME we're bailing out here until one of the fixes is available
	/*

		// Authorized QueryOpts. Use the root token to just bypass ACL details
		opts := &QueryOptions{
			Region:    "global",
			Namespace: "default",
			AuthToken: root.SecretID,
		}

		wpts := &WriteOptions{
			Region:    "global",
			Namespace: "default",
			AuthToken: root.SecretID,
		}

		// Create node plugins
		nodes, _, err := c.Nodes().List(nil)
		require.NoError(t, err)
		require.Equal(t, 1, len(nodes))

		nodeStub := nodes[0]
		node, _, err := c.Nodes().Info(nodeStub.ID, nil)
		require.NoError(t, err)
		node.CSINodePlugins = map[string]*CSIInfo{
			"foo": {
				PluginID:                 "foo",
				Healthy:                  true,
				RequiresControllerPlugin: false,
				RequiresTopologies:       false,
				NodeInfo: &CSINodeInfo{
					ID:         nodeStub.ID,
					MaxVolumes: 200,
				},
			},
		}

		// Register a volume
		// This id is here as a string to avoid importing helper, which causes the lint
		// rule that checks that the api package is isolated to fail
		id := "DEADBEEF-31B5-8F78-7986-DD404FDA0CD1"
		_, err = v.Register(&CSIVolume{
			ID:             id,
			Namespace:      "default",
			PluginID:       "foo",
			AccessMode:     CSIVolumeAccessModeMultiNodeSingleWriter,
			AttachmentMode: CSIVolumeAttachmentModeFilesystem,
			Topologies:     []*CSITopology{{Segments: map[string]string{"foo": "bar"}}},
		}, wpts)
		require.NoError(t, err)

		// Successful result with volumes
		vols, qm, err = v.List(opts)
		require.NoError(t, err)
		require.NotEqual(t, 0, qm.LastIndex)
		require.Equal(t, 1, len(vols))

		// Successful info query
		vol, qm, err := v.Info(id, opts)
		require.NoError(t, err)
		require.Equal(t, "bar", vol.Topologies[0].Segments["foo"])

		// Deregister the volume
		err = v.Deregister(id, true, wpts)
		require.NoError(t, err)

		// Successful empty result
		vols, qm, err = v.List(nil)
		require.NoError(t, err)
		require.NotEqual(t, 0, qm.LastIndex)
		require.Equal(t, 0, len(vols))

		// Failed info query
		vol, qm, err = v.Info(id, opts)
		require.Error(t, err, "missing")

	*/
}
