package cloudconfig

type (
	DefaultConfigurationChangeReleasePhase string
)

// Enums
// Update value list `XXXValues` when update a enum
const (
	DefaultConfigurationChangeReleasePhaseApproving DefaultConfigurationChangeReleasePhase = "approving"
	DefaultConfigurationChangeReleasePhaseReleased  DefaultConfigurationChangeReleasePhase = "released"
	DefaultConfigurationChangeReleasePhaseRollback  DefaultConfigurationChangeReleasePhase = "rollbacked"
	DefaultConfigurationChangeReleasePhaseCancelled DefaultConfigurationChangeReleasePhase = "cancelled"

	ReleaseNumberNull  uint64 = 0
	ReleaseNumberFirst uint64 = 1
)

var (
	DefaultConfigurationChangeReleasePhaseValues = []DefaultConfigurationChangeReleasePhase{
		DefaultConfigurationChangeReleasePhaseApproving,
		DefaultConfigurationChangeReleasePhaseReleased,
		DefaultConfigurationChangeReleasePhaseRollback,
		DefaultConfigurationChangeReleasePhaseCancelled,
	}
	DefaultConfigurationChangeReleaseClosedValues = []DefaultConfigurationChangeReleasePhase{
		DefaultConfigurationChangeReleasePhaseReleased,
		DefaultConfigurationChangeReleasePhaseRollback,
		DefaultConfigurationChangeReleasePhaseCancelled,
	}
)

// DefaultConfigurationChangeItemReleaseDataUnion contains the released data.
type DefaultConfigurationChangeItemReleaseDataUnion struct {
	TemplateDefaultCaseBinding *TemplateDefaultCaseBindingChangeData `json:"template_default_case_binding,omitempty"`
	DefaultComponentConfig     *DefaultComponentConfigChangeData     `json:"default_component_config,omitempty"`
} // @name cloudconfig.DefaultConfigurationChangeItemReleaseDataUnion

func (u *DefaultConfigurationChangeItemReleaseDataUnion) IsReleased(released *DefaultConfigurationChangeItemReleaseDataUnion) bool {
	if released == nil {
		return false
	}

	if u.TemplateDefaultCaseBinding != nil {
		return u.TemplateDefaultCaseBinding.IsReleased(released.TemplateDefaultCaseBinding)
	}
	if u.DefaultComponentConfig != nil {
		return u.DefaultComponentConfig.IsReleased(released.DefaultComponentConfig)
	}

	return true
}

func (u *DefaultConfigurationChangeItemReleaseDataUnion) ToItemData(srcItem *DefaultConfigurationChangeItemDataUnion) *DefaultConfigurationChangeItemDataUnion {
	item := &DefaultConfigurationChangeItemDataUnion{}

	if u.TemplateDefaultCaseBinding != nil {
		item.TemplateDefaultCaseBinding = u.TemplateDefaultCaseBinding.ToItemData(srcItem.TemplateDefaultCaseBinding)
	}

	if u.DefaultComponentConfig != nil {
		item.DefaultComponentConfig = u.DefaultComponentConfig.ToItemData(srcItem.DefaultComponentConfig)
	}

	return item
}

type DefaultConfigurationChangeItemRelease struct {
	ID uint64 `json:"id"`
	// Environment is the name of the environment
	Environment string `json:"environment"`
	// ItemID is the id of DefaultConfigurationChangeItem
	ItemID uint64 `json:"item_id"`
	// Data is the data of this release
	Data *DefaultConfigurationChangeItemReleaseDataUnion `json:"data"`
	// ReleaseNumber is the number of this release, is same as the number of change release
	ReleaseNumber uint64 `json:"release_number"`
	// ParentID is the id of DefaultConfigurationChange
	ParentID uint64 `json:"parent_id"`
} // @name cloudconfig.DefaultConfigurationChangeItemRelease

type DefaultConfigurationChangeRelease struct {
	ID uint64 `json:"id"`
	// Environment is the name of the environment
	Environment string `json:"environment"`
	// Description is the description of this release
	Description string `json:"description"`
	// ReleasedAt is the last time when the change is released in `Environment`
	ReleasedAt *int64 `json:"released_at"`
	// ReleaseNumber is the number of this release.
	ReleaseNumber uint64 `json:"release_number"`
	// Phase is the phase of this release
	Phase DefaultConfigurationChangeReleasePhase `json:"phase"`
	// ApprovalID is the approval ID of this release
	ApprovalID uint64 `json:"approval_id"`
	// ParentID is the id of DefaultConfigurationChange
	ParentID uint64 `json:"parent_id"`
} // @name cloudconfig.DefaultConfigurationChangeRelease
