import { OpenAPIV3, OpenAPIV3_1 } from "openapi-types";
import { VCSFileInfo } from "../../vcs/models/vcs-file-info.model.js";
import { OpenApiDocumentObject, OpenApiPathItemObject, OpenAPISecurityRequirement, OpenApiSpecComponents, OpenAPISpecComponentsSchemaObject, OpenApiSpecExampleObj, OpenApiTagObject } from "../interfaces/api-spec-handler.interface.js";
import { SelectionItem } from "./api-context.store.model.js";
import { AssetInfo } from "../../lfs/models/asset-info.model.js";

export interface APIContextAction {
    setData: (data: string | null) => void;
    setContext: (fileAccessor: FileSystemFileHandle | VCSFileInfo) => void;
    setOpenAPIVersion: (version: string | null) => void;

    updateInfo: (info: OpenAPIV3.InfoObject | OpenAPIV3_1.InfoObject) => void;

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

}