/**
 * Copyright IBM Corp. 2024, 2025
 */
import { FileAccessType } from '../../api-authoring/interfaces/api-spec-handler.interface.js';
import { APICFileInfo } from '../../apic-mode/models/apic-file-info.model.js';
import { EditorTab } from '../../common/models/editor-tab.model.js';
import { FileExplorerNode } from '../../common/models/file-explorer.model.js';
import { IlintResponse } from '../../common/models/lint-response.model.js';
import { VCSFileInfo } from '../../vcs/models/vcs-file-info.model.js';

type NestedHashMap = {
  [key: string]: string;
};

type HashMap = {
  [key: string]: NestedHashMap;
};

type EditorState = {
  editorId: number;
  hm: HashMap;
  activeTab: EditorTab | -1;
  tabs: EditorTab[];
  fileExplorerInfo: {
    selectedNode: FileExplorerNode | null;
  };
};

type EditorAction = {
  initialize: (
    editorId: number,
    activeTab: EditorTab | -1,
    tabs: EditorTab[],
    hm: HashMap,
  ) => void;
  loadDataFromIndexedDb: () => Promise<void>;
  openFile: (
    file: FileSystemFileHandle,
    directoryHandle: FileSystemDirectoryHandle,
    index?: number,
    lineNumber?: number,
  ) => Promise<void>;
  removeFile: (id: number) => Promise<number>;
  renameFile: (
    oldFileTabId: number,
    oldFileName: string,
    newFile: FileAccessType,
  ) => Promise<void>;
  saveFile: (
    fileHandle: FileSystemFileHandle | VCSFileInfo | APICFileInfo,
    fileContent: string,
  ) => Promise<boolean>;
  changeLine: (value: number, column: number) => void;
  setActiveTab: (editorTab: EditorTab) => void;
  reset: () => void;
  openVCSFile: (fileInfo: VCSFileInfo, lineNumber?: number) => Promise<void>;
  updateLintResult: (lintResponse: IlintResponse[]) => void;
  resetActiveTab: (tab?: EditorTab) => void;
  getEditorId: (
    file: FileSystemFileHandle | VCSFileInfo | APICFileInfo,
  ) => number;
  updateTabsOnFormSave: (
    file: FileSystemFileHandle | VCSFileInfo | APICFileInfo,
  ) => Promise<void>;
  updateTab: (
    file: FileSystemFileHandle | VCSFileInfo | APICFileInfo,
  ) => Promise<void>;
  setFileExplorerInfo: (node: FileExplorerNode | null) => void;
  readFile: (
    file: FileSystemFileHandle | VCSFileInfo | APICFileInfo,
    directoryHandle: FileSystemDirectoryHandle,
    isVCSFile: boolean,
  ) => Promise<
    | {
        filePath: string;
        content?: any;
      }
    | undefined
  >;
  openAPICFile: (fileInfo: APICFileInfo, lineNumber?: number) => Promise<void>;
};

export type EditorStore = EditorState & EditorAction;
