package pflag

import "fmt"

// notExistErrorMessageType specifies which flavor of "flag does not exist"
// is printed by NotExistError. This allows the related errors to be grouped
// under a single NotExistError struct without making a breaking change to
// the error message text.
type notExistErrorMessageType int

const (
	flagNotExistMessage notExistErrorMessageType = iota
	flagNoSuchFlagMessage
	flagUnknownFlagMessage
	flagUnknownShorthandFlagMessage
)

// NotExistError is the error returned when trying to access a flag that
// does not exist in the FlagSet.
type NotExistError struct {
	name                string
	specifiedShorthands string
	messageType         notExistErrorMessageType
}

// Error implements error.
func (e *NotExistError) Error() string {
	switch e.messageType {
	case flagNotExistMessage:
		return fmt.Sprintf("flag %q does not exist", e.name)

	case flagNoSuchFlagMessage:
		return fmt.Sprintf("no such flag -%v", e.name)

	case flagUnknownFlagMessage:
		return fmt.Sprintf("unknown flag: --%s", e.name)

	case flagUnknownShorthandFlagMessage:
		c := rune(e.name[0])
		return fmt.Sprintf("unknown shorthand flag: %q in -%s", c, e.specifiedShorthands)
	}

	panic(fmt.Errorf("unknown flagNotExistErrorMessageType: %v", e.messageType))
}

// GetSpecifiedName returns the name of the flag (without dashes) as it
// appeared in the parsed arguments.
func (e *NotExistError) GetSpecifiedName() string {
	return e.name
}

// GetSpecifiedShortnames returns the group of shorthand arguments
// (without dashes) that the flag appeared within. If the flag was not in a
// shorthand group, this will return an empty string.
func (e *NotExistError) GetSpecifiedShortnames() string {
	return e.specifiedShorthands
}

// ValueRequiredError is the error returned when a flag needs an argument but
// no argument was provided.
type ValueRequiredError struct {
	flag                *Flag
	specifiedName       string
	specifiedShorthands string
}

// Error implements error.
func (e *ValueRequiredError) Error() string {
	if len(e.specifiedShorthands) > 0 {
		c := rune(e.specifiedName[0])
		return fmt.Sprintf("flag needs an argument: %q in -%s", c, e.specifiedShorthands)
	}

	return fmt.Sprintf("flag needs an argument: --%s", e.specifiedName)
}

// GetFlag returns the flag for which the error occurred.
func (e *ValueRequiredError) GetFlag() *Flag {
	return e.flag
}

// GetSpecifiedName returns the name of the flag (without dashes) as it
// appeared in the parsed arguments.
func (e *ValueRequiredError) GetSpecifiedName() string {
	return e.specifiedName
}

// GetSpecifiedShortnames returns the group of shorthand arguments
// (without dashes) that the flag appeared within. If the flag was not in a
// shorthand group, this will return an empty string.
func (e *ValueRequiredError) GetSpecifiedShortnames() string {
	return e.specifiedShorthands
}

// InvalidValueError is the error returned when an invalid value is used
// for a flag.
type InvalidValueError struct {
	flag  *Flag
	value string
	cause error
}

// Error implements error.
func (e *InvalidValueError) Error() string {
	flag := e.flag
	var flagName string
	if flag.Shorthand != "" && flag.ShorthandDeprecated == "" {
		flagName = fmt.Sprintf("-%s, --%s", flag.Shorthand, flag.Name)
	} else {
		flagName = fmt.Sprintf("--%s", flag.Name)
	}
	return fmt.Sprintf("invalid argument %q for %q flag: %v", e.value, flagName, e.cause)
}

// Unwrap implements errors.Unwrap.
func (e *InvalidValueError) Unwrap() error {
	return e.cause
}

// GetFlag returns the flag for which the error occurred.
func (e *InvalidValueError) GetFlag() *Flag {
	return e.flag
}

// GetValue returns the invalid value that was provided.
func (e *InvalidValueError) GetValue() string {
	return e.value
}

// InvalidSyntaxError is the error returned when a bad flag name is passed on
// the command line.
type InvalidSyntaxError struct {
	specifiedFlag string
}

// Error implements error.
func (e *InvalidSyntaxError) Error() string {
	return fmt.Sprintf("bad flag syntax: %s", e.specifiedFlag)
}

// GetSpecifiedFlag returns the exact flag (with dashes) as it
// appeared in the parsed arguments.
func (e *InvalidSyntaxError) GetSpecifiedFlag() string {
	return e.specifiedFlag
}
