/**
 * Copyright IBM Corp. 2024, 2025
 */
import { OpenAPIV2, OpenAPIV3, OpenAPIV3_1 } from 'openapi-types';
import { VCSFileInfo } from '../../vcs/models/vcs-file-info.model.js';
import {
  OpenApiDocumentObject,
  OpenApiPathItemObject,
  OpenAPISecurityRequirement,
  OpenApiSpecComponents,
  OpenAPISpecComponentsSchemaObject,
  OpenApiSpecExampleObj,
  OpenApiTagObject,
  OpenAPIV2Components,
  OpenAPIV2ComponentsObject,
  OpenAPIV2HostPath,
} from '../interfaces/api-spec-handler.interface.js';
import {
  APIAdditionalPropertyKeys,
  ProjectAssetInfo,
  SelectionItem,
} from './api-context.store.model.js';
import { AssetInfo } from '../../lfs/models/asset-info.model.js';
import { OpenApiTypesEnum } from '../models/openapi-types.enum.js';
import { APICFileInfo } from '../../apic-mode/models/apic-file-info.model.js';

export interface APIContextAction {
  // loading info
  startLoading: () => void;
  finishLoading: () => void;

  setData: (data: string | null) => void;
  setContext: (
    fileAccessor: FileSystemFileHandle | VCSFileInfo | APICFileInfo,
  ) => void;
  setApiVersion: (version: OpenApiTypesEnum | null) => void;
  reset: () => void;
  setPolicySequences: (policySeqRefs: AssetInfo[]) => void;
  setApiAdditionalProperties: (
    key: APIAdditionalPropertyKeys,
    asset?: ProjectAssetInfo,
  ) => void;
  setActiveApiAdditionalProperty: (key?: APIAdditionalPropertyKeys) => void;
  setIsDetailedPropertyFormViewOpen: (isDetailedFormViewOpen: boolean) => void;

  updateInfo: (
    info: OpenAPIV3.InfoObject | OpenAPIV3_1.InfoObject | OpenAPIV2.InfoObject,
  ) => Promise<void>;

  addServer: (
    server: OpenAPIV3.ServerObject | OpenAPIV3_1.ServerObject,
  ) => Promise<void>;
  updateServer: (
    oldServer: OpenAPIV3.ServerObject | OpenAPIV3_1.ServerObject,
    newServer: OpenAPIV3.ServerObject | OpenAPIV3_1.ServerObject,
  ) => Promise<void>;
  deleteServer: (
    server: OpenAPIV3.ServerObject | OpenAPIV3_1.ServerObject,
  ) => Promise<void>;

  addComponentExample: (
    Key: string,
    ExampleObj: OpenApiSpecExampleObj,
  ) => Promise<void>;
  updateComponentExample: (
    PrevKey: string,
    CurrentKey: string,
    ExampleObj: OpenApiSpecExampleObj,
  ) => Promise<void>;
  deleteComponentExample: (key: string) => Promise<void>;

  addComponentSchema: (
    key: string,
    newSchema: OpenAPISpecComponentsSchemaObject,
  ) => Promise<void>;
  updateComponentSchema: (
    prevKey: string,
    newKey: string,
    updatedSchema: OpenAPISpecComponentsSchemaObject,
  ) => Promise<void>;
  deleteComponentSchema: (key: string) => Promise<void>;

  addPath: (key: string, pathItem: OpenApiPathItemObject) => Promise<void>;
  updatePath: (
    PrevKey: string,
    CurrentKey: string,
    pathObj: OpenApiPathItemObject,
  ) => Promise<void>;
  deletePath: (key: string) => Promise<void>;

  addTag: (tag: OpenApiTagObject) => Promise<void>;
  updateTag: (prevKey: string, tag: OpenApiTagObject) => Promise<void>;
  deleteTag: (tag: string) => Promise<void>;
  addSecurity: (security: OpenAPISecurityRequirement[]) => Promise<void>;
  updateSecurity: (
    prevSecuityName: string,
    security: OpenAPISecurityRequirement,
  ) => Promise<void>;
  deleteSecurity: (securityName: string) => Promise<void>;

  addOrUpdateDocument: (document: OpenApiDocumentObject) => Promise<void>;
  deleteDocument: () => Promise<void>;

  addComponent: (
    key: string,
    object: OpenApiSpecComponents,
    typeOfComponent:
      | keyof OpenAPIV3.ComponentsObject
      | keyof OpenAPIV3_1.ComponentsObject,
  ) => Promise<void>;
  updateComponent: (
    prevKey: string,
    currentKey: string,
    object: OpenApiSpecComponents,
    typeOfComponent:
      | keyof OpenAPIV3.ComponentsObject
      | keyof OpenAPIV3_1.ComponentsObject,
  ) => Promise<void>;
  deleteComponent: (
    key: string,
    typeOfComponent:
      | keyof OpenAPIV3.ComponentsObject
      | keyof OpenAPIV3_1.ComponentsObject,
  ) => Promise<void>;
  setComponent: (
    data: Record<string, OpenApiSpecComponents>,
    typeOfComponent:
      | keyof OpenAPIV3.ComponentsObject
      | keyof OpenAPIV3_1.ComponentsObject,
  ) => Promise<void>;

  addSelection: (selectionItem: SelectionItem) => void;
  updateSelection: (
    position: number,
    updatedSelectionItem: SelectionItem,
  ) => void;
  setSelectionItems: (selectionItems: Array<SelectionItem>) => void;
  removeSelectionAfterPosition: (position: number) => void;

  setAdditionalDataV2: (
    name: string | string[],
    type: OpenAPIV2HostPath,
  ) => Promise<void>;

  addComponentV2: (
    key: string,
    object: OpenAPIV2ComponentsObject,
    typeOfComponent: OpenAPIV2Components,
  ) => Promise<void>;
  updateComponentV2: (
    prevKey: string,
    currentKey: string,
    object: OpenAPIV2ComponentsObject,
    typeOfComponent: OpenAPIV2Components,
  ) => Promise<void>;
  deleteComponentV2: (
    key: string,
    typeOfComponent: OpenAPIV2Components,
  ) => Promise<void>;
  setComponentV2: (
    data: Record<string, OpenAPIV2ComponentsObject>,
    typeOfComponent: OpenAPIV2Components,
  ) => Promise<void>;
}
