package fsm

// Options struct holding fsm options
type Options struct {
	// Initial state
	Initial string
	// Wrappers runs before state
	Wrappers []StateWrapper
	// DryRun mode
	DryRun bool
}

// Option func signature
type Option func(*Options)

// StateOptions holds state options
type StateOptions struct {
	DryRun bool
}

// StateDryRun says that state executes in dry run mode
func StateDryRun(b bool) StateOption {
	return func(o *StateOptions) {
		o.DryRun = b
	}
}

// StateOption func signature
type StateOption func(*StateOptions)

// InitialState sets init state for state machine
func InitialState(initial string) Option {
	return func(o *Options) {
		o.Initial = initial
	}
}

// WrapState adds a state Wrapper to a list of options passed into the fsm
func WrapState(w StateWrapper) Option {
	return func(o *Options) {
		o.Wrappers = append(o.Wrappers, w)
	}
}

// NewOptions returns new Options struct filled by passed Option
func NewOptions(opts ...Option) Options {
	options := Options{}
	for _, o := range opts {
		o(&options)
	}
	return options
}