package dbus

type Config struct {
	See  []string `json:"see"`
	Talk []string `json:"talk"`
	Own  []string `json:"own"`

	Log    bool `json:"log,omitempty"`
	Filter bool `json:"filter"`
}

func (c *Config) Args(address, path string) (args []string) {
	argc := 2 + len(c.See) + len(c.Talk) + len(c.Own)
	if c.Log {
		argc++
	}
	if c.Filter {
		argc++
	}

	args = make([]string, 0, argc)
	args = append(args, address, path)
	for _, name := range c.See {
		args = append(args, "--see="+name)
	}
	for _, name := range c.Talk {
		args = append(args, "--talk="+name)
	}
	for _, name := range c.Own {
		args = append(args, "--own="+name)
	}
	if c.Log {
		args = append(args, "--log")
	}
	if c.Filter {
		args = append(args, "--filter")
	}

	return
}

// NewConfig returns a reference to a Config struct with optional defaults.
// If id is an empty string own defaults are omitted.
func NewConfig(id string, defaults, mpris bool) (c *Config) {
	c = &Config{Filter: true}

	if defaults {
		c.Talk = []string{"org.freedesktop.DBus", "org.freedesktop.portal.*", "org.freedesktop.Notifications"}

		if id != "" {
			c.Own = []string{id}
			if mpris {
				c.Own = append(c.Own, "org.mpris.MediaPlayer2."+id)
			}
		}
	}

	return
}