public function validateResponse(ZboziApiResponse $response)
 {
     if (preg_match('~^2~', $response->getStatusCode())) {
         return;
     }
     $responseBody = $response->getBody();
     if (preg_match('~^4~', $response->getStatusCode())) {
         if (!isset($responseBody['status'])) {
             throw new \SlevomatZboziApi\Response\ResponseErrorException(sprintf('Slevomat API invalid %s response: missing status.', $response->getStatusCode()));
         }
         if (!isset($responseBody['messages'])) {
             throw new \SlevomatZboziApi\Response\ResponseErrorException(sprintf('Slevomat API invalid %s response: missing messages.', $response->getStatusCode()));
         }
         switch ($responseBody['status']) {
             case InvalidRequestType::BAD_REQUEST:
                 throw new \SlevomatZboziApi\Request\BadRequestException($responseBody['messages']);
             case InvalidRequestType::INVALID_CREDENTIALS:
                 throw new \SlevomatZboziApi\Request\InvalidCredentialsException($responseBody['messages']);
             case InvalidRequestType::ORDER_NOT_FOUND:
                 throw new \SlevomatZboziApi\Request\OrderNotFoundException($responseBody['messages']);
             case InvalidRequestType::ORDER_ITEM_NOT_FOUND:
                 throw new \SlevomatZboziApi\Request\OrderItemNotFoundException($responseBody['messages']);
             case InvalidRequestType::INVALID_STATUS_CHANGE:
                 throw new \SlevomatZboziApi\Request\InvalidStatusChangeException($responseBody['messages']);
             case InvalidRequestType::INVALID_CANCEL:
                 throw new \SlevomatZboziApi\Request\InvalidCancelException($responseBody['messages']);
             case InvalidRequestType::OTHER_ERROR:
                 throw new \SlevomatZboziApi\Request\OtherRequestErrorException($responseBody['messages']);
             case InvalidRequestType::ORDER_NOT_EXPORTED:
                 throw new \SlevomatZboziApi\Request\OrderNotExportedException($responseBody['messages']);
             default:
                 throw new \SlevomatZboziApi\Response\ResponseErrorException(sprintf('Slevomat API %s response contains unknown status %s.', $response->getStatusCode(), $responseBody['status']));
         }
     }
     throw new \SlevomatZboziApi\Response\ResponseErrorException(sprintf('Slevomat API responded with unexpected HTTP status code: %s.', $response->getStatusCode()));
 }
 public function log(\SlevomatZboziApi\Request\ZboziApiRequest $request, \SlevomatZboziApi\Response\ZboziApiResponse $response = null)
 {
     $responseData = $response === null ? '-' : sprintf('%s %s', $response->getStatusCode(), $response->getBody() === null ? '' : json_encode($response->getBody()));
     echo sprintf('<br><b>HTTP request</b>: %s %s | (%s:%s) | %s<br><br><b>HTTP response</b>: %s<br>', $request->getMethod(), $request->getUrl(), $request->getHeader(\SlevomatZboziApi\Request\RequestMaker::HEADER_PARTNER_TOKEN), $request->getHeader(\SlevomatZboziApi\Request\RequestMaker::HEADER_API_SECRET), $request->getBody() === null ? '-' : json_encode($request->getBody()), $responseData);
 }