package interfaces

import (
	"context"
	"io"

	"unprism.ru/KRBL/agate/store"
)

// SnapshotManager defines the interface that the server needs to interact with snapshots
type SnapshotManager interface {
	// GetSnapshotDetails retrieves detailed metadata for a specific snapshot
	GetSnapshotDetails(ctx context.Context, snapshotID string) (*store.Snapshot, error)

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

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

	// CreateSnapshot creates a new snapshot from the specified source directory
	CreateSnapshot(ctx context.Context, sourceDir string, name string, parentID string) (*store.Snapshot, error)
}

// SnapshotServer defines the interface for a server that can share snapshots
type SnapshotServer interface {
	// Start initializes and begins the server's operation
	Start(ctx context.Context) error

	// Stop gracefully shuts down the server
	Stop(ctx context.Context) error
}

// SnapshotClient defines the interface for a client that can connect to a server and download snapshots
type SnapshotClient interface {
	// ListSnapshots retrieves a list of snapshots from the server
	ListSnapshots(ctx context.Context) ([]store.SnapshotInfo, error)

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

	// DownloadSnapshot downloads a snapshot from the server
	DownloadSnapshot(ctx context.Context, snapshotID string, targetDir string, localParentID string) error

	// Close closes the connection to the server
	Close() error
}
