/**
 * Shell EVLib
 *
 * This file was automatically generated by APIMATIC v3.0 ( https://www.apimatic.io ).
 */

import { ApiResponse, RequestOptions } from '../core';
import {
  ActiveResponse200Json,
  activeResponse200JsonSchema,
} from '../models/activeResponse200Json';
import {
  ChargesessionStartBody,
  chargesessionStartBodySchema,
} from '../models/chargesessionStartBody';
import {
  GetChargeSessionRetrieveResponse200Json,
  getChargeSessionRetrieveResponse200JsonSchema,
} from '../models/getChargeSessionRetrieveResponse200Json';
import {
  InlineResponse202,
  inlineResponse202Schema,
} from '../models/inlineResponse202';
import {
  InlineResponse2021,
  inlineResponse2021Schema,
} from '../models/inlineResponse2021';
import { optional, string } from '../schema';
import { BaseController } from './baseController';
import { BadRequestError } from '../errors/badRequestError';
import { InternalServerError } from '../errors/internalServerError';
import { NotFoundError } from '../errors/notFoundError';
import { ServiceunavailableError } from '../errors/serviceunavailableError';
import { TooManyRequestsError } from '../errors/tooManyRequestsError';
import { UnauthorizedError } from '../errors/unauthorizedError';

export class ChargingController extends BaseController {
  /**
   * This endpoint start the charging session for the user.
   *
   * @param requestId    RequestId must be unique identifier value that can be used
   *                                                      by the consumer to correlate each request /response .
   *                                                      <br>Format.<br> Its canonical textual representation, the 16
   *                                                      octets of a UUID are represented as 32 hexadecimal (base-16)
   *                                                      digits, displayed in five groups separated by hyphens, in the
   *                                                      form 8-4-4-4-12 for a total of 36 characters (32 hexadecimal
   *                                                      characters and 4 hyphens) <br>
   * @param body
   * @return Response from the API call
   */
  async start(
    requestId: string,
    body?: ChargesessionStartBody,
    requestOptions?: RequestOptions
  ): Promise<ApiResponse<InlineResponse202>> {
    const req = this.createRequest('POST', '/charge-session/start');
    const mapped = req.prepareArgs({
      requestId: [requestId, string()],
      body: [body, optional(chargesessionStartBodySchema)],
    });
    req.header('RequestId', mapped.requestId);
    req.header('Content-Type', 'application/json');
    req.json(mapped.body);
    req.throwOn(
      400,
      BadRequestError,
      'The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).'
    );
    req.throwOn(
      401,
      UnauthorizedError,
      'The request has not been applied because it lacks valid authentication credentials for the target resource.'
    );
    req.throwOn(404, NotFoundError, 'Location Not Found');
    req.throwOn(
      429,
      TooManyRequestsError,
      'The Request reached maximum allocated rate limit'
    );
    req.throwOn(500, InternalServerError, 'Internal Server error');
    req.throwOn(503, ServiceunavailableError, 'Service unavailable');
    req.authenticate([{ bearerAuth: true }]);
    return req.callAsJson(inlineResponse202Schema, requestOptions);
  }

