package arguments

import (
	"flag"
	"fmt"
)

// flagStringSlice is a flag.Value implementation which allows collecting
// multiple instances of a single flag into a slice. This is used for flags
// such as -target=aws_instance.foo and -var x=y.
type flagStringSlice []string

var _ flag.Value = (*flagStringSlice)(nil)

func (v *flagStringSlice) String() string {
	return ""
}
func (v *flagStringSlice) Set(raw string) error {
	*v = append(*v, raw)

	return nil
}

// flagNameValueSlice is a flag.Value implementation that appends raw flag
// names and values to a slice. This is used to collect a sequence of flags
// with possibly different names, preserving the overall order.
//
// FIXME: this is a copy of rawFlags from command/meta_config.go, with the
// eventual aim of replacing it altogether by gathering variables in the
// arguments package.
type flagNameValueSlice struct {
	flagName string
	items    *[]FlagNameValue
}

var _ flag.Value = flagNameValueSlice{}

func newFlagNameValueSlice(flagName string) flagNameValueSlice {
	var items []FlagNameValue
	return flagNameValueSlice{
		flagName: flagName,
		items:    &items,
	}
}

func (f flagNameValueSlice) Empty() bool {
	if f.items == nil {
		return true
	}
	return len(*f.items) == 0
}

func (f flagNameValueSlice) AllItems() []FlagNameValue {
	if f.items == nil {
		return nil
	}
	return *f.items
}

func (f flagNameValueSlice) Alias(flagName string) flagNameValueSlice {
	return flagNameValueSlice{
		flagName: flagName,
		items:    f.items,
	}
}

func (f flagNameValueSlice) String() string {
	return ""
}

func (f flagNameValueSlice) Set(str string) error {
	*f.items = append(*f.items, FlagNameValue{
		Name:  f.flagName,
		Value: str,
	})
	return nil
}

type FlagNameValue struct {
	Name  string
	Value string
}

func (f FlagNameValue) String() string {
	return fmt.Sprintf("%s=%q", f.Name, f.Value)
}

// FlagIsSet returns whether a flag is explicitly set in a set of flags
func FlagIsSet(flags *flag.FlagSet, name string) bool {
	isSet := false
	flags.Visit(func(f *flag.Flag) {
		if f.Name == name {
			isSet = true
		}
	})
	return isSet
}
