/*
 * 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 { PagedAsyncIterableIterator } from "@azure/core-paging";
import { DataCollectionRuleAssociations } from "../operationsInterfaces";
import * as coreClient from "@azure/core-client";
import * as Mappers from "../models/mappers";
import * as Parameters from "../models/parameters";
import { MonitorClient } from "../monitorClient";
import {
  DataCollectionRuleAssociationProxyOnlyResource,
  DataCollectionRuleAssociationsListByResourceNextOptionalParams,
  DataCollectionRuleAssociationsListByResourceOptionalParams,
  DataCollectionRuleAssociationsListByRuleNextOptionalParams,
  DataCollectionRuleAssociationsListByRuleOptionalParams,
  DataCollectionRuleAssociationsListByResourceResponse,
  DataCollectionRuleAssociationsListByRuleResponse,
  DataCollectionRuleAssociationsGetOptionalParams,
  DataCollectionRuleAssociationsGetResponse,
  DataCollectionRuleAssociationsCreateOptionalParams,
  DataCollectionRuleAssociationsCreateResponse,
  DataCollectionRuleAssociationsDeleteOptionalParams,
  DataCollectionRuleAssociationsListByResourceNextResponse,
  DataCollectionRuleAssociationsListByRuleNextResponse
} from "../models";

/// <reference lib="esnext.asynciterable" />
/** Class containing DataCollectionRuleAssociations operations. */
export class DataCollectionRuleAssociationsImpl
  implements DataCollectionRuleAssociations {
  private readonly client: MonitorClient;

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

  /**
   * Lists associations for the specified resource.
   * @param resourceUri The identifier of the resource.
   * @param options The options parameters.
   */
  public listByResource(
    resourceUri: string,
    options?: DataCollectionRuleAssociationsListByResourceOptionalParams
  ): PagedAsyncIterableIterator<
    DataCollectionRuleAssociationProxyOnlyResource
  > {
    const iter = this.listByResourcePagingAll(resourceUri, options);
    return {
      next() {
        return iter.next();
      },
      [Symbol.asyncIterator]() {
        return this;
      },
      byPage: () => {
        return this.listByResourcePagingPage(resourceUri, options);
      }
    };
  }

  private async *listByResourcePagingPage(
    resourceUri: string,
    options?: DataCollectionRuleAssociationsListByResourceOptionalParams
  ): AsyncIterableIterator<DataCollectionRuleAssociationProxyOnlyResource[]> {
    let result = await this._listByResource(resourceUri, options);
    yield result.value || [];
    let continuationToken = result.nextLink;
    while (continuationToken) {
      result = await this._listByResourceNext(
        resourceUri,
        continuationToken,
        options
      );
      continuationToken = result.nextLink;
      yield result.value || [];
    }
  }

  private async *listByResourcePagingAll(
    resourceUri: string,
    options?: DataCollectionRuleAssociationsListByResourceOptionalParams
  ): AsyncIterableIterator<DataCollectionRuleAssociationProxyOnlyResource> {
    for await (const page of this.listByResourcePagingPage(
      resourceUri,
      options
    )) {
      yield* page;
    }
  }

  /**
   * Lists associations for the specified data collection rule.
   * @param resourceGroupName The name of the resource group. The name is case insensitive.
   * @param dataCollectionRuleName The name of the data collection rule. The name is case insensitive.
   * @param options The options parameters.
   */
  public listByRule(
    resourceGroupName: string,
    dataCollectionRuleName: string,
    options?: DataCollectionRuleAssociationsListByRuleOptionalParams
  ): PagedAsyncIterableIterator<
    DataCollectionRuleAssociationProxyOnlyResource
  > {
    const iter = this.listByRulePagingAll(
      resourceGroupName,
      dataCollectionRuleName,
      options
    );
    return {
      next() {
        return iter.next();
      },
      [Symbol.asyncIterator]() {
        return this;
      },
      byPage: () => {
        return this.listByRulePagingPage(
          resourceGroupName,
          dataCollectionRuleName,
          options
        );
      }
    };
  }

  private async *listByRulePagingPage(
    resourceGroupName: string,
    dataCollectionRuleName: string,
    options?: DataCollectionRuleAssociationsListByRuleOptionalParams
  ): AsyncIterableIterator<DataCollectionRuleAssociationProxyOnlyResource[]> {
    let result = await this._listByRule(
      resourceGroupName,
      dataCollectionRuleName,
      options
    );
    yield result.value || [];
    let continuationToken = result.nextLink;
    while (continuationToken) {
      result = await this._listByRuleNext(
        resourceGroupName,
        dataCollectionRuleName,
        continuationToken,
        options
      );
      continuationToken = result.nextLink;
      yield result.value || [];
    }
  }

  private async *listByRulePagingAll(
    resourceGroupName: string,
    dataCollectionRuleName: string,
    options?: DataCollectionRuleAssociationsListByRuleOptionalParams
  ): AsyncIterableIterator<DataCollectionRuleAssociationProxyOnlyResource> {
    for await (const page of this.listByRulePagingPage(
      resourceGroupName,
      dataCollectionRuleName,
      options
    )) {
      yield* page;
    }
  }

  /**
   * Lists associations for the specified resource.
   * @param resourceUri The identifier of the resource.
   * @param options The options parameters.
   */
  private _listByResource(
    resourceUri: string,
    options?: DataCollectionRuleAssociationsListByResourceOptionalParams
  ): Promise<DataCollectionRuleAssociationsListByResourceResponse> {
    return this.client.sendOperationRequest(
      { resourceUri, options },
      listByResourceOperationSpec
    );
  }

  /**
   * Lists associations for the specified data collection rule.
   * @param resourceGroupName The name of the resource group. The name is case insensitive.
   * @param dataCollectionRuleName The name of the data collection rule. The name is case insensitive.
   * @param options The options parameters.
   */
  private _listByRule(
    resourceGroupName: string,
    dataCollectionRuleName: string,
    options?: DataCollectionRuleAssociationsListByRuleOptionalParams
  ): Promise<DataCollectionRuleAssociationsListByRuleResponse> {
    return this.client.sendOperationRequest(
      { resourceGroupName, dataCollectionRuleName, options },
      listByRuleOperationSpec
    );
  }

  /**
   * Returns the specified association.
   * @param resourceUri The identifier of the resource.
   * @param associationName The name of the association. The name is case insensitive.
   * @param options The options parameters.
   */
  get(
    resourceUri: string,
    associationName: string,
    options?: DataCollectionRuleAssociationsGetOptionalParams
  ): Promise<DataCollectionRuleAssociationsGetResponse> {
    return this.client.sendOperationRequest(
      { resourceUri, associationName, options },
      getOperationSpec
    );
  }

  /**
   * Creates or updates an association.
   * @param resourceUri The identifier of the resource.
   * @param associationName The name of the association. The name is case insensitive.
   * @param options The options parameters.
   */
  create(
    resourceUri: string,
    associationName: string,
    options?: DataCollectionRuleAssociationsCreateOptionalParams
  ): Promise<DataCollectionRuleAssociationsCreateResponse> {
    return this.client.sendOperationRequest(
      { resourceUri, associationName, options },
      createOperationSpec
    );
  }

  /**
   * Deletes an association.
   * @param resourceUri The identifier of the resource.
   * @param associationName The name of the association. The name is case insensitive.
   * @param options The options parameters.
   */
  delete(
    resourceUri: string,
    associationName: string,
    options?: DataCollectionRuleAssociationsDeleteOptionalParams
  ): Promise<void> {
    return this.client.sendOperationRequest(
      { resourceUri, associationName, options },
      deleteOperationSpec
    );
  }

  /**
   * ListByResourceNext
   * @param resourceUri The identifier of the resource.
   * @param nextLink The nextLink from the previous successful call to the ListByResource method.
   * @param options The options parameters.
   */
  private _listByResourceNext(
    resourceUri: string,
    nextLink: string,
    options?: DataCollectionRuleAssociationsListByResourceNextOptionalParams
  ): Promise<DataCollectionRuleAssociationsListByResourceNextResponse> {
    return this.client.sendOperationRequest(
      { resourceUri, nextLink, options },
      listByResourceNextOperationSpec
    );
  }

  /**
   * ListByRuleNext
   * @param resourceGroupName The name of the resource group. The name is case insensitive.
   * @param dataCollectionRuleName The name of the data collection rule. The name is case insensitive.
   * @param nextLink The nextLink from the previous successful call to the ListByRule method.
   * @param options The options parameters.
   */
  private _listByRuleNext(
    resourceGroupName: string,
    dataCollectionRuleName: string,
    nextLink: string,
    options?: DataCollectionRuleAssociationsListByRuleNextOptionalParams
  ): Promise<DataCollectionRuleAssociationsListByRuleNextResponse> {
    return this.client.sendOperationRequest(
      { resourceGroupName, dataCollectionRuleName, nextLink, options },
      listByRuleNextOperationSpec
    );
  }
}
// Operation Specifications
const serializer = coreClient.createSerializer(Mappers, /* isXml */ false);

