package checkpoint

import (
	"encoding/json"
	"fmt"
	"os"
	"path/filepath"
)

const (
	StatusPending   = "pending"
	StatusRunning   = "running"
	StatusCompleted = "completed"
	StatusFailed    = "failed"
)

func saveCheckpoint(obj any, path string) error {
	b, err := json.Marshal(obj)
	if err != nil {
		return fmt.Errorf("marshal checkpoint: %w", err)
	}

	if err := os.MkdirAll(filepath.Dir(path), 0o755); err != nil {
		return fmt.Errorf("create checkpoint dir: %w", err)
	}

	// Write to temp file first, then atomic rename.
	// This ensures readers never see partially written checkpoints.
	tmp := path + ".tmp"
	if err := os.WriteFile(tmp, b, 0o644); err != nil {
		return fmt.Errorf("write temp checkpoint: %w", err)
	}
	if err := os.Rename(tmp, path); err != nil {
		return fmt.Errorf("replace checkpoint: %w", err)
	}
	return nil
}
