package flags

import (
	"reflect"
)

func (option *Option) canArgument() bool {
	if option.isBool() {
		return false
	}

	if option.isFunc() {
		return (option.Value.Type().NumIn() > 0)
	}

	return true
}

func (option *Option) clear() {
	tp := option.Value.Type()

	switch tp.Kind() {
	case reflect.Func:
		// Skip
	case reflect.Map:
		// Empty the map
		option.Value.Set(reflect.MakeMap(tp))
	default:
		zeroval := reflect.Zero(tp)
		option.Value.Set(zeroval)
	}
}

func (option *Option) isBool() bool {
	tp := option.Value.Type()

	switch tp.Kind() {
	case reflect.Bool:
		return true
	case reflect.Slice:
		return (tp.Elem().Kind() == reflect.Bool)
	}

	return false
}

func (option *Option) isFunc() bool {
	return option.Value.Type().Kind() == reflect.Func
}

func (option *Option) iniName() string {
	if len(option.iniUsedName) != 0 {
		return option.iniUsedName
	}

	name := option.tag.Get("ini-name")

	if len(name) != 0 {
		return name
	}

	return option.Field.Name
}

func (option *Option) call(value *string) error {
	var retval []reflect.Value

	if value == nil {
		retval = option.Value.Call(nil)
	} else {
		tp := option.Value.Type().In(0)

		val := reflect.New(tp)
		val = reflect.Indirect(val)

		if err := convert(*value, val, option.tag); err != nil {
			return err
		}

		retval = option.Value.Call([]reflect.Value{val})
	}

	if len(retval) == 1 && retval[0].Type() == reflect.TypeOf((*error)(nil)).Elem() {
		if retval[0].Interface() == nil {
			return nil
		}

		return retval[0].Interface().(error)
	}

	return nil
}
