package bwrap

const (
	UnshareAll = iota
	UnshareUser
	UnshareIPC
	UnsharePID
	UnshareNet
	UnshareUTS
	UnshareCGroup
	ShareNet

	UserNS
	Clearenv

	NewSession
	DieWithParent
	AsInit
)

var boolArgs = [...][]string{
	UnshareAll:    {"--unshare-all", "--unshare-user"},
	UnshareUser:   {"--unshare-user"},
	UnshareIPC:    {"--unshare-ipc"},
	UnsharePID:    {"--unshare-pid"},
	UnshareNet:    {"--unshare-net"},
	UnshareUTS:    {"--unshare-uts"},
	UnshareCGroup: {"--unshare-cgroup"},
	ShareNet:      {"--share-net"},

	UserNS:   {"--disable-userns", "--assert-userns-disabled"},
	Clearenv: {"--clearenv"},

	NewSession:    {"--new-session"},
	DieWithParent: {"--die-with-parent"},
	AsInit:        {"--as-pid-1"},
}

func (c *Config) boolArgs() Builder {
	b := boolArg{
		UserNS:   !c.UserNS,
		Clearenv: c.Clearenv,

		NewSession:    c.NewSession,
		DieWithParent: c.DieWithParent,
		AsInit:        c.AsInit,
	}

	if c.Unshare == nil {
		b[UnshareAll] = true
		b[ShareNet] = c.Net
	} else {
		b[UnshareUser] = c.Unshare.User
		b[UnshareIPC] = c.Unshare.IPC
		b[UnsharePID] = c.Unshare.PID
		b[UnshareNet] = c.Unshare.Net
		b[UnshareUTS] = c.Unshare.UTS
		b[UnshareCGroup] = c.Unshare.CGroup
	}

	return &b
}

type boolArg [len(boolArgs)]bool

func (b *boolArg) Len() (l int) {
	for i, v := range b {
		if v {
			l += len(boolArgs[i])
		}
	}
	return
}

func (b *boolArg) Append(args *[]string) {
	for i, v := range b {
		if v {
			*args = append(*args, boolArgs[i]...)
		}
	}
}