package entity

import (
	"haixun-backend/internal/model/job/domain/enum"

	"go.mongodb.org/mongo-driver/bson/primitive"
)

const RunCollectionName = "job_runs"

type StepProgress struct {
	ID        string          `bson:"id"`
	Status    enum.StepStatus `bson:"status"`
	StartedAt *int64          `bson:"started_at,omitempty"`
	EndedAt   *int64          `bson:"ended_at,omitempty"`
	Message   string          `bson:"message,omitempty"`
}

type RunProgress struct {
	Summary    string         `bson:"summary"`
	Percentage int            `bson:"percentage"`
	Steps      []StepProgress `bson:"steps"`
}

type Run struct {
	ID                primitive.ObjectID `bson:"_id,omitempty"`
	TenantID          string             `bson:"tenant_id,omitempty"`
	OwnerUID          string             `bson:"owner_uid,omitempty"`
	TemplateType      string             `bson:"template_type"`
	TemplateVersion   int                `bson:"template_version"`
	Scope             string             `bson:"scope"`
	ScopeID           string             `bson:"scope_id"`
	Status            enum.RunStatus     `bson:"status"`
	Phase             string             `bson:"phase"`
	WorkerType        string             `bson:"worker_type"`
	Payload           map[string]any     `bson:"payload"`
	Progress          RunProgress        `bson:"progress"`
	Result            map[string]any     `bson:"result,omitempty"`
	Error             string             `bson:"error,omitempty"`
	Attempt           int                `bson:"attempt"`
	MaxAttempts       int                `bson:"max_attempts"`
	DedupeKey         string             `bson:"dedupe_key,omitempty"`
	LockedBy          string             `bson:"locked_by,omitempty"`
	LockedUntil       *int64             `bson:"locked_until,omitempty"`
	CancelRequestedAt *int64             `bson:"cancel_requested_at,omitempty"`
	CancelReason      string             `bson:"cancel_reason,omitempty"`
	ScheduledAt       *int64             `bson:"scheduled_at,omitempty"`
	StartedAt         *int64             `bson:"started_at,omitempty"`
	CompletedAt       *int64             `bson:"completed_at,omitempty"`
	CreateAt          int64              `bson:"create_at"`
	UpdateAt          int64              `bson:"update_at"`
}
