// +build !windows

package libcontainerd

import "fmt"

// WithRemoteAddr sets the external containerd socket to connect to.
func WithRemoteAddr(addr string) RemoteOption {
	return rpcAddr(addr)
}

type rpcAddr string

func (a rpcAddr) Apply(r Remote) error {
	if remote, ok := r.(*remote); ok {
		remote.GRPC.Address = string(a)
		return nil
	}
	return fmt.Errorf("WithRemoteAddr option not supported for this remote")
}

// WithRemoteAddrUser sets the uid and gid to create the RPC address with
func WithRemoteAddrUser(uid, gid int) RemoteOption {
	return rpcUser{uid, gid}
}

type rpcUser struct {
	uid int
	gid int
}

func (u rpcUser) Apply(r Remote) error {
	if remote, ok := r.(*remote); ok {
		remote.GRPC.Uid = u.uid
		remote.GRPC.Gid = u.gid
		return nil
	}
	return fmt.Errorf("WithRemoteAddr option not supported for this remote")
}

// WithStartDaemon defines if libcontainerd should also run containerd daemon.
func WithStartDaemon(start bool) RemoteOption {
	return startDaemon(start)
}

type startDaemon bool

func (s startDaemon) Apply(r Remote) error {
	if remote, ok := r.(*remote); ok {
		remote.startDaemon = bool(s)
		return nil
	}
	return fmt.Errorf("WithStartDaemon option not supported for this remote")
}

// WithLogLevel defines which log level to starts containerd with.
// This only makes sense if WithStartDaemon() was set to true.
func WithLogLevel(lvl string) RemoteOption {
	return logLevel(lvl)
}

type logLevel string

func (l logLevel) Apply(r Remote) error {
	if remote, ok := r.(*remote); ok {
		remote.Debug.Level = string(l)
		return nil
	}
	return fmt.Errorf("WithDebugLog option not supported for this remote")
}

// WithDebugAddress defines at which location the debug GRPC connection
// should be made
func WithDebugAddress(addr string) RemoteOption {
	return debugAddress(addr)
}

type debugAddress string

func (d debugAddress) Apply(r Remote) error {
	if remote, ok := r.(*remote); ok {
		remote.Debug.Address = string(d)
		return nil
	}
	return fmt.Errorf("WithDebugAddress option not supported for this remote")
}

// WithMetricsAddress defines at which location the debug GRPC connection
// should be made
func WithMetricsAddress(addr string) RemoteOption {
	return metricsAddress(addr)
}

type metricsAddress string

func (m metricsAddress) Apply(r Remote) error {
	if remote, ok := r.(*remote); ok {
		remote.Metrics.Address = string(m)
		return nil
	}
	return fmt.Errorf("WithMetricsAddress option not supported for this remote")
}

// WithSnapshotter defines snapshotter driver should be used
func WithSnapshotter(name string) RemoteOption {
	return snapshotter(name)
}

type snapshotter string

func (s snapshotter) Apply(r Remote) error {
	if remote, ok := r.(*remote); ok {
		remote.snapshotter = string(s)
		return nil
	}
	return fmt.Errorf("WithSnapshotter option not supported for this remote")
}

// WithPlugin allow configuring a containerd plugin
// configuration values passed needs to be quoted if quotes are needed in
// the toml format.
func WithPlugin(name string, conf interface{}) RemoteOption {
	return pluginConf{
		name: name,
		conf: conf,
	}
}

type pluginConf struct {
	// Name is the name of the plugin
	name string
	conf interface{}
}

func (p pluginConf) Apply(r Remote) error {
	if remote, ok := r.(*remote); ok {
		remote.pluginConfs.Plugins[p.name] = p.conf
		return nil
	}
	return fmt.Errorf("WithPlugin option not supported for this remote")
}
