package opts

// CreateOption is used to pass options in when creating a volume
type CreateOption func(*CreateConfig)

// CreateConfig is the set of config options that can be set when creating
// a volume
type CreateConfig struct {
	Options   map[string]string
	Labels    map[string]string
	Reference string
}

// WithCreateLabels creates a CreateOption which sets the labels to the
// passed in value
func WithCreateLabels(labels map[string]string) CreateOption {
	return func(cfg *CreateConfig) {
		cfg.Labels = labels
	}
}

// WithCreateOptions creates a CreateOption which sets the options passed
// to the volume driver when creating a volume to the options passed in.
func WithCreateOptions(opts map[string]string) CreateOption {
	return func(cfg *CreateConfig) {
		cfg.Options = opts
	}
}

// WithCreateReference creats a CreateOption which sets a reference to use
// when creating a volume. This ensures that the volume is created with a reference
// already attached to it to prevent race conditions with Create and volume cleanup.
func WithCreateReference(ref string) CreateOption {
	return func(cfg *CreateConfig) {
		cfg.Reference = ref
	}
}

// GetConfig is used with `GetOption` to set options for the volumes service's
// `Get` implementation.
type GetConfig struct {
	Driver        string
	Reference     string
	ResolveStatus bool
}

// GetOption is passed to the service `Get` add extra details on the get request
type GetOption func(*GetConfig)

// WithGetDriver provides the driver to get the volume from
// If no driver is provided to `Get`, first the available metadata is checked
// to see which driver it belongs to, if that is not available all drivers are
// probed to find the volume.
func WithGetDriver(name string) GetOption {
	return func(o *GetConfig) {
		o.Driver = name
	}
}

// WithGetReference indicates to `Get` to increment the reference count for the
// retreived volume with the provided reference ID.
func WithGetReference(ref string) GetOption {
	return func(o *GetConfig) {
		o.Reference = ref
	}
}

// WithGetResolveStatus indicates to `Get` to also fetch the volume status.
// This can cause significant overhead in the volume lookup.
func WithGetResolveStatus(cfg *GetConfig) {
	cfg.ResolveStatus = true
}

// RemoveConfig is used by `RemoveOption` to store config options for remove
type RemoveConfig struct {
	PurgeOnError bool
}

// RemoveOption is used to pass options to the volumes service `Remove` implementation
type RemoveOption func(*RemoveConfig)

// WithPurgeOnError is an option passed to `Remove` which will purge all cached
// data about a volume even if there was an error while attempting to remove the
// volume.
func WithPurgeOnError(b bool) RemoveOption {
	return func(o *RemoveConfig) {
		o.PurgeOnError = b
	}
}
