/**
 * Copyright IBM Corp. 2024, 2025
 */
import { BranchNode } from "../models/branch-node.model.js";
import { CommitInput } from "../models/commit-input.model.js";
import { CommitResponse } from "../models/commit-response.model.js";
import { FileBlobResponse } from "../models/file-blob-response.model.js";
import { OAuthDeviceExchange, OAuthDeviceInfo, OAuthExchange } from "../models/oauth-exchange.model.js";
import { OAuthTokenResponse } from "../models/oauth-token-response.model.js";
import { RepositoryNode } from "../models/repository-node.model.js";
import { RepositoryTreeResponse } from "../models/repository-tree-response.model.js";
import {
  Repository,
  RepositoryBranch,
  RepositoryTree,
  FetchFileBlob,
  CreateBranch,
} from "../models/repository.model.js";
import { UserInfo } from "../models/user-info.model.js";
import { VCSConfig } from "../models/vcs-config.model.js";

/**
 * Copyright Super iPaaS Integration LLC, an IBM Company 2024
 */
export interface IVcsStrategy {
  getAllRepository(data: VCSConfig): Promise<RepositoryNode[]>;

  getRepositoryByName(data: Repository): Promise<RepositoryNode | null>;

  getLatestCommitIdForBranch(
    data: RepositoryBranch
  ): Promise<string | undefined>;

  fetchRepositoryTree(
    data: RepositoryTree
  ): Promise<RepositoryTreeResponse | undefined>;

  fetchBlobContent(data: FetchFileBlob): Promise<FileBlobResponse | undefined>;

  getRepositoryBranches(data: RepositoryBranch): Promise<BranchNode[]>;

  getProviderOAuthURL(): string;

  handleOAuthTokenExchange(data: OAuthExchange): Promise<OAuthTokenResponse>;

  handleOAuthDeviceTokenExchange(data: OAuthDeviceExchange): Promise<OAuthTokenResponse>;

  getOAuthDeviceToken(clientID: string): Promise<OAuthDeviceInfo>;

  getProviderEnterpriseCloudURL(): string;

  getUserInfo(token: string, serverUrl?: string): Promise<UserInfo>;

  createRepositoryBranch(data: CreateBranch): Promise<void>;

  deleteRepositoryBranch(data: RepositoryBranch): Promise<void>;

  commitToRemoteRepository(data: CommitInput): Promise<CommitResponse>;
}
