package flags

import (
	"testing"
)

func TestPositional(t *testing.T) {
	var opts = struct {
		Value bool `short:"v"`

		Positional struct {
			Command  int
			Filename string
			Rest     []string
		} `positional-args:"yes" required:"yes"`
	}{}

	p := NewParser(&opts, Default)
	ret, err := p.ParseArgs([]string{"10", "arg_test.go", "a", "b"})

	if err != nil {
		t.Fatalf("Unexpected error: %v", err)
		return
	}

	if opts.Positional.Command != 10 {
		t.Fatalf("Expected opts.Positional.Command to be 10, but got %v", opts.Positional.Command)
	}

	if opts.Positional.Filename != "arg_test.go" {
		t.Fatalf("Expected opts.Positional.Filename to be \"arg_test.go\", but got %v", opts.Positional.Filename)
	}

	assertStringArray(t, opts.Positional.Rest, []string{"a", "b"})
	assertStringArray(t, ret, []string{})
}

func TestPositionalRequired(t *testing.T) {
	var opts = struct {
		Value bool `short:"v"`

		Positional struct {
			Command  int
			Filename string
			Rest     []string
		} `positional-args:"yes" required:"yes"`
	}{}

	p := NewParser(&opts, None)
	_, err := p.ParseArgs([]string{"10"})

	assertError(t, err, ErrRequired, "the required argument `Filename` was not provided")
}

func TestPositionalRequiredRest1Fail(t *testing.T) {
	var opts = struct {
		Value bool `short:"v"`

		Positional struct {
			Rest []string `required:"yes"`
		} `positional-args:"yes"`
	}{}

	p := NewParser(&opts, None)
	_, err := p.ParseArgs([]string{})

	assertError(t, err, ErrRequired, "the required argument `Rest (at least 1 argument)` was not provided")
}

func TestPositionalRequiredRest1Pass(t *testing.T) {
	var opts = struct {
		Value bool `short:"v"`

		Positional struct {
			Rest []string `required:"yes"`
		} `positional-args:"yes"`
	}{}

	p := NewParser(&opts, None)
	_, err := p.ParseArgs([]string{"rest1"})

	if err != nil {
		t.Fatalf("Unexpected error: %v", err)
		return
	}

	if len(opts.Positional.Rest) != 1 {
		t.Fatalf("Expected 1 positional rest argument")
	}

	assertString(t, opts.Positional.Rest[0], "rest1")
}

func TestPositionalRequiredRest2Fail(t *testing.T) {
	var opts = struct {
		Value bool `short:"v"`

		Positional struct {
			Rest []string `required:"2"`
		} `positional-args:"yes"`
	}{}

	p := NewParser(&opts, None)
	_, err := p.ParseArgs([]string{"rest1"})

	assertError(t, err, ErrRequired, "the required argument `Rest (at least 2 arguments, but got only 1)` was not provided")
}

func TestPositionalRequiredRest2Pass(t *testing.T) {
	var opts = struct {
		Value bool `short:"v"`

		Positional struct {
			Rest []string `required:"2"`
		} `positional-args:"yes"`
	}{}

	p := NewParser(&opts, None)
	_, err := p.ParseArgs([]string{"rest1", "rest2", "rest3"})

	if err != nil {
		t.Fatalf("Unexpected error: %v", err)
		return
	}

	if len(opts.Positional.Rest) != 3 {
		t.Fatalf("Expected 3 positional rest argument")
	}

	assertString(t, opts.Positional.Rest[0], "rest1")
	assertString(t, opts.Positional.Rest[1], "rest2")
	assertString(t, opts.Positional.Rest[2], "rest3")
}

func TestPositionalRequiredRestRangeFail(t *testing.T) {
	var opts = struct {
		Value bool `short:"v"`

		Positional struct {
			Rest []string `required:"1-2"`
		} `positional-args:"yes"`
	}{}

	p := NewParser(&opts, None)
	_, err := p.ParseArgs([]string{"rest1", "rest2", "rest3"})

	assertError(t, err, ErrRequired, "the required argument `Rest (at most 2 arguments, but got 3)` was not provided")
}

func TestPositionalRequiredRestRangeEmptyFail(t *testing.T) {
	var opts = struct {
		Value bool `short:"v"`

		Positional struct {
			Rest []string `required:"0-0"`
		} `positional-args:"yes"`
	}{}

	p := NewParser(&opts, None)
	_, err := p.ParseArgs([]string{"some", "thing"})

	assertError(t, err, ErrRequired, "the required argument `Rest (zero arguments)` was not provided")
}
