import type { ProjectDirectoryPath, ProjectFilePath } from './project-path';

export type ProjectEntry =
  | {
      kind: 'file';
      path: ProjectFilePath;
      size: number;
      modifiedAt?: number;
    }
  | {
      kind: 'directory';
      path: ProjectDirectoryPath;
      modifiedAt?: number;
    };

export type ProjectStorageCapabilities = {
  directFilesystem: boolean;
  persistent: boolean;
  requiresExport: boolean;
};

export interface ProjectStorageProvider {
  readonly capabilities: ProjectStorageCapabilities;

  listEntries(signal?: AbortSignal): Promise<ProjectEntry[]>;
  readFile(path: ProjectFilePath, signal?: AbortSignal): Promise<Uint8Array | undefined>;
  writeFile(path: ProjectFilePath, data: Uint8Array, signal?: AbortSignal): Promise<void>;
  createDirectory(path: ProjectDirectoryPath, signal?: AbortSignal): Promise<void>;
  deleteFile(path: ProjectFilePath, signal?: AbortSignal): Promise<void>;
  deleteDirectory(path: ProjectDirectoryPath, signal?: AbortSignal): Promise<void>;
  moveFile(from: ProjectFilePath, to: ProjectFilePath, signal?: AbortSignal): Promise<void>;
}
