package domain

import (
	"strings"
	"time"
)

const CollectionNameWorkflowRun = "workflow_run"

type WorkflowRun struct {
	Meta
	WorkflowId string                `json:"workflowId" db:"workflowId"`
	Status     WorkflowRunStatusType `json:"status" db:"status"`
	Trigger    WorkflowTriggerType   `json:"trigger" db:"trigger"`
	StartedAt  time.Time             `json:"startedAt" db:"startedAt"`
	EndedAt    time.Time             `json:"endedAt" db:"endedAt"`
	Logs       []WorkflowRunLog      `json:"logs" db:"logs"`
	Error      string                `json:"error" db:"error"`
}

type WorkflowRunStatusType string

const (
	WorkflowRunStatusTypePending   WorkflowRunStatusType = "pending"
	WorkflowRunStatusTypeRunning   WorkflowRunStatusType = "running"
	WorkflowRunStatusTypeSucceeded WorkflowRunStatusType = "succeeded"
	WorkflowRunStatusTypeFailed    WorkflowRunStatusType = "failed"
	WorkflowRunStatusTypeCanceled  WorkflowRunStatusType = "canceled"
)

type WorkflowRunLog struct {
	NodeId   string                 `json:"nodeId"`
	NodeName string                 `json:"nodeName"`
	Records  []WorkflowRunLogRecord `json:"records"`
	Error    string                 `json:"error"`
}

type WorkflowRunLogRecord struct {
	Time    string              `json:"time"`
	Level   WorkflowRunLogLevel `json:"level"`
	Content string              `json:"content"`
	Error   string              `json:"error"`
}

type WorkflowRunLogLevel string

const (
	WorkflowRunLogLevelDebug WorkflowRunLogLevel = "DEBUG"
	WorkflowRunLogLevelInfo  WorkflowRunLogLevel = "INFO"
	WorkflowRunLogLevelWarn  WorkflowRunLogLevel = "WARN"
	WorkflowRunLogLevelError WorkflowRunLogLevel = "ERROR"
)

type WorkflowRunLogs []WorkflowRunLog

func (r WorkflowRunLogs) ErrorString() string {
	var builder strings.Builder
	for _, log := range r {
		if log.Error != "" {
			builder.WriteString(log.Error)
			builder.WriteString("\n")
		}
	}
	return builder.String()
}