package shell

import (
	"fmt"
	"strings"

	"mvdan.cc/sh/v3/syntax"
)

// ParseCommand parses a command string into the command name and arguments.
// It handles quoted arguments and other shell syntax.
func ParseCommand(command string) (string, []string, error) {
	parsed, err := syntax.NewParser().Parse(strings.NewReader(command), "")
	if err != nil {
		return "", nil, fmt.Errorf("failed to parse command: %w", err)
	}

	var cmdName string
	var cmdArgs []string

	if len(parsed.Stmts) > 0 && parsed.Stmts[0].Cmd != nil {
		if callExpr, ok := parsed.Stmts[0].Cmd.(*syntax.CallExpr); ok && len(callExpr.Args) > 0 {
			for i, arg := range callExpr.Args {
				var argStr string
				for _, part := range arg.Parts {
					if lit, ok := part.(*syntax.Lit); ok {
						argStr += lit.Value
					}
				}
				if i == 0 {
					cmdName = argStr
				} else {
					cmdArgs = append(cmdArgs, argStr)
				}
			}
		}
	}

	// Fallback if parsing produced no command name (e.g. empty string or comment only, though unlikely with valid input)
	if cmdName == "" {
		return command, nil, nil
	}

	return cmdName, cmdArgs, nil
}
