/**
 * Copyright IBM Corp. 2024, 2025
 */
import { AssetMetadata } from '../../lfs/models/asset-metadata.model.js';
import { Assets } from '../../lfs/models/assets.model.js';
import { APICProject } from '../../apic-mode/models/apic-project.model.js';
import { Project } from '../../lfs/models/project.model.js';
import { RootDirectoryInfo } from '../../lfs/models/root-directory-info.model.js';
import { VCSProject } from '../../vcs/models/vcs-project.model.js';

export type ProjectState = {
  projects: (Project | VCSProject | APICProject)[];
  active: Project | VCSProject | APICProject | null;
  repoWorkingBranch: string | null;
  isApicProjectsLoading: boolean;
  activeTabIndex: number;
  apicProjectNameToIdMap: Map<string, string>;
};

export type ProjectAssetKeys = keyof Omit<Assets, 'otherFiles'>;
export type ProjectActions = {
  intializeStore: () => Promise<void>;
  initializeAPICStore: () => Promise<void>;
  loadProjectsForParentsFolder: (
    rootDirectoryInfo: RootDirectoryInfo,
  ) => Promise<void>;
  loadProjectsForParentsFolders: (
    rootDirectories: RootDirectoryInfo[],
  ) => Promise<void>;
  addProject: (newProject: Project | VCSProject | APICProject) => void;
  createProject: (
    newProject: Project | VCSProject,
    fileList?: File[],
  ) => Promise<void>;
  updateProject: (
    prevProject: Project | VCSProject,
    updatedProject: Project | VCSProject,
  ) => void;
  openProject: (project: Project | VCSProject | APICProject) => Promise<void>;
  refreshProject: (
    project: Project | VCSProject | APICProject,
  ) => Promise<void>;
  toggleIsPinnedProject: (
    projectName: string,
    rootDirectoryAlias: string,
  ) => void;
  deleteProjects: (parentFolderAlias: string[]) => void;
  removeProjects: (projects: (Project | VCSProject | APICProject)[]) => void;
  addProjects: (
    newProject: (Project | VCSProject | APICProject)[],
  ) => Promise<void>;
  setActive: (project: Project | VCSProject | APICProject | null) => void;
  setLastUpdatedForActiveProject: (lastUpdated?: number) => void;
  intializeVcsStore: () => Promise<void>;
  removeAllVCSProject: () => void;
  refreshActiveProject: () => Promise<void>;
  setActiveOnVcsCommitAndPush: (project: Project | VCSProject | null) => void;
  resetProjectsForEmbeddedMode: () => void;
  getAllAssetsInfo: (assetAccessKey: ProjectAssetKeys) => AssetMetadata[];
};
