package server

import (
	"fmt"
	"time"

	"github.com/tidbcloud/observability/vm-migration/internal/status"
)

// jobRecord is the persisted summary of one job execution.
//
// Each record is one JSON object per line in <migration-dir>/jobs.jsonl. The
// ID is `<kind>-<unixNano>`, which sorts lexically within a kind and is
// self-describing in API responses and log lines.
type jobRecord struct {
	ID         string   `json:"id"`
	Kind       jobKind  `json:"kind"`
	StartedAt  string   `json:"startedAt"`
	FinishedAt string   `json:"finishedAt,omitempty"`
	Result     string   `json:"result,omitempty"`
	Cancelled  bool     `json:"cancelled,omitempty"`
	Warnings   []string `json:"warnings,omitempty"`
}

// newJobID formats a unique job ID as `<kind>-<unixNano>`.
//
// Migration's start mutex serializes calls so the timestamp is unique within
// one migration. Cross-migration collisions are harmless because the URL is
// migration-scoped.
func newJobID(kind jobKind) string {
	return fmt.Sprintf("%s-%d", kind, time.Now().UnixNano())
}

// newJobRecord constructs a new in-flight jobRecord at job start time.
func newJobRecord(kind jobKind) *jobRecord {
	return &jobRecord{
		ID:        newJobID(kind),
		Kind:      kind,
		StartedAt: status.FormatTime(status.UTCNow()),
	}
}
