/**
 * Nudr_DataRepository API OpenAPI file
 * Unified Data Repository Service. © 2020, 3GPP Organizational Partners (ARIB,
 * ATIS, CCSA, ETSI, TSDSI, TTA, TTC). All rights reserved.
 *
 * The version of the OpenAPI document: 2.1.2
 *
 *
 * NOTE: This class is auto generated by OpenAPI Generator
 * (https://openapi-generator.tech). https://openapi-generator.tech Do not edit
 * the class manually.
 */

#include "AuthenticationSubscriptionDocumentApiImpl.h"
#include "PatchResult.h"

#include <AuthenticationSubscription.h>

namespace org {
namespace openapitools {
namespace server {
namespace api {

using namespace org::openapitools::server::model;

AuthenticationSubscriptionDocumentApiImpl::
    AuthenticationSubscriptionDocumentApiImpl(
        std::shared_ptr<Pistache::Rest::Router> rtr, MYSQL *mysql)
    : AuthenticationSubscriptionDocumentApi(rtr) {
  mysql_WitcommUDRDB = mysql;
}

void AuthenticationSubscriptionDocumentApiImpl::
    modify_authentication_subscription(
        const std::string &ueId, const std::vector<PatchItem> &patchItem,
        const Pistache::Optional<std::string> &supportedFeatures,
        Pistache::Http::ResponseWriter &response) {

  /************************ test ************************/
  nlohmann::json j, j1;
  for (int i = 0; i < patchItem.size(); i++) {
    to_json(j1, patchItem[i]);
    j += j1;
  }
  response.send(Pistache::Http::Code::Ok, j.dump());
  // response.send(Pistache::Http::Code::Ok, "Do some magic hello\n");
  /******************************************************/

  // 1.modify handler
  // 2.modify success
  // 3.send PatchResult
  // response.send(Pistache::Http::Code::Ok, j.dump());
}

void AuthenticationSubscriptionDocumentApiImpl::
    read_authentication_subscription(
        const std::string &ueId,
        const Pistache::Optional<std::string> &supportedFeatures,
        Pistache::Http::ResponseWriter &response) {
  MYSQL_RES *res = NULL;
  MYSQL_ROW row;
  MYSQL_FIELD *field = nullptr;

  nlohmann::json j;

  AuthenticationSubscription authenticationsubscription;
  const std::string query =
      "select * from AuthenticationSubscription WHERE ueid=" + ueId;

  if (mysql_real_query(mysql_WitcommUDRDB, query.c_str(),
                       (unsigned long)query.size())) {
    std::cout << "mysql_real_query failure！" << std::endl;
    return;
  }

  res = mysql_store_result(mysql_WitcommUDRDB);
  if (res == NULL) {
    std::cout << "mysql_store_result failure！" << std::endl;
    return;
  }

  row = mysql_fetch_row(res);

  if (row != NULL) {
    for (int i = 0; field = mysql_fetch_field(res); i++) {
      if (!strcmp("authenticationMethod", field->name)) {
        AuthMethod authenticationmethod;
        nlohmann::json::parse(row[i]).get_to(authenticationmethod);
        authenticationsubscription.setAuthenticationMethod(
            authenticationmethod);
      } else if (!strcmp("encPermanentKey", field->name) && row[i] != NULL) {
        authenticationsubscription.setEncPermanentKey(row[i]);
      } else if (!strcmp("protectionParameterId", field->name) &&
                 row[i] != NULL) {
        authenticationsubscription.setProtectionParameterId(row[i]);
      } else if (!strcmp("sequenceNumber", field->name) && row[i] != NULL) {
        SequenceNumber sequencenumber;
        nlohmann::json::parse(row[i]).get_to(sequencenumber);
        authenticationsubscription.setSequenceNumber(sequencenumber);
      } else if (!strcmp("authenticationManagementField", field->name) &&
                 row[i] != NULL) {
        authenticationsubscription.setAuthenticationManagementField(row[i]);
      } else if (!strcmp("algorithmId", field->name) && row[i] != NULL) {
        authenticationsubscription.setAlgorithmId(row[i]);
      } else if (!strcmp("encOpcKey", field->name) && row[i] != NULL) {
        authenticationsubscription.setEncOpcKey(row[i]);
      } else if (!strcmp("encTopcKey", field->name) && row[i] != NULL) {
        authenticationsubscription.setEncTopcKey(row[i]);
      } else if (!strcmp("vectorGenerationInHss", field->name) &&
                 row[i] != NULL) {
        std::cout << row[i] << std::endl;
        if (strcmp(row[i], "0"))
          authenticationsubscription.setVectorGenerationInHss(true);
        else
          authenticationsubscription.setVectorGenerationInHss(false);
      } else if (!strcmp("n5gcAuthMethod", field->name) && row[i] != NULL) {
        AuthMethod n5gcauthmethod;
        nlohmann::json::parse(row[i]).get_to(n5gcauthmethod);
        authenticationsubscription.setN5gcAuthMethod(n5gcauthmethod);
      } else if (!strcmp("rgAuthenticationInd", field->name) &&
                 row[i] != NULL) {
        std::cout << row[i] << std::endl;
        if (strcmp(row[i], "0"))
          authenticationsubscription.setRgAuthenticationInd(true);
        else
          authenticationsubscription.setRgAuthenticationInd(false);
      } else if (!strcmp("supi", field->name) && row[i] != NULL) {
        authenticationsubscription.setSupi(row[i]);
      }
    }

    to_json(j, authenticationsubscription);
    response.send(Pistache::Http::Code::Ok, j.dump());
  } else {
    std::cout << "AuthenticationSubscription no data！" << std::endl;
  }

  mysql_free_result(res);
}

} // namespace api
} // namespace server
} // namespace openapitools
} // namespace org
