/*
 * Copyright (c) Microsoft Corporation.
 * Licensed under the MIT License.
 *
 * Code generated by Microsoft (R) AutoRest Code Generator.
 * Changes may cause incorrect behavior and will be lost if the code is regenerated.
 */

import {
  ReleasesListTesterAppsOptionalParams,
  ReleasesListTesterAppsResponse,
  ReleasesGetLatestByHashOptionalParams,
  ReleasesGetLatestByHashResponse,
  ReleasesGetLatestPrivateReleaseOptionalParams,
  ReleasesGetLatestPrivateReleaseResponse,
  ReleasesDeleteTesterFromDestinationsOptionalParams,
  ReleasesDeleteTesterFromDestinationsResponse,
  ReleasesPutDistributionTesterOptionalParams,
  ReleasesPutDistributionTesterResponse,
  ReleasesDeleteDistributionTesterOptionalParams,
  ReleasesDeleteDistributionTesterResponse,
  ReleasesAddTestersOptionalParams,
  ReleasesAddTestersResponse,
  ReleasesDeleteDistributionStoreOptionalParams,
  ReleasesDeleteDistributionStoreResponse,
  ReleasesAddStoreOptionalParams,
  ReleasesAddStoreResponse,
  ReleasesPutDistributionGroupOptionalParams,
  ReleasesPutDistributionGroupResponse,
  ReleasesDeleteDistributionGroupOptionalParams,
  ReleasesDeleteDistributionGroupResponse,
  ReleasesAddDistributionGroupOptionalParams,
  ReleasesAddDistributionGroupResponse,
  ReleasesGetLatestByUserOptionalParams,
  ReleasesGetLatestByUserResponse,
  ReleasesUpdateDetailsOptionalParams,
  ReleasesUpdateDetailsResponse,
  Paths1Veut4NV01AppsOwnerNameAppNameReleasesReleaseIdPatchRequestbodyContentApplicationJsonSchema,
  ReleasesUpdateOptionalParams,
  ReleasesUpdateResponse,
  ReleasesDeleteOptionalParams,
  ReleasesDeleteResponse,
  ReleasesAvailableToTesterOptionalParams,
  ReleasesAvailableToTesterResponse,
  ReleasesListOptionalParams,
  ReleasesListResponse,
  ReleasesListLatestOptionalParams,
  ReleasesListLatestResponse,
  ReleasesGetLatestByDistributionGroupOptionalParams,
  ReleasesGetLatestByDistributionGroupResponse,
  ReleasesDeleteWithDistributionGroupIdOptionalParams,
  ReleasesListByDistributionGroupOptionalParams,
  ReleasesListByDistributionGroupResponse
} from "../models";

