package flags

import (
	"path"
	"path/filepath"
	"reflect"
	"runtime"
	"strings"
	"testing"
)

type TestComplete struct {
}

func (t *TestComplete) Complete(match string) []Completion {
	options := []string{
		"hello world",
		"hello universe",
		"hello multiverse",
	}

	ret := make([]Completion, 0, len(options))

	for _, o := range options {
		if strings.HasPrefix(o, match) {
			ret = append(ret, Completion{
				Item: o,
			})
		}
	}

	return ret
}

var completionTestOptions struct {
	Verbose bool `short:"v" long:"verbose"`
	Debug   bool `short:"d" long:"debug"`
	Version bool `long:"version"`

	AddCommand struct {
		Positional struct {
			Filename Filename
		} `positional-args:"yes"`
	} `command:"add"`

	AddMultiCommand struct {
		Positional struct {
			Filename []Filename
		} `positional-args:"yes"`
	} `command:"add-multi"`

	RemoveCommand struct {
		Other bool     `short:"o"`
		File  Filename `short:"f" long:"filename"`
	} `command:"rm"`

	RenameCommand struct {
		Completed TestComplete `short:"c" long:"completed"`
	} `command:"rename"`
}

func TestCompletion(t *testing.T) {
	_, sourcefile, _, _ := runtime.Caller(0)
	sourcedir := filepath.Join(filepath.SplitList(path.Dir(sourcefile))...)

	excompl := []string{filepath.Join(sourcedir, "completion.go"), filepath.Join(sourcedir, "completion_test.go")}

	tests := []struct {
		Args      []string
		Completed []string
	}{
		{
			// Short names
			[]string{"-"},
			[]string{"-d", "-v"},
		},

		{
			// Short names concatenated
			[]string{"-dv"},
			[]string{"-dv"},
		},

		{
			// Long names
			[]string{"--"},
			[]string{"--debug", "--verbose", "--version"},
		},

		{
			// Long names partial
			[]string{"--ver"},
			[]string{"--verbose", "--version"},
		},

		{
			// Commands
			[]string{""},
			[]string{"add", "add-multi", "rename", "rm"},
		},

		{
			// Commands partial
			[]string{"r"},
			[]string{"rename", "rm"},
		},

		{
			// Positional filename
			[]string{"add", filepath.Join(sourcedir, "completion")},
			excompl,
		},

		{
			// Multiple positional filename (1 arg)
			[]string{"add-multi", filepath.Join(sourcedir, "completion")},
			excompl,
		},
		{
			// Multiple positional filename (2 args)
			[]string{"add-multi", filepath.Join(sourcedir, "completion.go"), filepath.Join(sourcedir, "completion")},
			excompl,
		},
		{
			// Multiple positional filename (3 args)
			[]string{"add-multi", filepath.Join(sourcedir, "completion.go"), filepath.Join(sourcedir, "completion.go"), filepath.Join(sourcedir, "completion")},
			excompl,
		},

		{
			// Flag filename
			[]string{"rm", "-f", path.Join(sourcedir, "completion")},
			excompl,
		},

		{
			// Flag short concat last filename
			[]string{"rm", "-of", path.Join(sourcedir, "completion")},
			excompl,
		},

		{
			// Flag concat filename
			[]string{"rm", "-f" + path.Join(sourcedir, "completion")},
			[]string{"-f" + excompl[0], "-f" + excompl[1]},
		},

		{
			// Flag equal concat filename
			[]string{"rm", "-f=" + path.Join(sourcedir, "completion")},
			[]string{"-f=" + excompl[0], "-f=" + excompl[1]},
		},

		{
			// Flag concat long filename
			[]string{"rm", "--filename=" + path.Join(sourcedir, "completion")},
			[]string{"--filename=" + excompl[0], "--filename=" + excompl[1]},
		},

		{
			// Flag long filename
			[]string{"rm", "--filename", path.Join(sourcedir, "completion")},
			excompl,
		},

		{
			// Custom completed
			[]string{"rename", "-c", "hello un"},
			[]string{"hello universe"},
		},
	}

	p := NewParser(&completionTestOptions, Default)
	c := &completion{parser: p}

	for _, test := range tests {
		ret := c.complete(test.Args)
		items := make([]string, len(ret))

		for i, v := range ret {
			items[i] = v.Item
		}

		if !reflect.DeepEqual(items, test.Completed) {
			t.Errorf("Args: %#v\n  Expected: %#v\n  Got:     %#v", test.Args, test.Completed, items)
		}
	}
}
