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

import { APICFileInfo } from '../../apic-mode/models/apic-file-info.model.js';
import { APICProject } from '../../apic-mode/models/apic-project.model.js';
import { AddApiFromFileFormData } from '../../component-models/models/add-api-from-file-form-data.model.js';
import { AddApiFromScratchFormData } from '../../component-models/models/add-api-from-scratch-form-data.model.js';
import { AddApiFromUrlFormData } from '../../component-models/models/add-api-from-url-form-data.model.js';
import { FileAccessType, ProjectType, SpecObject } from '../../index.js';
import { Project } from '../../lfs/models/project.model.js';
import { AssetDependencies } from '../../store/model/asset-dependency.model.js';
import { VCSFileInfo } from '../../vcs/models/vcs-file-info.model.js';
import { VCSProject } from '../../vcs/models/vcs-project.model.js';
import {
  BaseAsset,
  KindMetadata,
  Metadata,
} from '../models/base-asset.model.js';
import { FileExplorerNode } from '../models/file-explorer.model.js';
import { Response } from '../models/response-wrapper.js';

export interface VCShandle {
  repoNameWithOwner: string;
  name: string;
}
export interface APIChandle {
  orgId: string;
  name: string;
}

export interface FormOperationResponse {
  data: string;
  file: FileSystemFileHandle | VCSFileInfo | APICFileInfo;
}

export interface ApiFormOperationResponse {
  api: FormOperationResponse;
  spec: FormOperationResponse;
  datapowerAssembly?: FormOperationResponse | null;
  freeFlowPolicySequence?: FormOperationResponse | null;
  cors?: FormOperationResponse | null;
  properties?: FormOperationResponse | null;
}

export interface IFileExplorerOperationsHandler {
  /**
   * Generates the tree of objects with required info to construct the file explorer window.
   * @param projectFolderEntity The parent entity to build file explorer tree from. The projectFolderEntity can either be a directory handle or a vcs tree entry.
   * @returns A file explorer node representing the transformed equivalent of the given folder to be used for rendering the File explorer.
   */
  buildTree(
    projectFolderEntity: FileSystemDirectoryHandle | VCShandle | APIChandle,
    parentFolderEntity: FileSystemDirectoryHandle | VCShandle | APIChandle,
    id?: string,
    project?: APICProject,
  ): Promise<Response<FileExplorerNode>>;

  createFile(
    parentNode: FileExplorerNode,
    fileName: string,
    project: Project | VCSProject | APICProject,
  ): Promise<Response<FileExplorerNode>>;

  createDirectory(
    parentNode: FileExplorerNode,
    directoryName: string,
    project: Project | VCSProject | APICProject,
  ): Promise<Response<FileExplorerNode>>;

  deleteFile(
    node: FileExplorerNode,
    project: Project | VCSProject | APICProject,
  ): Promise<Response>;

  deleteDirectory(
    node: FileExplorerNode,
    project: Project | VCSProject | APICProject,
  ): Promise<Response>;

  renameFile(
    node: FileExplorerNode,
    newName: string,
    project: Project | VCSProject | APICProject,
  ): Promise<Response<FileExplorerNode>>;

  duplicateFile(
    parentNode: FileExplorerNode,
    node: FileExplorerNode,
    project: Project | VCSProject,
  ): Promise<Response<FileExplorerNode>>;

  getSelectedFolderPath(fileExplorerInfo: {
    selectedNode: FileExplorerNode | null;
  }): string;

  createAPIFileFromScratch(
    ApiFormData: AddApiFromScratchFormData,
    active: Project | VCSProject | APICProject,
    selectedFolder?: string,
  ): Promise<ApiFormOperationResponse>;

  createAPIFileFromFile(
    ApiFormData: AddApiFromFileFormData,
    active: Project | VCSProject | APICProject,
    selectedFolder?: string,
  ): Promise<ApiFormOperationResponse>;

  createAPIFileFromUrl(
    ApiFormData: AddApiFromUrlFormData,
    active: Project | VCSProject | APICProject,
    selectedFolder?: string,
  ): Promise<ApiFormOperationResponse>;

  createTestFileFromScratch(
    TestFormData: Metadata,
    active: Project | VCSProject | APICProject,
    kind: string,
    selectedFolder?: string,
  ): Promise<FileSystemFileHandle | VCSFileInfo | APICFileInfo>;

  createCountLimitDefFromScratch(
    countLimitDefData: KindMetadata,
    active: Project | VCSProject | APICProject,
    spec: object,
    selectedFolder?: string,
  ): Promise<FileSystemFileHandle | VCSFileInfo | APICFileInfo>;

  createPolicyFileFromScratch(
    policyFromData: KindMetadata,
    active: Project | VCSProject | APICProject,
    selectedFolder?: string,
  ): Promise<FormOperationResponse>;

  createFreeFlowPolicyFileFromScratch(
    policyFromData: KindMetadata,
    active: Project | VCSProject | APICProject,
    selectedFolder?: string,
  ): Promise<FormOperationResponse>;

  createGlobalPolicyFileFromScratch(
    policyFromData: KindMetadata,
    active: Project | VCSProject | APICProject,
    selectedFolder?: string,
  ): Promise<FormOperationResponse>;

  createPolicyKindFileFromScratch(
    policyKind: string,
    policyFromData: KindMetadata,
    active: Project | VCSProject | APICProject,
    selectedFolder?: string,
  ): Promise<FormOperationResponse>;

  createDatapowerAssemblyFileFromScratch(
    datapowerFormData: KindMetadata,
    active: Project | VCSProject | APICProject,
    selectedFolder?: string,
  ): Promise<FormOperationResponse>;

  generateGatewayPolicyFileFromFile(
    active: Project | VCSProject | APICProject,
    datapowerContent: string,
    selectedFolder?: string,
  ): Promise<FormOperationResponse>;

  createMcpKindFileFromScratch(
    asset: BaseAsset,
    active: Project | VCSProject | APICProject,
  ): Promise<FormOperationResponse>;

  updateApiMetadata(
    newFormData: AddApiFromScratchFormData,
    existingApiFileHandle: FileSystemFileHandle | VCSFileInfo | APICFileInfo,
    active: Project | VCSProject | APICProject,
  ): Promise<FormOperationResponse>;

  generateXSLT(
    fileName: string,
    active: Project | VCSProject | APICProject,
    content: string,
  ): Promise<FormOperationResponse>;

  handleDragAndDrop(
    sourceNode: FileExplorerNode,
    targetNode: FileExplorerNode,
    onError: (title: string, subtitle: string) => void,
    getEditorId: (
      file: FileSystemFileHandle | VCSFileInfo | APICFileInfo,
    ) => number,
    handleCloseTab: (id: number) => Promise<void>,
    active: Project | VCSProject | APICProject,
    data: AssetDependencies,
    saveFile: (
      file: FileSystemFileHandle | VCSFileInfo | APICFileInfo,
      fileContent: string,
    ) => Promise<boolean>,
  ): Promise<void>;
  /**
   * Returns the spec object template for a given policy kind
   */
  getSpecForKind(policyKind: string): SpecObject;
  /**
   * Wrapper function to write across all supported project modes.
   */
  writeToFile(
    project: ProjectType,
    file: FileAccessType,
    fileContent: string,
  ): Promise<void>;
}
