package cloudconfig

type (
	DefaultConfigurationChangeItemType string
)

// Enums
// Update value list `XXXValues` when update a enum
const (
	DefaultConfigurationChangeItemTypeVersionRelease             DefaultConfigurationChangeItemType = "version_release"
	DefaultConfigurationChangeItemTypeTemplateDefaultCaseBinding DefaultConfigurationChangeItemType = "template_default_case_binding"
	DefaultConfigurationChangeItemTypeDefaultComponentConfig     DefaultConfigurationChangeItemType = "default_component_config"
)

type DefaultConfigurationChangeItemDataUnion struct {
	VersionRelease             *VersionRelease                   `json:"version_release,omitempty"`
	TemplateDefaultCaseBinding *TemplateDefaultCaseBindingChange `json:"template_default_case_binding,omitempty"`
	DefaultComponentConfig     *DefaultComponentConfigChange     `json:"default_component_config,omitempty"`
} // @name cloudconfig.DefaultConfigurationChangeItemDataUnion

func (u *DefaultConfigurationChangeItemDataUnion) Releasable() bool {
	if u.VersionRelease != nil {
		return false
	}

	if u.TemplateDefaultCaseBinding != nil {
		return true
	}

	if u.DefaultComponentConfig != nil {
		return true
	}

	return false
}

func (u *DefaultConfigurationChangeItemDataUnion) ToRelease() *DefaultConfigurationChangeItemReleaseDataUnion {
	union := &DefaultConfigurationChangeItemReleaseDataUnion{}

	if u.TemplateDefaultCaseBinding != nil {
		union.TemplateDefaultCaseBinding = u.TemplateDefaultCaseBinding.ToReleaseData(&u.TemplateDefaultCaseBinding.Modified)
	}

	if u.DefaultComponentConfig != nil {
		union.DefaultComponentConfig = u.DefaultComponentConfig.ToReleaseData(&u.DefaultComponentConfig.Modified)
	}

	return union
}

func (u *DefaultConfigurationChangeItemDataUnion) ToRollback(released *DefaultConfigurationChangeItemReleaseDataUnion) *DefaultConfigurationChangeItemReleaseDataUnion {
	union := &DefaultConfigurationChangeItemReleaseDataUnion{}

	if released == nil {
		released = &DefaultConfigurationChangeItemReleaseDataUnion{} // rollback to origin
	}

	if u.TemplateDefaultCaseBinding != nil {
		union.TemplateDefaultCaseBinding = u.TemplateDefaultCaseBinding.ToReleaseData(released.TemplateDefaultCaseBinding)
	}

	if u.DefaultComponentConfig != nil {
		union.DefaultComponentConfig = u.DefaultComponentConfig.ToReleaseData(released.DefaultComponentConfig)
	}

	return union
}

type DefaultConfigurationChangeItem struct {
	ID       uint64                                   `json:"id"`
	ItemType DefaultConfigurationChangeItemType       `json:"type"`
	Data     *DefaultConfigurationChangeItemDataUnion `json:"data"`
	ParentID uint64                                   `json:"parent_id"` // id of DefaultConfigurationChange
} // @name cloudconfig.DefaultConfigurationChangeItem

type VersionRelease struct {
	ClusterType           ClusterType `json:"cluster_type"`
	SourceVersion         string      `json:"source_version"`
	TargetVersion         string      `json:"target_version"`
	CoveringInstanceTypes []string    `json:"covering_instance_types"` // encoded Instance Types
} // @name cloudconfig.VersionRelease

// TemplateDefaultCaseBindingChangeData contains data of TemplateDefaultCaseBinding
type TemplateDefaultCaseBindingChangeData struct {
	TemplateID uint64 `json:"template_id"`
} // @name cloudconfig.TemplateDefaultCaseBindingChangeData

func (c *TemplateDefaultCaseBindingChangeData) IsReleased(released *TemplateDefaultCaseBindingChangeData) bool {
	if released == nil {
		return false
	}

	return *c == *released
}

func (c TemplateDefaultCaseBindingChangeData) ToItemData(item *TemplateDefaultCaseBindingChange) *TemplateDefaultCaseBindingChange {
	return &TemplateDefaultCaseBindingChange{
		Origin:   item.Origin,
		Modified: c,
	}
}

// TemplateDefaultCaseBindingChange contains data and information of TemplateDefaultCaseBinding.
type TemplateDefaultCaseBindingChange struct {
	Origin   TemplateDefaultCaseBinding           `json:"origin"`
	Modified TemplateDefaultCaseBindingChangeData `json:"modified"` // default as origin
} // @name cloudconfig.TemplateDefaultCaseBindingChange

func (c *TemplateDefaultCaseBindingChange) ToReleaseData(exp *TemplateDefaultCaseBindingChangeData) *TemplateDefaultCaseBindingChangeData {
	if exp != nil {
		return exp
	}

	return &TemplateDefaultCaseBindingChangeData{
		TemplateID: c.Origin.TemplateID,
	}
}

// DefaultComponentConfigChangeData contains data of DefaultComponentConfig
type DefaultComponentConfigChangeData struct {
	BaseImage string `json:"base_image"`
	ImageTag  string `json:"image_tag"`
} // @name cloudconfig.DefaultComponentConfigChangeData

func (c *DefaultComponentConfigChangeData) IsReleased(released *DefaultComponentConfigChangeData) bool {
	if released == nil {
		return false
	}

	return *c == *released
}

func (c DefaultComponentConfigChangeData) ToItemData(item *DefaultComponentConfigChange) *DefaultComponentConfigChange {
	return &DefaultComponentConfigChange{
		Origin:   item.Origin,
		Modified: c,
	}
}

// DefaultComponentConfigChange contains data and information of DefaultComponentConfig.
type DefaultComponentConfigChange struct {
	Origin   DefaultComponentConfig           `json:"origin"`
	Modified DefaultComponentConfigChangeData `json:"modified"`
} // @name cloudconfig.DefaultComponentChange

func (c *DefaultComponentConfigChange) ToReleaseData(exp *DefaultComponentConfigChangeData) *DefaultComponentConfigChangeData {
	if exp != nil {
		return exp
	}

	return &DefaultComponentConfigChangeData{
		BaseImage: c.Origin.BaseImage,
		ImageTag:  c.Origin.ImageTag,
	}
}