/** Interface representing a Releases. */
export interface Releases {
  /**
   * Return a list of applications that the user has tester permission to with the latest release for
   * each.
   * @param options The options parameters.
   */
  listTesterApps(
    options?: ReleasesListTesterAppsOptionalParams
  ): Promise<ReleasesListTesterAppsResponse>;
  /**
   * If 'latest' is not specified then it will return the specified release if it's enabled. If 'latest'
   * is specified, regardless of whether a release hash is provided, the latest enabled release is
   * returned.
   * @param appSecret The secret of the target application
   * @param releaseHash The hash of the release or 'latest' to get the latest release from all the
   *                    distribution groups assigned to the current user.
   * @param options The options parameters.
   */
  getLatestByHash(
    appSecret: string,
    releaseHash: string,
    options?: ReleasesGetLatestByHashOptionalParams
  ): Promise<ReleasesGetLatestByHashResponse>;
  /**
   * Get the latest release distributed to a private group the given user is a member of for the given
   * app.
   * @param appSecret The secret of the target application
   * @param options The options parameters.
   */
  getLatestPrivateRelease(
    appSecret: string,
    options?: ReleasesGetLatestPrivateReleaseOptionalParams
  ): Promise<ReleasesGetLatestPrivateReleaseResponse>;
  /**
   * Delete the given tester from the all releases
   * @param testerId The id of the tester
   * @param ownerName The name of the owner
   * @param appName The name of the application
   * @param options The options parameters.
   */
  deleteTesterFromDestinations(
    testerId: string,
    ownerName: string,
    appName: string,
    options?: ReleasesDeleteTesterFromDestinationsOptionalParams
  ): Promise<ReleasesDeleteTesterFromDestinationsResponse>;
  /**
   * Update details about the specified tester associated with the release
   * @param releaseId The ID of the release
   * @param testerId The id of the tester
   * @param ownerName The name of the owner
   * @param appName The name of the application
   * @param mandatoryUpdate Whether a release is mandatory for the given destination
   * @param options The options parameters.
   */
  putDistributionTester(
    releaseId: number,
    testerId: string,
    ownerName: string,
    appName: string,
    mandatoryUpdate: boolean,
    options?: ReleasesPutDistributionTesterOptionalParams
  ): Promise<ReleasesPutDistributionTesterResponse>;
  /**
   * Delete the given tester from the release
   * @param releaseId The ID of the release
   * @param testerId The id of the tester
   * @param ownerName The name of the owner
   * @param appName The name of the application
   * @param options The options parameters.
   */
  deleteDistributionTester(
    releaseId: number,
    testerId: string,
    ownerName: string,
    appName: string,
    options?: ReleasesDeleteDistributionTesterOptionalParams
  ): Promise<ReleasesDeleteDistributionTesterResponse>;
  /**
   * Distributes a release to a user
   * @param releaseId The ID of the release
   * @param ownerName The name of the owner
   * @param appName The name of the application
   * @param email Tester's email address
   * @param options The options parameters.
   */
  addTesters(
    releaseId: number,
    ownerName: string,
    appName: string,
    email: string,
    options?: ReleasesAddTestersOptionalParams
  ): Promise<ReleasesAddTestersResponse>;
  /**
   * Delete the given distribution store from the release
   * @param releaseId The ID of the release
   * @param storeId The id of the distribution store
   * @param ownerName The name of the owner
   * @param appName The name of the application
   * @param options The options parameters.
   */
  deleteDistributionStore(
    releaseId: number,
    storeId: string,
    ownerName: string,
    appName: string,
    options?: ReleasesDeleteDistributionStoreOptionalParams
  ): Promise<ReleasesDeleteDistributionStoreResponse>;
  /**
   * Distributes a release to a store
   * @param releaseId The ID of the release
   * @param ownerName The name of the owner
   * @param appName The name of the application
   * @param id Unique id of the release destination
   * @param options The options parameters.
   */
  addStore(
    releaseId: number,
    ownerName: string,
    appName: string,
    id: string,
    options?: ReleasesAddStoreOptionalParams
  ): Promise<ReleasesAddStoreResponse>;
  /**
   * Update details about the specified distribution group associated with the release
   * @param releaseId The ID of the release
   * @param groupId The id of the releases destination
   * @param ownerName The name of the owner
   * @param appName The name of the application
   * @param mandatoryUpdate Whether a release is mandatory for the given destination
   * @param options The options parameters.
   */
  putDistributionGroup(
    releaseId: number,
    groupId: string,
    ownerName: string,
    appName: string,
    mandatoryUpdate: boolean,
    options?: ReleasesPutDistributionGroupOptionalParams
  ): Promise<ReleasesPutDistributionGroupResponse>;
  /**
   * Delete the given distribution group from the release
   * @param releaseId The ID of the release
   * @param groupId The id of the distribution group
   * @param ownerName The name of the owner
   * @param appName The name of the application
   * @param options The options parameters.
   */
  deleteDistributionGroup(
    releaseId: number,
    groupId: string,
    ownerName: string,
    appName: string,
    options?: ReleasesDeleteDistributionGroupOptionalParams
  ): Promise<ReleasesDeleteDistributionGroupResponse>;
  /**
   * Distributes a release to a group
   * @param releaseId The ID of the release
   * @param ownerName The name of the owner
   * @param appName The name of the application
   * @param id Unique id of the release destination
   * @param options The options parameters.
   */
  addDistributionGroup(
    releaseId: number,
    ownerName: string,
    appName: string,
    id: string,
    options?: ReleasesAddDistributionGroupOptionalParams
  ): Promise<ReleasesAddDistributionGroupResponse>;
  /**
   * Get a release with id `release_id`. If `release_id` is `latest`, return the latest release that was
   * distributed to the current user (from all the distribution groups).
   * @param releaseId The ID of the release, or `latest` to get the latest release from all the
   *                  distribution groups assigned to the current user.
   * @param ownerName The name of the owner
   * @param appName The name of the application
   * @param options The options parameters.
   */
  getLatestByUser(
    releaseId: string,
    ownerName: string,
    appName: string,
    options?: ReleasesGetLatestByUserOptionalParams
  ): Promise<ReleasesGetLatestByUserResponse>;
  /**
   * Update details of a release.
   * @param releaseId The ID of the release
   * @param ownerName The name of the owner
   * @param appName The name of the application
   * @param options The options parameters.
   */
  updateDetails(
    releaseId: number,
    ownerName: string,
    appName: string,
    options?: ReleasesUpdateDetailsOptionalParams
  ): Promise<ReleasesUpdateDetailsResponse>;
  /**
   * Updates a release.
   * @param releaseId The ID of the release
   * @param ownerName The name of the owner
   * @param appName The name of the application
   * @param body The release information.
   * @param options The options parameters.
   */
  update(
    releaseId: number,
    ownerName: string,
    appName: string,
    body: Paths1Veut4NV01AppsOwnerNameAppNameReleasesReleaseIdPatchRequestbodyContentApplicationJsonSchema,
    options?: ReleasesUpdateOptionalParams
  ): Promise<ReleasesUpdateResponse>;
  /**
   * Deletes a release.
   * @param releaseId The ID of the release
   * @param ownerName The name of the owner
   * @param appName The name of the application
   * @param options The options parameters.
   */
  delete(
    releaseId: number,
    ownerName: string,
    appName: string,
    options?: ReleasesDeleteOptionalParams
  ): Promise<ReleasesDeleteResponse>;
  /**
   * Return detailed information about releases avaiable to a tester.
   * @param ownerName The name of the owner
   * @param appName The name of the application
   * @param options The options parameters.
   */
  availableToTester(
    ownerName: string,
    appName: string,
    options?: ReleasesAvailableToTesterOptionalParams
  ): Promise<ReleasesAvailableToTesterResponse>;
  /**
   * Return basic information about releases.
   * @param ownerName The name of the owner
   * @param appName The name of the application
   * @param options The options parameters.
   */
  list(
    ownerName: string,
    appName: string,
    options?: ReleasesListOptionalParams
  ): Promise<ReleasesListResponse>;
  /**
   * Get the latest release from every distribution group associated with an application.
   * @param ownerName The name of the owner
   * @param appName The name of the application
   * @param options The options parameters.
   */
  listLatest(
    ownerName: string,
    appName: string,
    options?: ReleasesListLatestOptionalParams
  ): Promise<ReleasesListLatestResponse>;
  /**
   * Return detailed information about a distributed release in a given distribution group.
   * @param ownerName The name of the app owner
   * @param appName The name of the app
   * @param distributionGroupName The name of the distribution group.
   * @param releaseId Also supports the constant `latest`, which will return the latest release in the
   *                  distribution group.
   * @param options The options parameters.
   */
  getLatestByDistributionGroup(
    ownerName: string,
    appName: string,
    distributionGroupName: string,
    releaseId: string,
    options?: ReleasesGetLatestByDistributionGroupOptionalParams
  ): Promise<ReleasesGetLatestByDistributionGroupResponse>;
  /**
   * Deletes a release with id 'release_id' in a given distribution group.
   * @param ownerName The name of the app owner
   * @param appName The name of the app
   * @param distributionGroupName The name of the distribution group.
   * @param releaseId The ID identifying the unique release.
   * @param options The options parameters.
   */
  deleteWithDistributionGroupId(
    ownerName: string,
    appName: string,
    distributionGroupName: string,
    releaseId: number,
    options?: ReleasesDeleteWithDistributionGroupIdOptionalParams
  ): Promise<void>;
  /**
   * Return basic information about distributed releases in a given distribution group.
   * @param distributionGroupName The name of the distribution group.
   * @param ownerName The name of the owner
   * @param appName The name of the application
   * @param options The options parameters.
   */
  listByDistributionGroup(
    distributionGroupName: string,
    ownerName: string,
    appName: string,
    options?: ReleasesListByDistributionGroupOptionalParams
  ): Promise<ReleasesListByDistributionGroupResponse>;
}
