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

package arguments

import (
	"errors"
	"fmt"
	"time"

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

// WorkspaceDelete represent flags and arguments specific to the `terraform workspace delete` command.
type WorkspaceDelete struct {
	Workspace

	// Flags
	Lock        bool
	LockTimeout time.Duration
	Force       bool

	// Positional arguments
	Name string
}

// ParseWorkspaceDelete processes CLI arguments, returning a WorkspaceDelete value and errors.
// If errors are encountered, an WorkspaceDelete value is still returned representing
// the best effort interpretation of the arguments.
func ParseWorkspaceDelete(args []string) (*WorkspaceDelete, tfdiags.Diagnostics) {
	var diags tfdiags.Diagnostics

	var force bool
	var stateLock bool
	var stateLockTimeout time.Duration
	cmdFlags := defaultFlagSet("workspace delete")
	cmdFlags.BoolVar(&force, "force", false, "force removal of a non-empty workspace")
	cmdFlags.BoolVar(&stateLock, "lock", true, "lock state")
	cmdFlags.DurationVar(&stateLockTimeout, "lock-timeout", 0, "lock timeout")
	if err := cmdFlags.Parse(args); err != nil {
		diags = diags.Append(tfdiags.Sourceless(
			tfdiags.Error,
			"Failed to parse command-line flags",
			err.Error(),
		))
	}

	// `workspace delete` takes only one positional argument: workspace name.
	args = cmdFlags.Args()
	var name string
	if len(args) == 0 {
		diags = diags.Append(errors.New("Expected a single argument: NAME.")) // Recreating pre-existing error from command package
	} else {

		// Obtain and validate name argument
		//
		// We purposefully don't use ValidWorkspaceName here; if a user
		// creates a workspace with an invalid name they should be able to
		// delete it easily.
		name = args[0]
		if name == "" {
			diags = diags.Append(fmt.Errorf("Expected a workspace name as an argument, instead got an empty string: %q\n", args[0]))
		}

		// Checking for extra arguments here, not with a len != 1 check above, allows the name to be returned
		args = args[1:]
		if len(args) != 0 {
			diags = diags.Append(errors.New("Expected a single argument: NAME."))
		}
	}

	return &WorkspaceDelete{
		Workspace:   Workspace{ViewType: ViewHuman},
		Name:        name,
		Lock:        stateLock,
		LockTimeout: stateLockTimeout,
		Force:       force,
	}, diags
}
