/**
 * 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 { AssetInfo } 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';
import { OpenApiSpecDocument } from '../interfaces/api-spec-handler.interface.js';
import { OpenApiTypesEnum } from '../models/openapi-types.enum.js';

export type APIAdditionalPropertyKeys = 'uriSchemes' | 'properties' | 'cors';

export type APIContext = {
  data: OpenApiSpecDocument | null;
  context: {
    file: FileSystemFileHandle | VCSFileInfo | APICFileInfo | null;
  };
  selectedItems: Array<SelectionItem>;
  apiVersion: OpenApiTypesEnum | null;
  policySequences: AssetInfo[];
  apiAdditionalProperties: {
    active?: APIAdditionalPropertyKeys;
    isDetailedFormViewOpen: boolean;
    properties: {
      [key in APIAdditionalPropertyKeys]?: ProjectAssetInfo;
    };
  };
  loadingInfo: LoadingInfo;
};

export interface ProjectAssetInfo extends AssetInfo {
  project: Project | VCSProject | APICProject;
}

export type SelectionType =
  | 'module'
  | 'path'
  | 'operation'
  | 'component'
  | 'response'
  | 'security';
export type SelectionItem = {
  position: number;
  type: SelectionType;
  value: string | number;
  showBreadCrumbs: boolean;
  displayNameForBreadCrumbs: string;
  onBreadCrumbClick?: () => void;
};

export type LoadingInfo = {
  // 1. Tracks the actual data fetching status
  isFetchingData: boolean;
  // 2. Tracks whether the loader should *visually* be shown (Delayed state)
  showDelayedLoader: boolean;
  // Internal timer reference
  showTimer?: NodeJS.Timeout;
  minDisplayTimer?: NodeJS.Timeout;
  shownAt?: number;
};
