/*
 * 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 { Releases } from "../operationsInterfaces";
import * as coreClient from "@azure/core-client";
import * as Mappers from "../models/mappers";
import * as Parameters from "../models/parameters";
import { AppCenterClient } from "../appCenterClient";
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";

/** Class containing Releases operations. */
export class ReleasesImpl implements Releases {
  private readonly client: AppCenterClient;

  /**
   * Initialize a new instance of the class Releases class.
   * @param client Reference to the service client
   */
  constructor(client: AppCenterClient) {
    this.client = client;
  }

  /**
   * 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> {
    return this.client.sendOperationRequest(
      { options },
      listTesterAppsOperationSpec
    );
  }

  /**
   * 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> {
    return this.client.sendOperationRequest(
      { appSecret, releaseHash, options },
      getLatestByHashOperationSpec
    );
  }

  /**
   * 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> {
    return this.client.sendOperationRequest(
      { appSecret, options },
      getLatestPrivateReleaseOperationSpec
    );
  }

  /**
   * 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> {
    return this.client.sendOperationRequest(
      { testerId, ownerName, appName, options },
      deleteTesterFromDestinationsOperationSpec
    );
  }

  /**
   * 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> {
    return this.client.sendOperationRequest(
      { releaseId, testerId, ownerName, appName, mandatoryUpdate, options },
      putDistributionTesterOperationSpec
    );
  }

  /**
   * 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> {
    return this.client.sendOperationRequest(
      { releaseId, testerId, ownerName, appName, options },
      deleteDistributionTesterOperationSpec
    );
  }

  /**
   * 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> {
    return this.client.sendOperationRequest(
      { releaseId, ownerName, appName, email, options },
      addTestersOperationSpec
    );
  }

  /**
   * 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> {
    return this.client.sendOperationRequest(
      { releaseId, storeId, ownerName, appName, options },
      deleteDistributionStoreOperationSpec
    );
  }

  /**
   * 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> {
    return this.client.sendOperationRequest(
      { releaseId, ownerName, appName, id, options },
      addStoreOperationSpec
    );
  }

  /**
   * 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> {
    return this.client.sendOperationRequest(
      { releaseId, groupId, ownerName, appName, mandatoryUpdate, options },
      putDistributionGroupOperationSpec
    );
  }

  /**
   * 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> {
    return this.client.sendOperationRequest(
      { releaseId, groupId, ownerName, appName, options },
      deleteDistributionGroupOperationSpec
    );
  }

  /**
   * 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> {
    return this.client.sendOperationRequest(
      { releaseId, ownerName, appName, id, options },
      addDistributionGroupOperationSpec
    );
  }

  /**
   * 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> {
    return this.client.sendOperationRequest(
      { releaseId, ownerName, appName, options },
      getLatestByUserOperationSpec
    );
  }

  /**
   * 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> {
    return this.client.sendOperationRequest(
      { releaseId, ownerName, appName, options },
      updateDetailsOperationSpec
    );
  }

  /**
   * 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> {
    return this.client.sendOperationRequest(
      { releaseId, ownerName, appName, body, options },
      updateOperationSpec
    );
  }

  /**
   * 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 this.client.sendOperationRequest(
      { releaseId, ownerName, appName, options },
      deleteOperationSpec
    );
  }

  /**
   * 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 this.client.sendOperationRequest(
      { ownerName, appName, options },
      availableToTesterOperationSpec
    );
  }

  /**
   * 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> {
    return this.client.sendOperationRequest(
      { ownerName, appName, options },
      listOperationSpec
    );
  }

  /**
   * 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 this.client.sendOperationRequest(
      { ownerName, appName, options },
      listLatestOperationSpec
    );
  }

  /**
   * 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> {
    return this.client.sendOperationRequest(
      { ownerName, appName, distributionGroupName, releaseId, options },
      getLatestByDistributionGroupOperationSpec
    );
  }

  /**
   * 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 this.client.sendOperationRequest(
      { ownerName, appName, distributionGroupName, releaseId, options },
      deleteWithDistributionGroupIdOperationSpec
    );
  }

  /**
   * 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> {
    return this.client.sendOperationRequest(
      { distributionGroupName, ownerName, appName, options },
      listByDistributionGroupOperationSpec
    );
  }
}
// Operation Specifications
const serializer = coreClient.createSerializer(Mappers, /* isXml */ false);

