package arg

import (
	"fmt"
	"os"
)

// This example demonstrates basic usage
func Example() {
	// These are the args you would pass in on the command line
	os.Args = []string{"./example", "--foo=hello", "--bar"}

	var args struct {
		Foo string
		Bar bool
	}
	MustParse(&args)
	fmt.Println(args.Foo, args.Bar)
}

// This example demonstrates arguments that have default values
func Example_defaultValues() {
	// These are the args you would pass in on the command line
	os.Args = []string{"--help"}

	var args struct {
		Foo string
		Bar bool
	}
	args.Foo = "default value"
	MustParse(&args)
	fmt.Println(args.Foo, args.Bar)
}

// This example demonstrates arguments that are required
func Example_requiredArguments() {
	// These are the args you would pass in on the command line
	os.Args = []string{"--foo=1", "--bar"}

	var args struct {
		Foo string `arg:"required"`
		Bar bool
	}
	MustParse(&args)
}

// This example demonstrates positional arguments
func Example_positionalArguments() {
	// These are the args you would pass in on the command line
	os.Args = []string{"./example", "in", "out1", "out2", "out3"}

	var args struct {
		Input  string   `arg:"positional"`
		Output []string `arg:"positional"`
	}
	MustParse(&args)
	fmt.Println("Input:", args.Input)
	fmt.Println("Output:", args.Output)
}

// This example demonstrates arguments that have multiple values
func Example_multipleValues() {
	// The args you would pass in on the command line
	os.Args = []string{"--help"}

	var args struct {
		Database string
		IDs      []int64
	}
	MustParse(&args)
	fmt.Printf("Fetching the following IDs from %s: %q", args.Database, args.IDs)
}

// This eample demonstrates multiple value arguments that can be mixed with
// other arguments.
func Example_multipleMixed() {
	os.Args = []string{"./example", "-c", "cmd1", "db1", "-f", "file1", "db2", "-c", "cmd2", "-f", "file2", "-f", "file3", "db3", "-c", "cmd3"}
	var args struct {
		Commands  []string `arg:"-c,separate"`
		Files     []string `arg:"-f,separate"`
		Databases []string `arg:"positional"`
	}
	MustParse(&args)
	fmt.Println("Commands:", args.Commands)
	fmt.Println("Files", args.Files)
	fmt.Println("Databases", args.Databases)
}

// This example shows the usage string generated by go-arg
func Example_usageString() {
	// These are the args you would pass in on the command line
	os.Args = []string{"--help"}

	var args struct {
		Input    string   `arg:"positional"`
		Output   []string `arg:"positional"`
		Verbose  bool     `arg:"-v,help:verbosity level"`
		Dataset  string   `arg:"help:dataset to use"`
		Optimize int      `arg:"-O,help:optimization level"`
	}
	MustParse(&args)
}