  /**
   * Accepts a request to stop an active session when a valid session id is provided.
   *
   * @param requestId RequestId must be unique identifier value that can be used by the consumer to
   *                            correlate each request /response .<br>Format.<br> Its canonical textual representation,
   *                            the 16 octets of a UUID are represented as 32 hexadecimal (base-16) digits, displayed
   *                            in five groups separated by hyphens, in the form 8-4-4-4-12 for a total of 36
   *                            characters (32 hexadecimal characters and 4 hyphens) <br>
   * @param sessionId Session Id
   * @return Response from the API call
   */
  async stop(
    requestId: string,
    sessionId: string,
    requestOptions?: RequestOptions
  ): Promise<ApiResponse<InlineResponse2021>> {
    const req = this.createRequest('POST', '/charge-session/stop');
    const mapped = req.prepareArgs({
      requestId: [requestId, string()],
      sessionId: [sessionId, string()],
    });
    req.header('RequestId', mapped.requestId);
    req.query('sessionId', mapped.sessionId);
    req.throwOn(
      400,
      BadRequestError,
      'The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).'
    );
    req.throwOn(
      401,
      UnauthorizedError,
      'The request has not been applied because it lacks valid authentication credentials for the target resource.'
    );
    req.throwOn(404, NotFoundError, 'Location Not Found');
    req.throwOn(
      429,
      TooManyRequestsError,
      'The Request reached maximum allocated rate limit'
    );
    req.throwOn(500, InternalServerError, 'Internal Server error');
    req.throwOn(503, ServiceunavailableError, 'Service unavailable');
    req.authenticate([{ bearerAuth: true }]);
    return req.callAsJson(inlineResponse2021Schema, requestOptions);
  }

  /**
   * This endpoint returns the details of the session if the session is found.
   *
   * @param requestId RequestId must be unique identifier value that can be used by the consumer to
   *                            correlate each request /response .<br>Format.<br> Its canonical textual representation,
   *                            the 16 octets of a UUID are represented as 32 hexadecimal (base-16) digits, displayed
   *                            in five groups separated by hyphens, in the form 8-4-4-4-12 for a total of 36
   *                            characters (32 hexadecimal characters and 4 hyphens) <br>
   * @param sessionId Session Id
   * @return Response from the API call
   */
  async getChargeSessionRetrieve(
    requestId: string,
    sessionId: string,
    requestOptions?: RequestOptions
  ): Promise<ApiResponse<GetChargeSessionRetrieveResponse200Json>> {
    const req = this.createRequest('GET', '/charge-session/retrieve');
    const mapped = req.prepareArgs({
      requestId: [requestId, string()],
      sessionId: [sessionId, string()],
    });
    req.header('RequestId', mapped.requestId);
    req.query('sessionId', mapped.sessionId);
    req.throwOn(
      400,
      BadRequestError,
      'The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).'
    );
    req.throwOn(
      401,
      UnauthorizedError,
      'The request has not been applied because it lacks valid authentication credentials for the target resource.'
    );
    req.throwOn(404, NotFoundError, 'Location Not Found');
    req.throwOn(
      429,
      TooManyRequestsError,
      'The Request reached maximum allocated rate limit'
    );
    req.throwOn(500, InternalServerError, 'Internal Server error');
    req.throwOn(503, ServiceunavailableError, 'Service unavailable');
    req.authenticate([{ bearerAuth: true }]);
    return req.callAsJson(
      getChargeSessionRetrieveResponse200JsonSchema,
      requestOptions
    );
  }

  /**
   * Fetrches the active sessions for user.
   *
   * @param requestId RequestId must be unique identifier value that can be used by the consumer to
   *                            correlate each request /response .<br>Format.<br> Its canonical textual representation,
   *                            the 16 octets of a UUID are represented as 32 hexadecimal (base-16) digits, displayed
   *                            in five groups separated by hyphens, in the form 8-4-4-4-12 for a total of 36
   *                            characters (32 hexadecimal characters and 4 hyphens) <br>
   * @param emaId     Emobility Account Identifier(Ema-ID)
   * @return Response from the API call
   */
  async active(
    requestId: string,
    emaId: string,
    requestOptions?: RequestOptions
  ): Promise<ApiResponse<ActiveResponse200Json>> {
    const req = this.createRequest('GET', '/charge-session/active');
    const mapped = req.prepareArgs({
      requestId: [requestId, string()],
      emaId: [emaId, string()],
    });
    req.header('RequestId', mapped.requestId);
    req.query('emaId', mapped.emaId);
    req.authenticate([{ bearerAuth: true }]);
    return req.callAsJson(activeResponse200JsonSchema, requestOptions);
  }
}
