/**
 * PostNL Ecommerce APIsLib
 *
 * This file was automatically generated by APIMATIC v3.0 ( https://www.apimatic.io ).
 */

import { ApiResponse, RequestOptions } from '../core';
import {
  CheckoutPostalCodecheckMethodNotAllowedError,
} from '../errors/checkoutPostalCodecheckMethodNotAllowedError';
import {
  CheckoutPostalCodecheckTooManyRequestError,
} from '../errors/checkoutPostalCodecheckTooManyRequestError';
import {
  CheckoutPostalCodecheckUnauthorizedError,
} from '../errors/checkoutPostalCodecheckUnauthorizedError';
import { CpcResponseError } from '../errors/cpcResponseError';
import { CpcResponseInvalidError } from '../errors/cpcResponseInvalidError';
import { CpcResponse, cpcResponseSchema } from '../models/cpcResponse';
import { array, number, optional, string } from '../schema';
import { BaseController } from './baseController';

export class PostalcodeCheckController extends BaseController {
  /**
   * Please note that this API is not available on the sandbox environment.
   *
   * Request example:
   * ```
   * curl -X GET "https://api.postnl.nl/shipment/checkout/v1/postalcodecheck?postalcode=3571ZZ&amp;
   * housenumber=74&amp;housenumberaddition=bis" \
   * -H "Accept: application/json" \
   * -H "apikey: APIKEY-HERE"
   * ```
   *
   *
   * @param postalcode
   * @param housenumber
   * @param housenumberaddition
   * @return Response from the API call
   */
  async checkoutPostalcodeCheck(
    postalcode: string,
    housenumber: number,
    housenumberaddition?: string,
    requestOptions?: RequestOptions
  ): Promise<ApiResponse<CpcResponse[]>> {
    const req = this.createRequest(
      'GET',
      '/shipment/checkout/v1/postalcodecheck'
    );
    const mapped = req.prepareArgs({
      postalcode: [postalcode, string()],
      housenumber: [housenumber, number()],
      housenumberaddition: [housenumberaddition, optional(string())],
    });
    req.query('postalcode', mapped.postalcode);
    req.query('housenumber', mapped.housenumber);
    req.query('housenumberaddition', mapped.housenumberaddition);
    req.throwOn(400, CpcResponseInvalidError, 'Bad request');
    req.throwOn(401, CheckoutPostalCodecheckUnauthorizedError, 'Invalid apikey');
    req.throwOn(405, CheckoutPostalCodecheckMethodNotAllowedError, 'Method not allowed');
    req.throwOn(429, CheckoutPostalCodecheckTooManyRequestError, 'Too many requests');
    req.throwOn(500, CpcResponseError, 'Internal server error');
    return req.callAsJson(array(cpcResponseSchema), requestOptions);
  }
}
