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

import { ApiResponse, RequestOptions } from '../core';
import {
  LabellingMethodNotAllowedError,
} from '../errors/labellingMethodNotAllowedError';
import { LabellingResponseError } from '../errors/labellingResponseError';
import {
  LabellingResponseInvalidError,
} from '../errors/labellingResponseInvalidError';
import {
  LabellingTooManyRequestError,
} from '../errors/labellingTooManyRequestError';
import {
  LabellingUnauthorizedError,
} from '../errors/labellingUnauthorizedError';
import {
  LabellingRequest,
  labellingRequestSchema,
} from '../models/labellingRequest';
import {
  LabellingResponse,
  labellingResponseSchema,
} from '../models/labellingResponse';
import { boolean, optional } from '../schema';
import { BaseController } from './baseController';

export class LabellingController extends BaseController {
  /**
   * Generate a label and confirmation
   *
   * @param body
   * @param confirm      With the Confirm boolean in the request, you can determine if you
   *                                                want to confirm the shipment in the same call or not. If the
   *                                                Boolean variable is true the shipment will be preannounced. If this
   *                                                is set to false, then an additional Confirming API request needs to
   *                                                be made.
   * @return Response from the API call
   */
  async generateALabelAndConfirmation(
    body: LabellingRequest,
    confirm?: boolean,
    requestOptions?: RequestOptions
  ): Promise<ApiResponse<LabellingResponse>> {
    const req = this.createRequest('POST', '/shipment/v2_2/label');
    const mapped = req.prepareArgs({
      body: [body, labellingRequestSchema],
      confirm: [confirm, optional(boolean())],
    });
    req.header('Content-Type', 'application/json');
    req.query('confirm', mapped.confirm);
    req.json(mapped.body);
    req.throwOn(400, LabellingResponseInvalidError, 'Error payload');
    req.throwOn(401, LabellingUnauthorizedError, 'Invalid apikey');
    req.throwOn(405, LabellingMethodNotAllowedError, 'Method not allowed');
    req.throwOn(429, LabellingTooManyRequestError, 'Too many requests');
    req.throwOn(500, LabellingResponseError, 'Internal server error');
    return req.callAsJson(labellingResponseSchema, requestOptions);
  }
}
