/**
 * 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 { Metadata } from "../../common/models/base-asset.model.js";
import { MetadataInfo } from "../../lfs/models/asset-info.model.js";
import { Project } from "../../lfs/models/project.model.js";
import { VCSFileInfo } from "../../vcs/models/vcs-file-info.model.js";
import { VCSProject } from "../../vcs/models/vcs-project.model.js";

export interface IPolicyFormHandler {

    getFileContent: (file: FileSystemFileHandle | VCSFileInfo | APICFileInfo) => Promise<string>

    addNewPolicy: (fileHandle: FileSystemFileHandle | VCSFileInfo | APICFileInfo, stage: string, metadata: Metadata) => Promise<FileSystemFileHandle | VCSFileInfo | APICFileInfo>;

    addExistingPolicy: (fileHandle: FileSystemFileHandle | VCSFileInfo | APICFileInfo, stage: string, metadata: Metadata) => Promise<FileSystemFileHandle | VCSFileInfo | APICFileInfo>;

    removePolicy: (fileHandle: FileSystemFileHandle | VCSFileInfo | APICFileInfo, stage: string, metadata: Metadata) => Promise<boolean>;

    updateStagePolicies: (fileHandle: FileSystemFileHandle | VCSFileInfo | APICFileInfo, stage: string, policies: Metadata[]) => Promise<FileSystemFileHandle | VCSFileInfo | APICFileInfo>;

    updatePolicy: <T>(fileHandle: FileSystemFileHandle | VCSFileInfo | APICFileInfo, policy: T) => Promise<T>;

    updateAsset: <T>(fileHandle: FileSystemFileHandle | VCSFileInfo | APICFileInfo, asset: T, ref: string) => Promise<T>;

    getAllStagePolicies: (fileHandle: FileSystemFileHandle | VCSFileInfo | APICFileInfo, stage: string) => Promise<Metadata[]>;

    getPoliciesByKind: (projects: (Project | VCSProject | APICProject)[], kind: string) => Promise<MetadataInfo[]>;

    getPolicyNameFromKind: (kind: string) => String;

    getRouteTypeFromSpec: (policy: string) => string;

    generateRandomString: () => string;

    getMetadataFromRef: (ref: string | null) => Metadata | null;

}