const listTesterAppsOperationSpec: coreClient.OperationSpec = {
  path: "/v0.1/tester/apps",
  httpMethod: "GET",
  responses: {
    200: {
      bodyMapper: {
        type: {
          name: "Sequence",
          element: {
            type: {
              name: "Composite",
              className:
                "PathsFvdb99V01TesterAppsGetResponses200ContentApplicationJsonSchemaItems"
            }
          }
        }
      }
    }
  },
  urlParameters: [Parameters.$host],
  headerParameters: [Parameters.accept],
  serializer
};
const getLatestByHashOperationSpec: coreClient.OperationSpec = {
  path: "/v0.1/sdk/apps/{app_secret}/releases/{release_hash}",
  httpMethod: "GET",
  responses: {
    200: {
      bodyMapper:
        Mappers.Paths3NwxqsV01SdkAppsAppSecretReleasesReleaseHashGetResponses200ContentApplicationJsonSchema
    },
    404: {
      bodyMapper:
        Mappers.Paths5W4BybV01SdkAppsAppSecretReleasesReleaseHashGetResponses404ContentApplicationJsonSchema
    }
  },
  queryParameters: [Parameters.udid],
  urlParameters: [
    Parameters.$host,
    Parameters.appSecret,
    Parameters.releaseHash
  ],
  headerParameters: [Parameters.accept],
  serializer
};
const getLatestPrivateReleaseOperationSpec: coreClient.OperationSpec = {
  path: "/v0.1/sdk/apps/{app_secret}/releases/private/latest",
  httpMethod: "GET",
  responses: {
    200: {
      bodyMapper:
        Mappers.Paths1Wkh2MwV01SdkAppsAppSecretReleasesPrivateLatestGetResponses200ContentApplicationJsonSchema
    },
    404: {
      bodyMapper:
        Mappers.Paths1WkrcwmV01SdkAppsAppSecretReleasesPrivateLatestGetResponses404ContentApplicationJsonSchema
    }
  },
  queryParameters: [Parameters.udid],
  urlParameters: [Parameters.$host, Parameters.appSecret],
  headerParameters: [Parameters.accept],
  serializer
};
const deleteTesterFromDestinationsOperationSpec: coreClient.OperationSpec = {
  path: "/v0.1/apps/{owner_name}/{app_name}/testers/{tester_id}",
  httpMethod: "DELETE",
  responses: {
    200: {},
    404: {
      bodyMapper:
        Mappers.Paths16X7GfoV01AppsOwnerNameAppNameTestersTesterIdDeleteResponses404ContentApplicationJsonSchema
    }
  },
  urlParameters: [
    Parameters.$host,
    Parameters.ownerName,
    Parameters.appName,
    Parameters.testerId
  ],
  headerParameters: [Parameters.accept],
  serializer
};
const putDistributionTesterOperationSpec: coreClient.OperationSpec = {
  path:
    "/v0.1/apps/{owner_name}/{app_name}/releases/{release_id}/testers/{tester_id}",
  httpMethod: "PUT",
  responses: {
    200: {},
    404: {
      bodyMapper:
        Mappers.Paths7J8CcmV01AppsOwnerNameAppNameReleasesReleaseIdTestersTesterIdPutResponses404ContentApplicationJsonSchema
    }
  },
  requestBody: {
    parameterPath: { mandatoryUpdate: ["mandatoryUpdate"] },
    mapper: {
      ...Mappers.PathsOjvewzV01AppsOwnerNameAppNameReleasesReleaseIdTestersTesterIdPutRequestbodyContentApplicationJsonSchema,
      required: true
    }
  },
  urlParameters: [
    Parameters.$host,
    Parameters.ownerName,
    Parameters.appName,
    Parameters.releaseId2,
    Parameters.testerId1
  ],
  headerParameters: [Parameters.contentType, Parameters.accept],
  mediaType: "json",
  serializer
};
const deleteDistributionTesterOperationSpec: coreClient.OperationSpec = {
  path:
    "/v0.1/apps/{owner_name}/{app_name}/releases/{release_id}/testers/{tester_id}",
  httpMethod: "DELETE",
  responses: {
    200: {},
    404: {
      bodyMapper:
        Mappers.Paths1RmbaiiV01AppsOwnerNameAppNameReleasesReleaseIdTestersTesterIdDeleteResponses404ContentApplicationJsonSchema
    }
  },
  urlParameters: [
    Parameters.$host,
    Parameters.ownerName,
    Parameters.appName,
    Parameters.testerId,
    Parameters.releaseId2
  ],
  headerParameters: [Parameters.accept],
  serializer
};
const addTestersOperationSpec: coreClient.OperationSpec = {
  path: "/v0.1/apps/{owner_name}/{app_name}/releases/{release_id}/testers",
  httpMethod: "POST",
  responses: {
    201: {
      bodyMapper:
        Mappers.Paths5WvwkdV01AppsOwnerNameAppNameReleasesReleaseIdTestersPostResponses201ContentApplicationJsonSchema
    },
    400: {
      bodyMapper:
        Mappers.PathsVb1DjeV01AppsOwnerNameAppNameReleasesReleaseIdTestersPostResponses400ContentApplicationJsonSchema
    },
    404: {
      bodyMapper:
        Mappers.Paths1P68AoeV01AppsOwnerNameAppNameReleasesReleaseIdTestersPostResponses404ContentApplicationJsonSchema
    }
  },
  requestBody: {
    parameterPath: {
      mandatoryUpdate: ["options", "mandatoryUpdate"],
      email: ["email"],
      notifyTesters: ["options", "notifyTesters"]
    },
    mapper: {
      ...Mappers.PathsF6Ye6UV01AppsOwnerNameAppNameReleasesReleaseIdTestersPostRequestbodyContentApplicationJsonSchema,
      required: true
    }
  },
  urlParameters: [
    Parameters.$host,
    Parameters.ownerName,
    Parameters.appName,
    Parameters.releaseId2
  ],
  headerParameters: [Parameters.contentType, Parameters.accept],
  mediaType: "json",
  serializer
};
const deleteDistributionStoreOperationSpec: coreClient.OperationSpec = {
  path:
    "/v0.1/apps/{owner_name}/{app_name}/releases/{release_id}/stores/{store_id}",
  httpMethod: "DELETE",
  responses: {
    200: {},
    404: {
      bodyMapper:
        Mappers.Paths1BbvdowV01AppsOwnerNameAppNameReleasesReleaseIdStoresStoreIdDeleteResponses404ContentApplicationJsonSchema
    }
  },
  urlParameters: [
    Parameters.$host,
    Parameters.ownerName,
    Parameters.appName,
    Parameters.releaseId2,
    Parameters.storeId
  ],
  headerParameters: [Parameters.accept],
  serializer
};
const addStoreOperationSpec: coreClient.OperationSpec = {
  path: "/v0.1/apps/{owner_name}/{app_name}/releases/{release_id}/stores",
  httpMethod: "POST",
  responses: {
    201: {
      bodyMapper:
        Mappers.Paths1Tn9O5V01AppsOwnerNameAppNameReleasesReleaseIdStoresPostResponses201ContentApplicationJsonSchema
    },
    400: {
      bodyMapper:
        Mappers.Paths1Kf4BpnV01AppsOwnerNameAppNameReleasesReleaseIdStoresPostResponses400ContentApplicationJsonSchema
    },
    404: {
      bodyMapper:
        Mappers.Paths1T5QljtV01AppsOwnerNameAppNameReleasesReleaseIdStoresPostResponses404ContentApplicationJsonSchema
    }
  },
  requestBody: {
    parameterPath: { id: ["id"] },
    mapper: {
      ...Mappers.Paths19I3T9ZV01AppsOwnerNameAppNameReleasesReleaseIdStoresPostRequestbodyContentApplicationJsonSchema,
      required: true
    }
  },
  urlParameters: [
    Parameters.$host,
    Parameters.ownerName,
    Parameters.appName,
    Parameters.releaseId2
  ],
  headerParameters: [Parameters.contentType, Parameters.accept],
  mediaType: "json",
  serializer
};
const putDistributionGroupOperationSpec: coreClient.OperationSpec = {
  path:
    "/v0.1/apps/{owner_name}/{app_name}/releases/{release_id}/groups/{group_id}",
  httpMethod: "PUT",
  responses: {
    200: {},
    404: {
      bodyMapper:
        Mappers.Paths11Dzu4BV01AppsOwnerNameAppNameReleasesReleaseIdGroupsGroupIdPutResponses404ContentApplicationJsonSchema
    }
  },
  requestBody: {
    parameterPath: { mandatoryUpdate: ["mandatoryUpdate"] },
    mapper: {
      ...Mappers.Paths1Y3U3TvV01AppsOwnerNameAppNameReleasesReleaseIdGroupsGroupIdPutRequestbodyContentApplicationJsonSchema,
      required: true
    }
  },
  urlParameters: [
    Parameters.$host,
    Parameters.ownerName,
    Parameters.appName,
    Parameters.releaseId2,
    Parameters.groupId
  ],
  headerParameters: [Parameters.contentType, Parameters.accept],
  mediaType: "json",
  serializer
};
const deleteDistributionGroupOperationSpec: coreClient.OperationSpec = {
  path:
    "/v0.1/apps/{owner_name}/{app_name}/releases/{release_id}/groups/{group_id}",
  httpMethod: "DELETE",
  responses: {
    200: {},
    404: {
      bodyMapper:
        Mappers.Paths1Nrzr5YV01AppsOwnerNameAppNameReleasesReleaseIdGroupsGroupIdDeleteResponses404ContentApplicationJsonSchema
    }
  },
  urlParameters: [
    Parameters.$host,
    Parameters.ownerName,
    Parameters.appName,
    Parameters.releaseId2,
    Parameters.groupId1
  ],
  headerParameters: [Parameters.accept],
  serializer
};
const addDistributionGroupOperationSpec: coreClient.OperationSpec = {
  path: "/v0.1/apps/{owner_name}/{app_name}/releases/{release_id}/groups",
  httpMethod: "POST",
  responses: {
    201: {
      bodyMapper:
        Mappers.PathsFv6EorV01AppsOwnerNameAppNameReleasesReleaseIdGroupsPostResponses201ContentApplicationJsonSchema
    },
    400: {
      bodyMapper:
        Mappers.PathsPtrb07V01AppsOwnerNameAppNameReleasesReleaseIdGroupsPostResponses400ContentApplicationJsonSchema
    },
    404: {
      bodyMapper:
        Mappers.Paths19Ueda8V01AppsOwnerNameAppNameReleasesReleaseIdGroupsPostResponses404ContentApplicationJsonSchema
    }
  },
  requestBody: {
    parameterPath: {
      id: ["id"],
      mandatoryUpdate: ["options", "mandatoryUpdate"],
      notifyTesters: ["options", "notifyTesters"]
    },
    mapper: {
      ...Mappers.Paths1Jif7RyV01AppsOwnerNameAppNameReleasesReleaseIdGroupsPostRequestbodyContentApplicationJsonSchema,
      required: true
    }
  },
  urlParameters: [
    Parameters.$host,
    Parameters.ownerName,
    Parameters.appName,
    Parameters.releaseId2
  ],
  headerParameters: [Parameters.contentType, Parameters.accept],
  mediaType: "json",
  serializer
};
const getLatestByUserOperationSpec: coreClient.OperationSpec = {
  path: "/v0.1/apps/{owner_name}/{app_name}/releases/{release_id}",
  httpMethod: "GET",
  responses: {
    200: {
      bodyMapper:
        Mappers.Paths1Wtl5HpV01AppsOwnerNameAppNameReleasesReleaseIdGetResponses200ContentApplicationJsonSchema
    },
    400: {
      bodyMapper:
        Mappers.Paths1LeydabV01AppsOwnerNameAppNameReleasesReleaseIdGetResponses400ContentApplicationJsonSchema
    },
    404: {
      bodyMapper:
        Mappers.Paths6Hivb0V01AppsOwnerNameAppNameReleasesReleaseIdGetResponses404ContentApplicationJsonSchema
    }
  },
  queryParameters: [Parameters.udid],
  urlParameters: [
    Parameters.$host,
    Parameters.releaseId,
    Parameters.ownerName,
    Parameters.appName
  ],
  headerParameters: [Parameters.accept],
  serializer
};
const updateDetailsOperationSpec: coreClient.OperationSpec = {
  path: "/v0.1/apps/{owner_name}/{app_name}/releases/{release_id}",
  httpMethod: "PUT",
  responses: {
    200: {
      bodyMapper:
        Mappers.PathsMeoh5V01AppsOwnerNameAppNameReleasesReleaseIdPutResponses200ContentApplicationJsonSchema
    },
    400: {
      bodyMapper:
        Mappers.Paths1Ufxd2QV01AppsOwnerNameAppNameReleasesReleaseIdPutResponses400ContentApplicationJsonSchema
    },
    404: {
      bodyMapper:
        Mappers.PathsAuajt0V01AppsOwnerNameAppNameReleasesReleaseIdPutResponses404ContentApplicationJsonSchema
    }
  },
  requestBody: {
    parameterPath: {
      enabled: ["options", "enabled"],
      releaseNotes: ["options", "releaseNotes"],
      build: ["options", "build"]
    },
    mapper: {
      ...Mappers.PathsQ3NwdwV01AppsOwnerNameAppNameReleasesReleaseIdPutRequestbodyContentApplicationJsonSchema,
      required: true
    }
  },
  urlParameters: [
    Parameters.$host,
    Parameters.ownerName,
    Parameters.appName,
    Parameters.releaseId2
  ],
  headerParameters: [Parameters.contentType, Parameters.accept],
  mediaType: "json",
  serializer
};
const updateOperationSpec: coreClient.OperationSpec = {
  path: "/v0.1/apps/{owner_name}/{app_name}/releases/{release_id}",
  httpMethod: "PATCH",
  responses: {
    200: {
      bodyMapper:
        Mappers.Paths1FopftvV01AppsOwnerNameAppNameReleasesReleaseIdPatchResponses200ContentApplicationJsonSchema
    },
    400: {
      bodyMapper:
        Mappers.Paths5XfktV01AppsOwnerNameAppNameReleasesReleaseIdPatchResponses400ContentApplicationJsonSchema
    },
    404: {
      bodyMapper:
        Mappers.PathsW9K4UlV01AppsOwnerNameAppNameReleasesReleaseIdPatchResponses404ContentApplicationJsonSchema
    }
  },
  requestBody: Parameters.body5,
  urlParameters: [
    Parameters.$host,
    Parameters.ownerName,
    Parameters.appName,
    Parameters.releaseId2
  ],
  headerParameters: [Parameters.contentType, Parameters.accept],
  mediaType: "json",
  serializer
};
const deleteOperationSpec: coreClient.OperationSpec = {
  path: "/v0.1/apps/{owner_name}/{app_name}/releases/{release_id}",
  httpMethod: "DELETE",
  responses: {
    200: {},
    404: {
      bodyMapper:
        Mappers.PathsQra1HiV01AppsOwnerNameAppNameReleasesReleaseIdDeleteResponses404ContentApplicationJsonSchema
    },
    500: {
      bodyMapper:
        Mappers.Paths1Lqk8FbV01AppsOwnerNameAppNameReleasesReleaseIdDeleteResponses500ContentApplicationJsonSchema
    }
  },
  urlParameters: [
    Parameters.$host,
    Parameters.ownerName,
    Parameters.appName,
    Parameters.releaseId2
  ],
  headerParameters: [Parameters.accept],
  serializer
};
const availableToTesterOperationSpec: coreClient.OperationSpec = {
  path: "/v0.1/apps/{owner_name}/{app_name}/releases/filter_by_tester",
  httpMethod: "GET",
  responses: {
    200: {
      bodyMapper: {
        type: {
          name: "Sequence",
          element: {
            type: {
              name: "Composite",
              className:
                "Paths146V2RtV01AppsOwnerNameAppNameReleasesFilterByTesterGetResponses200ContentApplicationJsonSchemaItems"
            }
          }
        }
      }
    }
  },
  queryParameters: [Parameters.publishedOnly],
  urlParameters: [Parameters.$host, Parameters.ownerName, Parameters.appName],
  headerParameters: [Parameters.accept],
  serializer
};
const listOperationSpec: coreClient.OperationSpec = {
  path: "/v0.1/apps/{owner_name}/{app_name}/releases",
  httpMethod: "GET",
  responses: {
    200: {
      bodyMapper: {
        type: {
          name: "Sequence",
          element: {
            type: {
              name: "Composite",
              className:
                "Paths13M4B1YV01AppsOwnerNameAppNameReleasesGetResponses200ContentApplicationJsonSchemaItems"
            }
          }
        }
      }
    }
  },
  queryParameters: [Parameters.publishedOnly, Parameters.scope],
  urlParameters: [Parameters.$host, Parameters.ownerName, Parameters.appName],
  headerParameters: [Parameters.accept],
  serializer
};
const listLatestOperationSpec: coreClient.OperationSpec = {
  path: "/v0.1/apps/{owner_name}/{app_name}/recent_releases",
  httpMethod: "GET",
  responses: {
    200: {
      bodyMapper: {
        type: {
          name: "Sequence",
          element: {
            type: {
              name: "Composite",
              className:
                "PathsYi44H6V01AppsOwnerNameAppNameRecentReleasesGetResponses200ContentApplicationJsonSchemaItems"
            }
          }
        }
      }
    }
  },
  urlParameters: [Parameters.$host, Parameters.ownerName, Parameters.appName],
  headerParameters: [Parameters.accept],
  serializer
};
const getLatestByDistributionGroupOperationSpec: coreClient.OperationSpec = {
  path:
    "/v0.1/apps/{owner_name}/{app_name}/distribution_groups/{distribution_group_name}/releases/{release_id}",
  httpMethod: "GET",
  responses: {
    200: {
      bodyMapper:
        Mappers.Paths7CegcuV01AppsOwnerNameAppNameDistributionGroupsDistributionGroupNameReleasesReleaseIdGetResponses200ContentApplicationJsonSchema
    },
    404: {
      bodyMapper:
        Mappers.Paths1Hpnd2WV01AppsOwnerNameAppNameDistributionGroupsDistributionGroupNameReleasesReleaseIdGetResponses404ContentApplicationJsonSchema
    },
    501: {
      bodyMapper:
        Mappers.PathsOst83YV01AppsOwnerNameAppNameDistributionGroupsDistributionGroupNameReleasesReleaseIdGetResponses501ContentApplicationJsonSchema
    }
  },
  urlParameters: [
    Parameters.$host,
    Parameters.releaseId,
    Parameters.ownerName,
    Parameters.appName,
    Parameters.distributionGroupName
  ],
  headerParameters: [Parameters.accept],
  serializer
};
const deleteWithDistributionGroupIdOperationSpec: coreClient.OperationSpec = {
  path:
    "/v0.1/apps/{owner_name}/{app_name}/distribution_groups/{distribution_group_name}/releases/{release_id}",
  httpMethod: "DELETE",
  responses: { 200: {}, 404: {} },
  urlParameters: [
    Parameters.$host,
    Parameters.ownerName,
    Parameters.appName,
    Parameters.distributionGroupName,
    Parameters.releaseId2
  ],
  serializer
};
const listByDistributionGroupOperationSpec: coreClient.OperationSpec = {
  path:
    "/v0.1/apps/{owner_name}/{app_name}/distribution_groups/{distribution_group_name}/releases",
  httpMethod: "GET",
  responses: {
    200: {
      bodyMapper: {
        type: {
          name: "Sequence",
          element: {
            type: {
              name: "Composite",
              className:
                "PathsHninlmV01AppsOwnerNameAppNameDistributionGroupsDistributionGroupNameReleasesGetResponses200ContentApplicationJsonSchemaItems"
            }
          }
        }
      }
    },
    404: {
      bodyMapper:
        Mappers.Paths1JakpdqV01AppsOwnerNameAppNameDistributionGroupsDistributionGroupNameReleasesGetResponses404ContentApplicationJsonSchema
    }
  },
  urlParameters: [
    Parameters.$host,
    Parameters.ownerName,
    Parameters.appName,
    Parameters.distributionGroupName
  ],
  headerParameters: [Parameters.accept],
  serializer
};
