// Package appexport provides per-app export/import via .fab bundles.
// A .fab file is a tar.gz (optionally password-encrypted) containing an app's
// config, database dump, and all user data — everything needed to restore
// the app to its current state.
package appexport

// ExportStackProvider provides stack data without circular imports.
// Implemented by exportAdapter in main.go (same pattern as backup.StackDataProvider).
type ExportStackProvider interface {
	// GetStackDir returns the stack's directory path (e.g., /opt/docker/stacks/nextcloud).
	GetStackDir(name string) (string, bool)
	// GetStackComposePath returns the compose file path.
	GetStackComposePath(name string) (string, bool)
	// GetStackHDDMounts returns resolved HDD bind mount host paths for the stack.
	GetStackHDDMounts(name string) []string
	// GetStackHDDPath returns the raw HDD_PATH env var from app.yaml.
	GetStackHDDPath(name string) string
	// IsStackRunning returns true if the stack has running containers.
	IsStackRunning(name string) bool
	// StopStack stops the stack via docker compose down.
	StopStack(name string) error
	// StartStack starts the stack via docker compose up -d.
	StartStack(name string) error
	// GetStackDisplayName returns the human-readable name from .felhom.yml.
	GetStackDisplayName(name string) string
	// GetStackNeedsHDD returns true if the app requires HDD storage.
	GetStackNeedsHDD(name string) bool
	// GetDockerVolumes returns named Docker volume names from the compose file.
	GetDockerVolumes(name string) []string
	// IsStackDeployed returns true if the stack has a saved app.yaml config.
	IsStackDeployed(name string) bool
	// GetDecryptedEnv returns the decrypted env var map from app.yaml.
	GetDecryptedEnv(name string) map[string]string

	// --- Import-specific methods ---

	// GetStacksBaseDir returns the base directory where stacks live (e.g., /opt/docker/stacks).
	GetStacksBaseDir() string
	// SaveEncryptedAppConfig saves app.yaml with re-encrypted sensitive fields.
	// env is the plaintext env map from the bundle; encryption uses the current server key.
	SaveEncryptedAppConfig(stackDir string, env map[string]string) error
	// RefreshStacks rescans all stacks and refreshes container state.
	RefreshStacks() error
	// RemoveStackVolumes stops the stack and removes its named Docker volumes.
	RemoveStackVolumes(name string) error
}

// DrivePathInfo holds a registered storage path and its label.
type DrivePathInfo struct {
	Path  string
	Label string
}
