package model

import "time"

//go:generate ../tools/bin/goqueryset -in model.go

var Models = []interface{}{
	&ChaosBackend{},
	&ChaosBackendOperation{},
	&Workflow{},
	&WorkflowNode{},
	&WorkflowLock{},
}

// gen:qs
type (
	ChaosBackend struct {
		Versioned

		ProjectID   ID                 `gorm:"primaryKey;autoIncrement:false"`
		NetworkName string             `gorm:"type:VARCHAR(255);primaryKey;"`
		Status      ChaosBackendStatus `gorm:"not null;type:ENUM('ready', 'disabled', 'installing', 'uninstalling', 'install_failed', 'deleted')"`
		Message     string             `gorm:"type:VARCHAR(1024)"`
		CreatedAt   time.Time          `gorm:"created_at;type:TIMESTAMP;not null;<-:create"` // create and read only
	}

	ChaosBackendOperation struct {
		Updatable

		ProjectID   ID     `gorm:"index;not null"`
		NetworkName string `gorm:"index;not null"`
		// ChaosBackend *ChaosBackend               `gorm:"foreignkey:NetworkName"`
		Type        ChaosBackendOperationType   `gorm:"type:ENUM('enable', 'disable');not null"`
		Status      ChaosBackendOperationStatus `gorm:"type:ENUM('start', 'done');not null"`
		CreatedByID ID                          `gorm:"index;not null"`
		CompletedAt *time.Time                  `gorm:"type:TIMESTAMP"`
	}

	Workflow struct {
		Updatable
		Versioned

		ProjectID   ID             `gorm:"index;not null"`
		ClusterID   ID             `gorm:"index;not null"`
		Status      WorkflowStatus `gorm:"not null;type:ENUM('draft', 'running', 'success', 'failed', 'deleted')"`
		Message     string         `gorm:"type:VARCHAR(1024)"`
		Spec        string         `gorm:"type:JSON;not null"`
		CreatedByID ID             `gorm:"index;not null"`
		StartedAt   *time.Time     `gorm:"started_at;type:TIMESTAMP"`
		CompletedAt *time.Time     `gorm:"completed_at;type:TIMESTAMP"`
		DeletedAt   *time.Time     `gorm:"deleted_at;type:TIMESTAMP"`
		ReportLink  string         `gorm:"type:VARCHAR(512);not null;"`
		Summary     string         `gorm:"type:TEXT;not null"`
	}

	WorkflowNode struct {
		Updatable

		Name        string             `gorm:"type:VARCHAR(255);not null"`
		WorkflowID  ID                 `gorm:"index;not null"`
		Status      WorkflowNodeStatus `gorm:"not null;type:ENUM('running', 'success', 'failed')"`
		Message     string             `gorm:"type:VARCHAR(1024)"`
		CompletedAt *time.Time         `gorm:"completed_at;type:TIMESTAMP"`
	}

	WorkflowLock struct {
		Base

		Scene      string `gorm:"type:VARCHAR(256);uniqueIndex:uniq_si;not null"`
		Identifier string `gorm:"type:VARCHAR(256);uniqueIndex:uniq_si;not null"`
	}
)

type (
	WorkflowSpec struct {
		EntryNodeName string                 `json:"entryNodeName"`
		Templates     []WorkflowNodeTemplate `json:"templates"`
	}

	WorkflowNodeTemplate struct {
		Name         string               `json:"name"`
		Type         WorkflowTemplateType `json:"templateType"`
		Children     []string             `json:"children,omitempty"`
		*EmbedAction `json:",inline"`
	}

	EmbedAction struct {
		PodShutdown *PodShutdownAction `json:"podShutdown,omitempty"`
	}

	ActionTarget struct {
		Mode          TargetMode          `json:"mode"`
		Component     TargetComponentType `json:"component"`
		PodNames      []string            `json:"podNames,omitempty"`
		SelectorMode  SelectorMode        `json:"selectorMode"`
		SelectorValue string              `json:"value,omitempty"`
	}

	PodShutdownAction struct {
		Target ActionTarget `json:"target"`
	}
)
