/**
 * Copyright IBM Corp. 2024, 2025
 */

import { Project } from '../../lfs/models/project.model.js';
import { VCSFileInfo } from '../models/vcs-file-info.model.js';
import { VCSProject } from '../models/vcs-project.model.js';
import { FileEntry } from '../../common/models/file-entry.model.js';
import { TreeEntry } from '../../common/models/tree-entry.model.js';
import { FileInfoWithPaths } from '../../common/file-info-with-paths.model.js';
import { VCShandle } from '../../common/interfaces/file-explorer-handler.interface.js';
import { VCSConfigData } from '../models/vcs-config-data.model.js';

export interface IVCSFileHandler {
  createFile(
    repoNameWithOwner: string,
    projectName: string,
    directoryPath: string | undefined,
    fileName: string,
    content?: string | any,
  ): Promise<TreeEntry>;
  createDirectory(
    repoNameWithOwner: string,
    directoryPath: string | undefined,
    directoryName: string,
  ): Promise<TreeEntry>;
  moveVCSFile(
    item: TreeEntry,
    targetDirectory: VCShandle,
    project: VCSProject,
  ): Promise<VCSFileInfo>;
  moveVCSFolder(
    item: TreeEntry,
    targetDirectory: VCShandle,
    project: VCSProject,
  ): Promise<FileInfoWithPaths | null>;
  renameVCSFile(
    item: TreeEntry,
    repoNameWithOwner: string,
    newName: string,
    active: VCSProject | Project,
  ): Promise<VCSFileInfo | null>;
  deleteVCSFile(
    item: TreeEntry,
    repoNameWithOwner: string,
    active: VCSProject,
  ): Promise<VCSFileInfo | null>;
  deleteVCSFolder(
    item: TreeEntry,
    repoNameWithOwner: string,
    active: VCSProject,
  ): Promise<FileInfoWithPaths | null>;
  duplicateVCSFile(
    item: FileEntry,
    active: VCSProject,
    entries: FileEntry[],
  ): Promise<VCSFileInfo | null>;
  saveVCSFile(
    fileHandle: VCSFileInfo,
    currentProject: VCSProject,
    oldContent: string,
    newContent: string,
  ): Promise<boolean>;
  updateVCSFile(fileInfo: VCSFileInfo, newContent: string): Promise<boolean>;
  getVCSFileContent(
    vcsFile: VCSFileInfo,
    fetchFromRemote?: boolean,
  ): Promise<any>;
  handleAssetUpdate(
    fileInfo: VCSFileInfo,
    currentProject: VCSProject,
    oldContent: string,
    newContent?: string,
    newPath?: string,
  ): Promise<void>;
  existsInFolder(
    sourcePath: string,
    targetPath: string,
    project: VCSProject,
  ): Promise<boolean>;
  setVCSConfigDataInMFE(
    configData: VCSConfigData,
  ): Promise<VCSConfigData | undefined>;
  getVCSConfigDataInMFE(): Promise<VCSConfigData | undefined>;
}
