text: /**
   * 
   * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
   *
   * The version of the OpenAPI document: 20220523
   *
   * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
   * https://openapi-generator.tech
   * Do not edit the class manually.
   */
  
  #include "OAIPokemonShapeApi.h"
  #include "OAIServerConfiguration.h"
  #include <QJsonArray>
  #include <QJsonDocument>
  
  namespace OpenAPI {
  
  OAIPokemonShapeApi::OAIPokemonShapeApi(const int timeOut)
      : _timeOut(timeOut),
        _manager(nullptr),
        _isResponseCompressionEnabled(false),
        _isRequestCompressionEnabled(false) {
      initializeServerConfigs();
  }
  
  OAIPokemonShapeApi::~OAIPokemonShapeApi() {
  }
  
  void OAIPokemonShapeApi::initializeServerConfigs() {
      //Default server
      QList<OAIServerConfiguration> defaultConf = QList<OAIServerConfiguration>();
      //varying endpoint server
      defaultConf.append(OAIServerConfiguration(
      QUrl("https://pokeapi.co/"),
      "No description provided",
      QMap<QString, OAIServerVariable>()));
      _serverConfigs.insert("pokemonShapeList", defaultConf);
      _serverIndices.insert("pokemonShapeList", 0);
      _serverConfigs.insert("pokemonShapeRead", defaultConf);
      _serverIndices.insert("pokemonShapeRead", 0);
  }
  
  /**
  * returns 0 on success and -1, -2 or -3 on failure.
  * -1 when the variable does not exist and -2 if the value is not defined in the enum and -3 if the operation or server index is not found
  */
  int OAIPokemonShapeApi::setDefaultServerValue(int serverIndex, const QString &operation, const QString &variable, const QString &value) {
      auto it = _serverConfigs.find(operation);
      if (it != _serverConfigs.end() && serverIndex < it.value().size()) {
        return _serverConfigs[operation][serverIndex].setDefaultValue(variable,value);
      }
      return -3;
  }
  void OAIPokemonShapeApi::setServerIndex(const QString &operation, int serverIndex) {
      if (_serverIndices.contains(operation) && serverIndex < _serverConfigs.find(operation).value().size()) {
          _serverIndices[operation] = serverIndex;
      }
  }
  
  void OAIPokemonShapeApi::setApiKey(const QString &apiKeyName, const QString &apiKey) {
      _apiKeys.insert(apiKeyName,apiKey);
  }
  
  void OAIPokemonShapeApi::setBearerToken(const QString &token) {
      _bearerToken = token;
  }
  
  void OAIPokemonShapeApi::setUsername(const QString &username) {
      _username = username;
  }
  
  void OAIPokemonShapeApi::setPassword(const QString &password) {
      _password = password;
  }
  
  
  void OAIPokemonShapeApi::setTimeOut(const int timeOut) {
      _timeOut = timeOut;
  }
  
  void OAIPokemonShapeApi::setWorkingDirectory(const QString &path) {
      _workingDirectory = path;
  }
  
  void OAIPokemonShapeApi::setNetworkAccessManager(QNetworkAccessManager* manager) {
      _manager = manager;
  }
  
  /**
      * Appends a new ServerConfiguration to the config map for a specific operation.
      * @param operation The id to the target operation.
      * @param url A string that contains the URL of the server
      * @param description A String that describes the server
      * @param variables A map between a variable name and its value. The value is used for substitution in the server's URL template.
      * returns the index of the new server config on success and -1 if the operation is not found
      */
  int OAIPokemonShapeApi::addServerConfiguration(const QString &operation, const QUrl &url, const QString &description, const QMap<QString, OAIServerVariable> &variables) {
      if (_serverConfigs.contains(operation)) {
          _serverConfigs[operation].append(OAIServerConfiguration(
                      url,
                      description,
                      variables));
          return _serverConfigs[operation].size()-1;
      } else {
          return -1;
      }
  }
  
  /**
      * Appends a new ServerConfiguration to the config map for a all operations and sets the index to that server.
      * @param url A string that contains the URL of the server
      * @param description A String that describes the server
      * @param variables A map between a variable name and its value. The value is used for substitution in the server's URL template.
      */
  void OAIPokemonShapeApi::setNewServerForAllOperations(const QUrl &url, const QString &description, const QMap<QString, OAIServerVariable> &variables) {
  #if QT_VERSION >= QT_VERSION_CHECK(5, 12, 0)
      for (auto keyIt = _serverIndices.keyBegin(); keyIt != _serverIndices.keyEnd(); keyIt++) {
          setServerIndex(*keyIt, addServerConfiguration(*keyIt, url, description, variables));
      }
  #else
      for (auto &e : _serverIndices.keys()) {
          setServerIndex(e, addServerConfiguration(e, url, description, variables));
      }
  #endif
  }
  
  /**
      * Appends a new ServerConfiguration to the config map for an operations and sets the index to that server.
      * @param URL A string that contains the URL of the server
      * @param description A String that describes the server
      * @param variables A map between a variable name and its value. The value is used for substitution in the server's URL template.
      */
  void OAIPokemonShapeApi::setNewServer(const QString &operation, const QUrl &url, const QString &description, const QMap<QString, OAIServerVariable> &variables) {
      setServerIndex(operation, addServerConfiguration(operation, url, description, variables));
  }
  
  void OAIPokemonShapeApi::addHeaders(const QString &key, const QString &value) {
      _defaultHeaders.insert(key, value);
  }
  
  void OAIPokemonShapeApi::enableRequestCompression() {
      _isRequestCompressionEnabled = true;
  }
  
  void OAIPokemonShapeApi::enableResponseCompression() {
      _isResponseCompressionEnabled = true;
  }
  
  void OAIPokemonShapeApi::abortRequests() {
      emit abortRequestsSignal();
  }
  
  QString OAIPokemonShapeApi::getParamStylePrefix(const QString &style) {
      if (style == "matrix") {
          return ";";
      } else if (style == "label") {
          return ".";
      } else if (style == "form") {
          return "&";
      } else if (style == "simple") {
          return "";
      } else if (style == "spaceDelimited") {
          return "&";
      } else if (style == "pipeDelimited") {
          return "&";
      } else {
          return "none";
      }
  }
  
  QString OAIPokemonShapeApi::getParamStyleSuffix(const QString &style) {
      if (style == "matrix") {
          return "=";
      } else if (style == "label") {
          return "";
      } else if (style == "form") {
          return "=";
      } else if (style == "simple") {
          return "";
      } else if (style == "spaceDelimited") {
          return "=";
      } else if (style == "pipeDelimited") {
          return "=";
      } else {
          return "none";
      }
  }
  
  QString OAIPokemonShapeApi::getParamStyleDelimiter(const QString &style, const QString &name, bool isExplode) {
  
      if (style == "matrix") {
          return (isExplode) ? ";" + name + "=" : ",";
  
      } else if (style == "label") {
          return (isExplode) ? "." : ",";
  
      } else if (style == "form") {
          return (isExplode) ? "&" + name + "=" : ",";
  
      } else if (style == "simple") {
          return ",";
      } else if (style == "spaceDelimited") {
          return (isExplode) ? "&" + name + "=" : " ";
  
      } else if (style == "pipeDelimited") {
          return (isExplode) ? "&" + name + "=" : "|";
  
      } else if (style == "deepObject") {
          return (isExplode) ? "&" : "none";
  
      } else {
          return "none";
      }
  }
  
  void OAIPokemonShapeApi::pokemonShapeList(const ::OpenAPI::OptionalParam<qint32> &limit, const ::OpenAPI::OptionalParam<qint32> &offset) {
      QString fullPath = QString(_serverConfigs["pokemonShapeList"][_serverIndices.value("pokemonShapeList")].URL()+"/api/v2/pokemon-shape/");
      
      QString queryPrefix, querySuffix, queryDelimiter, queryStyle;
      if (limit.hasValue())
      {
          queryStyle = "form";
          if (queryStyle == "")
              queryStyle = "form";
          queryPrefix = getParamStylePrefix(queryStyle);
          querySuffix = getParamStyleSuffix(queryStyle);
          queryDelimiter = getParamStyleDelimiter(queryStyle, "limit", true);
          if (fullPath.indexOf("?") > 0)
              fullPath.append(queryPrefix);
          else
              fullPath.append("?");
  
          fullPath.append(QUrl::toPercentEncoding("limit")).append(querySuffix).append(QUrl::toPercentEncoding(::OpenAPI::toStringValue(limit.value())));
      }
      if (offset.hasValue())
      {
          queryStyle = "form";
          if (queryStyle == "")
              queryStyle = "form";
          queryPrefix = getParamStylePrefix(queryStyle);
          querySuffix = getParamStyleSuffix(queryStyle);
          queryDelimiter = getParamStyleDelimiter(queryStyle, "offset", true);
          if (fullPath.indexOf("?") > 0)
              fullPath.append(queryPrefix);
          else
              fullPath.append("?");
  
          fullPath.append(QUrl::toPercentEncoding("offset")).append(querySuffix).append(QUrl::toPercentEncoding(::OpenAPI::toStringValue(offset.value())));
      }
      OAIHttpRequestWorker *worker = new OAIHttpRequestWorker(this, _manager);
      worker->setTimeOut(_timeOut);
      worker->setWorkingDirectory(_workingDirectory);
      OAIHttpRequestInput input(fullPath, "GET");
  
  
  #if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0)
      for (auto keyValueIt = _defaultHeaders.keyValueBegin(); keyValueIt != _defaultHeaders.keyValueEnd(); keyValueIt++) {
          input.headers.insert(keyValueIt->first, keyValueIt->second);
      }
  #else
      for (auto key : _defaultHeaders.keys()) {
          input.headers.insert(key, _defaultHeaders[key]);
      }
  #endif
  
      connect(worker, &OAIHttpRequestWorker::on_execution_finished, this, &OAIPokemonShapeApi::pokemonShapeListCallback);
      connect(this, &OAIPokemonShapeApi::abortRequestsSignal, worker, &QObject::deleteLater);
      connect(worker, &QObject::destroyed, this, [this]() {
          if (findChildren<OAIHttpRequestWorker*>().count() == 0) {
              emit allPendingRequestsCompleted();
          }
      });
  
      worker->execute(&input);
  }
  
  void OAIPokemonShapeApi::pokemonShapeListCallback(OAIHttpRequestWorker *worker) {
      QString error_str = worker->error_str;
      QNetworkReply::NetworkError error_type = worker->error_type;
  
      if (worker->error_type != QNetworkReply::NoError) {
          error_str = QString("%1, %2").arg(worker->error_str, QString(worker->response));
      }
      QString output;
      ::OpenAPI::fromStringValue(QString(worker->response), output);
      worker->deleteLater();
  
      if (worker->error_type == QNetworkReply::NoError) {
          emit pokemonShapeListSignal(output);
          emit pokemonShapeListSignalFull(worker, output);
      } else {
          emit pokemonShapeListSignalE(output, error_type, error_str);
          emit pokemonShapeListSignalEFull(worker, error_type, error_str);
      }
  }
  
  void OAIPokemonShapeApi::pokemonShapeRead(const qint32 &id) {
      QString fullPath = QString(_serverConfigs["pokemonShapeRead"][_serverIndices.value("pokemonShapeRead")].URL()+"/api/v2/pokemon-shape/{id}/");
      
      
      {
          QString idPathParam("{");
          idPathParam.append("id").append("}");
          QString pathPrefix, pathSuffix, pathDelimiter;
          QString pathStyle = "simple";
          if (pathStyle == "")
              pathStyle = "simple";
          pathPrefix = getParamStylePrefix(pathStyle);
          pathSuffix = getParamStyleSuffix(pathStyle);
          pathDelimiter = getParamStyleDelimiter(pathStyle, "id", false);
          QString paramString = (pathStyle == "matrix") ? pathPrefix+"id"+pathSuffix : pathPrefix;
          fullPath.replace(idPathParam, paramString+QUrl::toPercentEncoding(::OpenAPI::toStringValue(id)));
      }
      OAIHttpRequestWorker *worker = new OAIHttpRequestWorker(this, _manager);
      worker->setTimeOut(_timeOut);
      worker->setWorkingDirectory(_workingDirectory);
      OAIHttpRequestInput input(fullPath, "GET");
  
  
  #if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0)
      for (auto keyValueIt = _defaultHeaders.keyValueBegin(); keyValueIt != _defaultHeaders.keyValueEnd(); keyValueIt++) {
          input.headers.insert(keyValueIt->first, keyValueIt->second);
      }
  #else
      for (auto key : _defaultHeaders.keys()) {
          input.headers.insert(key, _defaultHeaders[key]);
      }
  #endif
  
      connect(worker, &OAIHttpRequestWorker::on_execution_finished, this, &OAIPokemonShapeApi::pokemonShapeReadCallback);
      connect(this, &OAIPokemonShapeApi::abortRequestsSignal, worker, &QObject::deleteLater);
      connect(worker, &QObject::destroyed, this, [this]() {
          if (findChildren<OAIHttpRequestWorker*>().count() == 0) {
              emit allPendingRequestsCompleted();
          }
      });
  
      worker->execute(&input);
  }
  
  void OAIPokemonShapeApi::pokemonShapeReadCallback(OAIHttpRequestWorker *worker) {
      QString error_str = worker->error_str;
      QNetworkReply::NetworkError error_type = worker->error_type;
  
      if (worker->error_type != QNetworkReply::NoError) {
          error_str = QString("%1, %2").arg(worker->error_str, QString(worker->response));
      }
      QString output;
      ::OpenAPI::fromStringValue(QString(worker->response), output);
      worker->deleteLater();
  
      if (worker->error_type == QNetworkReply::NoError) {
          emit pokemonShapeReadSignal(output);
          emit pokemonShapeReadSignalFull(worker, output);
      } else {
          emit pokemonShapeReadSignalE(output, error_type, error_str);
          emit pokemonShapeReadSignalEFull(worker, error_type, error_str);
      }
  }
  
  void OAIPokemonShapeApi::tokenAvailable(){
    
      oauthToken token; 
      switch (_OauthMethod) {
      case 1: //implicit flow
          token = _implicitFlow.getToken(_latestScope.join(" "));
          if(token.isValid()){
              _latestInput.headers.insert("Authorization", "Bearer " + token.getToken());
              _latestWorker->execute(&_latestInput);
          }else{
              _implicitFlow.removeToken(_latestScope.join(" "));
              qDebug() << "Could not retreive a valid token";
          }
          break;
      case 2: //authorization flow
          token = _authFlow.getToken(_latestScope.join(" "));
          if(token.isValid()){
              _latestInput.headers.insert("Authorization", "Bearer " + token.getToken());
              _latestWorker->execute(&_latestInput);
          }else{
              _authFlow.removeToken(_latestScope.join(" "));    
              qDebug() << "Could not retreive a valid token";
          }
          break;
      case 3: //client credentials flow
          token = _credentialFlow.getToken(_latestScope.join(" "));
          if(token.isValid()){
              _latestInput.headers.insert("Authorization", "Bearer " + token.getToken());
              _latestWorker->execute(&_latestInput);
          }else{
              _credentialFlow.removeToken(_latestScope.join(" "));    
              qDebug() << "Could not retreive a valid token";
          }
          break;
      case 4: //resource owner password flow
          token = _passwordFlow.getToken(_latestScope.join(" "));
          if(token.isValid()){
              _latestInput.headers.insert("Authorization", "Bearer " + token.getToken());
              _latestWorker->execute(&_latestInput);
          }else{
              _credentialFlow.removeToken(_latestScope.join(" "));    
              qDebug() << "Could not retreive a valid token";
          }
          break;
      default:
          qDebug() << "No Oauth method set!";
          break;
      }
  }
  } // namespace OpenAPI
  