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

package arguments

import (
	"flag"
	"io/ioutil"

	"github.com/hashicorp/terraform/internal/tfdiags"
)

// Test represents the command line arguments for the "terraform test" command.
type Test struct {
	Output TestOutput
}

// TestOutput represents a subset of the arguments for "terraform test"
// related to how it presents its results. That is, it's the arguments that
// are relevant to the command's view rather than its controller.
type TestOutput struct {
	// If not an empty string, JUnitXMLFile gives a filename where JUnit-style
	// XML test result output should be written, in addition to the normal
	// output printed to the standard output and error streams.
	// (The typical usage pattern for tools that can consume this file format
	// is to configure them to look for a separate test result file on disk
	// after running the tests.)
	JUnitXMLFile string
}

// ParseTest interprets a slice of raw command line arguments into a
// Test value.
func ParseTest(args []string) (Test, tfdiags.Diagnostics) {
	var ret Test
	var diags tfdiags.Diagnostics

	// NOTE: ParseTest should still return at least a partial
	// Test even on error, containing enough information for the
	// command to report error diagnostics in a suitable way.

	f := flag.NewFlagSet("test", flag.ContinueOnError)
	f.SetOutput(ioutil.Discard)
	f.Usage = func() {}
	f.StringVar(&ret.Output.JUnitXMLFile, "junit-xml", "", "Write a JUnit XML file describing the results")

	err := f.Parse(args)
	if err != nil {
		diags = diags.Append(err)
		return ret, diags
	}

	// We'll now discard all of the arguments that the flag package handled,
	// and focus only on the positional arguments for the rest of the function.
	args = f.Args()

	if len(args) != 0 {
		diags = diags.Append(tfdiags.Sourceless(
			tfdiags.Error,
			"Invalid command arguments",
			"The test command doesn't expect any positional command-line arguments.",
		))
		return ret, diags
	}

	return ret, diags
}
