package common

type SectionMeta struct {
	Name         string   `json:"name" yaml:"name" example:"My Section"` // friendly name of the section
	Description  string   `json:"description" yaml:"description"`
	Advanced     bool     `json:"advanced,omitempty" yaml:"advanced,omitempty"`
	Disabled     bool     `json:"disabled,omitempty" yaml:"disabled,omitempty"`
	DependsTrue  string   `json:"depends_true,omitempty" yaml:"depends_true,omitempty"`
	DependsFalse string   `json:"depends_false,omitempty" yaml:"depends_false,omitempty"`
	WikiLink     string   `json:"wiki_link,omitempty" yaml:"wiki_link,omitempty"`
	Aliases      []string `json:"aliases,omitempty" yaml:"aliases,omitempty"`
}

type Option [2]string

type SettingType string

var (
	BoolType     SettingType = "bool"
	SelectType   SettingType = "select"
	TextType     SettingType = "text"
	PasswordType SettingType = "password"
	NumberType   SettingType = "number"
	NoteType     SettingType = "note"
	EmailType    SettingType = "email"
	ListType     SettingType = "list"
)

type Setting struct {
	Setting         string      `json:"setting" yaml:"setting" example:"my_setting"`
	Name            string      `json:"name" yaml:"name" example:"My Setting"`
	Description     string      `json:"description" yaml:"description"`
	Required        bool        `json:"required" yaml:"required"`
	RequiresRestart bool        `json:"requires_restart" yaml:"requires_restart"`
	Advanced        bool        `json:"advanced,omitempty" yaml:"advanced,omitempty"`
	Type            SettingType `json:"type" yaml:"type"` // Type (string, number, bool, etc.)
	Value           any         `json:"value" yaml:"value"`
	Options         []Option    `json:"options,omitempty" yaml:"options,omitempty"`
	DependsTrue     string      `json:"depends_true,omitempty" yaml:"depends_true,omitempty"`   // If specified, this field is enabled when the specified bool setting is enabled.
	DependsFalse    string      `json:"depends_false,omitempty" yaml:"depends_false,omitempty"` // If specified, opposite behaviour of DependsTrue.
	Style           string      `json:"style,omitempty" yaml:"style,omitempty"`
	Deprecated      bool        `json:"deprecated,omitempty" yaml:"deprecated,omitempty"`
	WikiLink        string      `json:"wiki_link,omitempty" yaml:"wiki_link,omitempty"`
	Aliases         []string    `json:"aliases,omitempty" yaml:"aliases,omitempty"`
}

type Section struct {
	Section  string      `json:"section" yaml:"section" example:"my_section"`
	Meta     SectionMeta `json:"meta" yaml:"meta"`
	Settings []Setting   `json:"settings" yaml:"settings"`
}

// Member is a member of a group, and can either reference a Section or another Group, hence the two fields.
type Member struct {
	Group   string `json:"group,omitempty", yaml:"group,omitempty"`
	Section string `json:"section,omitempty", yaml:"section,omitempty"`
}

type Group struct {
	Group       string   `json:"group" yaml:"group" example:"messaging_providers"`
	Name        string   `json:"name" yaml:"name" example:"Messaging Providers"`
	Description string   `json:"description" yaml:"description" example:"Options for setting up messaging providers."`
	Members     []Member `json:"members" yaml:"members"`
}

type Config struct {
	Sections []Section `json:"sections" yaml:"sections"`
	Groups   []Group   `json:"groups" yaml:"groups"`
	// Optional order, which can interleave sections and groups.
	// If unset, falls back to sections in order, then groups in order.
	Order []Member `json:"order,omitempty" yaml:"order,omitempty"`
}

func (c *Config) removeSection(section string) {
	for i, v := range c.Sections {
		if v.Section == section {
			c.Sections = append(c.Sections[:i], c.Sections[i+1:]...)
			break
		}
	}
}
