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

package arguments

import (
	"github.com/opentofu/opentofu/internal/tfdiags"
)

// MetadataFunctions represents the command-line arguments for the "metadata functions" command.
type MetadataFunctions struct {
	// ViewOptions specifies which view options to use
	ViewOptions ViewOptions
}

// ParseMetadataFunctions processes CLI arguments, returning a MetadataFunctions value, a closer function, and errors.
// If errors are encountered, a MetadataFunctions value is still returned representing
// the best effort interpretation of the arguments.
func ParseMetadataFunctions(args []string) (*MetadataFunctions, func(), tfdiags.Diagnostics) {
	var diags tfdiags.Diagnostics
	arguments := &MetadataFunctions{}

	cmdFlags := defaultFlagSet("metadata functions")
	arguments.ViewOptions.AddGranularFlags(cmdFlags, false, false) // Add only the -json flag

	if err := cmdFlags.Parse(args); err != nil {
		diags = diags.Append(tfdiags.Sourceless(
			tfdiags.Error,
			"Failed to parse command-line flags",
			err.Error(),
		))
	}

	closer, moreDiags := arguments.ViewOptions.Parse()
	diags = diags.Append(moreDiags)
	if diags.HasErrors() {
		return arguments, closer, diags
	}

	// The 'metadata functions' command just forces the user to use the `-json` flag but any of the diagnostics should
	// be printed as human format. This makes it clear that the success output of this command will be in json and
	// that it needs to be processed accordingly.
	// The print of the functions will be in JSON all the time.
	if arguments.ViewOptions.ViewType != ViewJSON {
		diags = diags.Append(tfdiags.Sourceless(
			tfdiags.Error,
			"Invalid arguments",
			"The `tofu metadata functions` command requires the `-json` flag.",
		))
	}
	arguments.ViewOptions.ViewType = ViewHuman
	
	return arguments, closer, diags
}
