package agate

import (
	"context"
	"io"
	"unprism.ru/KRBL/agate/store"
)

// SnapshotManager is an interface that defines operations for managing and interacting with snapshots.
type SnapshotManager interface {
	// CreateSnapshot creates a new snapshot from the specified source directory, associating it with a given name and parent ID.
	// Returns the created Snapshot with its metadata or an error if the process fails.
	CreateSnapshot(ctx context.Context, sourceDir string, name string, parentID string) (*store.Snapshot, error)

	// GetSnapshotDetails retrieves detailed metadata for a specific snapshot identified by its unique snapshotID.
	// Returns a Snapshot object containing metadata
	GetSnapshotDetails(ctx context.Context, snapshotID string) (*store.Snapshot, error)

	// ListSnapshots retrieves a list of all available snapshots, returning their basic information as SnapshotInfo.
	ListSnapshots(ctx context.Context) ([]store.SnapshotInfo, error)

	// DeleteSnapshot removes a snapshot identified by snapshotID. Returns an error if the snapshot does not exist or cannot be deleted.
	DeleteSnapshot(ctx context.Context, snapshotID string) error

	// OpenFile retrieves and opens a file from the specified snapshot, returning a readable stream and an error, if any.
	OpenFile(ctx context.Context, snapshotID string, filePath string) (io.ReadCloser, error)

	// ExtractSnapshot extracts the contents of a specified snapshot to a target directory at the given path.
	// Returns an error if the snapshot ID is invalid or the extraction fails.
	ExtractSnapshot(ctx context.Context, snapshotID string, path string) error

	// UpdateSnapshotMetadata updates the metadata of an existing snapshot, allowing changes to its name.
	UpdateSnapshotMetadata(ctx context.Context, snapshotID string, newName string) error
}

type SnapshotServer interface {
	// Start initializes and begins the server's operation, handling incoming requests or processes within the provided context.
	Start(ctx context.Context) error

	// Stop gracefully shuts down the server, releasing any allocated resources and ensuring all operations are completed.
	Stop(ctx context.Context) error
}

type SnapshotClient interface {
	// ListSnapshots retrieves a list of snapshots containing basic metadata, such as ID, name, parent ID, and creation time.
	ListSnapshots(ctx context.Context) ([]store.SnapshotInfo, error)

	// FetchSnapshotDetails retrieves detailed metadata about a specific snapshot identified by snapshotID.
	FetchSnapshotDetails(ctx context.Context, snapshotID string) (*store.Snapshot, error)

	// DownloadSnapshot retrieves the snapshot content for the given snapshotID and returns it as an io.ReadCloser.
	DownloadSnapshot(ctx context.Context, snapshotID string) (io.ReadCloser, error)
}
