/**
 * Copyright IBM Corp. 2024, 2025
 */
export interface FileHandlesWithPath {
  file: FileSystemFileHandle;
  path: string;
}

export interface ILocalDirectoryRequestHandler {
  readFromFile(fileHandle: FileSystemFileHandle): Promise<string>;
  readFileForTest(fileHandle: FileSystemFileHandle): Promise<ArrayBuffer>;
  writeToFile(
    fileHandle: FileSystemFileHandle,
    content: unknown,
  ): Promise<void>;

  createFile(
    parentDirectoryHandle: FileSystemDirectoryHandle,
    fileName: string,
  ): Promise<FileSystemFileHandle>;
  createDirectory(
    parentDirectoryHandle: FileSystemDirectoryHandle,
    directoryName: string,
  ): Promise<FileSystemDirectoryHandle>;

  deleteFile(fileHandle: FileSystemFileHandle): Promise<void>;
  deleteDirectory(directoryHandle: FileSystemDirectoryHandle): Promise<void>;

  renameFile(
    fileHandle: FileSystemFileHandle,
    newFileName: string,
  ): Promise<FileSystemFileHandle>;
  renameDirectory(
    parentDirectoryHandle: FileSystemDirectoryHandle,
    oldDirectoryName: string,
    newDirectoryName: string,
  ): Promise<FileSystemDirectoryHandle>;

  copyFile(
    sourceFileHandle: FileSystemFileHandle,
    targetParentDirectoryHandle: FileSystemDirectoryHandle,
    targetFileName: string,
  ): Promise<FileSystemFileHandle>;
  copyDirectory(
    sourceDirectoryHandle: FileSystemDirectoryHandle,
    targetParentDirectoryHandle: FileSystemDirectoryHandle,
    targetDirectoryName: string,
  ): Promise<FileSystemDirectoryHandle>;

  moveFile(
    sourceFileHandle: FileSystemFileHandle,
    targetParentDirectoryHandle: FileSystemDirectoryHandle,
  ): Promise<FileSystemFileHandle>;
  moveDirectory(
    sourceDirectoryHandle: FileSystemDirectoryHandle,
    targetParentDirectoryHandle: FileSystemDirectoryHandle,
  ): Promise<FileSystemDirectoryHandle>;

  isAccessPermissionRequired(
    fileSystemHandle: FileSystemHandle,
    accessLevel?: string,
  ): Promise<boolean>;
  requestAccessPermission(
    fileSystemHandle: FileSystemHandle,
    accessLevel?: string,
  ): Promise<boolean>;

  existsInDirectory(
    directoryHandle: FileSystemDirectoryHandle,
    fileName: string,
    options?: { kind: 'file' | 'directory' },
  ): Promise<boolean>;
  getAllFilesFromDirectory(
    directoryHandle: FileSystemDirectoryHandle,
    path?: string,
  ): Promise<FileHandlesWithPath[]>;
}