const listByResourceOperationSpec: coreClient.OperationSpec = {
  path:
    "/{resourceUri}/providers/Microsoft.Insights/dataCollectionRuleAssociations",
  httpMethod: "GET",
  responses: {
    200: {
      bodyMapper:
        Mappers.DataCollectionRuleAssociationProxyOnlyResourceListResult
    },
    default: {
      bodyMapper: Mappers.ErrorResponseCommonV2
    }
  },
  queryParameters: [Parameters.apiVersion12],
  urlParameters: [Parameters.$host, Parameters.resourceUri1],
  headerParameters: [Parameters.accept],
  serializer
};
const listByRuleOperationSpec: coreClient.OperationSpec = {
  path:
    "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Insights/dataCollectionRules/{dataCollectionRuleName}/associations",
  httpMethod: "GET",
  responses: {
    200: {
      bodyMapper:
        Mappers.DataCollectionRuleAssociationProxyOnlyResourceListResult
    },
    default: {
      bodyMapper: Mappers.ErrorResponseCommonV2
    }
  },
  queryParameters: [Parameters.apiVersion12],
  urlParameters: [
    Parameters.$host,
    Parameters.resourceGroupName,
    Parameters.subscriptionId,
    Parameters.dataCollectionRuleName
  ],
  headerParameters: [Parameters.accept],
  serializer
};
const getOperationSpec: coreClient.OperationSpec = {
  path:
    "/{resourceUri}/providers/Microsoft.Insights/dataCollectionRuleAssociations/{associationName}",
  httpMethod: "GET",
  responses: {
    200: {
      bodyMapper: Mappers.DataCollectionRuleAssociationProxyOnlyResource
    },
    default: {
      bodyMapper: Mappers.ErrorResponseCommonV2
    }
  },
  queryParameters: [Parameters.apiVersion12],
  urlParameters: [
    Parameters.$host,
    Parameters.resourceUri1,
    Parameters.associationName
  ],
  headerParameters: [Parameters.accept],
  serializer
};
const createOperationSpec: coreClient.OperationSpec = {
  path:
    "/{resourceUri}/providers/Microsoft.Insights/dataCollectionRuleAssociations/{associationName}",
  httpMethod: "PUT",
  responses: {
    200: {
      bodyMapper: Mappers.DataCollectionRuleAssociationProxyOnlyResource
    },
    201: {
      bodyMapper: Mappers.DataCollectionRuleAssociationProxyOnlyResource
    },
    default: {
      bodyMapper: Mappers.ErrorResponseCommonV2
    }
  },
  requestBody: Parameters.body2,
  queryParameters: [Parameters.apiVersion12],
  urlParameters: [
    Parameters.$host,
    Parameters.resourceUri1,
    Parameters.associationName
  ],
  headerParameters: [Parameters.accept, Parameters.contentType],
  mediaType: "json",
  serializer
};
const deleteOperationSpec: coreClient.OperationSpec = {
  path:
    "/{resourceUri}/providers/Microsoft.Insights/dataCollectionRuleAssociations/{associationName}",
  httpMethod: "DELETE",
  responses: {
    200: {},
    204: {},
    default: {
      bodyMapper: Mappers.ErrorResponseCommonV2
    }
  },
  queryParameters: [Parameters.apiVersion12],
  urlParameters: [
    Parameters.$host,
    Parameters.resourceUri1,
    Parameters.associationName
  ],
  headerParameters: [Parameters.accept],
  serializer
};
const listByResourceNextOperationSpec: coreClient.OperationSpec = {
  path: "{nextLink}",
  httpMethod: "GET",
  responses: {
    200: {
      bodyMapper:
        Mappers.DataCollectionRuleAssociationProxyOnlyResourceListResult
    },
    default: {
      bodyMapper: Mappers.ErrorResponseCommonV2
    }
  },
  queryParameters: [Parameters.apiVersion12],
  urlParameters: [
    Parameters.$host,
    Parameters.nextLink,
    Parameters.resourceUri1
  ],
  headerParameters: [Parameters.accept],
  serializer
};
const listByRuleNextOperationSpec: coreClient.OperationSpec = {
  path: "{nextLink}",
  httpMethod: "GET",
  responses: {
    200: {
      bodyMapper:
        Mappers.DataCollectionRuleAssociationProxyOnlyResourceListResult
    },
    default: {
      bodyMapper: Mappers.ErrorResponseCommonV2
    }
  },
  queryParameters: [Parameters.apiVersion12],
  urlParameters: [
    Parameters.$host,
    Parameters.resourceGroupName,
    Parameters.subscriptionId,
    Parameters.nextLink,
    Parameters.dataCollectionRuleName
  ],
  headerParameters: [Parameters.accept],
  serializer
};
