/**
 * 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 "SDMSubscriptionDocumentApiImpl.h"

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

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

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

void SDMSubscriptionDocumentApiImpl::modifysdm_subscription(
    const std::string &ueId, const std::string &subsId,
    const std::vector<PatchItem> &patchItem,
    const Pistache::Optional<std::string> &supportedFeatures,
    Pistache::Http::ResponseWriter &response) {
  response.send(Pistache::Http::Code::Ok, "Do some magic\n");
}
void SDMSubscriptionDocumentApiImpl::querysdm_subscription(
    const std::string &ueId, const std::string &subsId,
    Pistache::Http::ResponseWriter &response) {
  MYSQL_RES *res = NULL;
  MYSQL_ROW row;
  MYSQL_FIELD *field = nullptr;

  nlohmann::json j;

  SdmSubscription SdmSubscriptions;
  const std::string query =
      "SELECT * from SdmSubscriptions WHERE ueid=" + ueId +
      " AND subsId=" + subsId;

  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("nfInstanceId", field->name)) {
        SdmSubscriptions.setNfInstanceId(row[i]);
      } else if (!strcmp("implicitUnsubscribe", field->name) &&
                 row[i] != NULL) {
        if (strcmp(row[i], "0"))
          SdmSubscriptions.setImplicitUnsubscribe(true);
        else
          SdmSubscriptions.setImplicitUnsubscribe(false);
      } else if (!strcmp("expires", field->name) && row[i] != NULL) {
        SdmSubscriptions.setExpires(row[i]);
      } else if (!strcmp("callbackReference", field->name)) {
        SdmSubscriptions.setCallbackReference(row[i]);
      } else if (!strcmp("amfServiceName", field->name) && row[i] != NULL) {
        ServiceName amfservicename;
        nlohmann::json::parse(row[i]).get_to(amfservicename);
        SdmSubscriptions.setAmfServiceName(amfservicename);
      } else if (!strcmp("monitoredResourceUris", field->name)) {
        std::vector<std::string> monitoredresourceuris;
        nlohmann::json::parse(row[i]).get_to(monitoredresourceuris);
        SdmSubscriptions.setMonitoredResourceUris(monitoredresourceuris);
      } else if (!strcmp("singleNssai", field->name) && row[i] != NULL) {
        Snssai singlenssai;
        nlohmann::json::parse(row[i]).get_to(singlenssai);
        SdmSubscriptions.setSingleNssai(singlenssai);
      } else if (!strcmp("dnn", field->name) && row[i] != NULL) {
        SdmSubscriptions.setDnn(row[i]);
      } else if (!strcmp("subscriptionId", field->name) && row[i] != NULL) {
        SdmSubscriptions.setSubscriptionId(row[i]);
      } else if (!strcmp("plmnId", field->name) && row[i] != NULL) {
        PlmnId plmnid;
        nlohmann::json::parse(row[i]).get_to(plmnid);
        SdmSubscriptions.setPlmnId(plmnid);
      } else if (!strcmp("immediateReport", field->name) && row[i] != NULL) {
        if (strcmp(row[i], "0"))
          SdmSubscriptions.setImmediateReport(true);
        else
          SdmSubscriptions.setImmediateReport(false);
      } else if (!strcmp("report", field->name) && row[i] != NULL) {
        SubscriptionDataSets report;
        nlohmann::json::parse(row[i]).get_to(report);
        SdmSubscriptions.setReport(report);
      } else if (!strcmp("supportedFeatures", field->name) && row[i] != NULL) {
        SdmSubscriptions.setSupportedFeatures(row[i]);
      } else if (!strcmp("contextInfo", field->name) && row[i] != NULL) {
        ContextInfo contextinfo;
        nlohmann::json::parse(row[i]).get_to(contextinfo);
        SdmSubscriptions.setContextInfo(contextinfo);
      }
    }
    to_json(j, SdmSubscriptions);
    response.send(Pistache::Http::Code::Ok, j.dump());
  } else {
    std::cout << "SdmSubscription no data！" << std::endl;
  }

  mysql_free_result(res);
}
void SDMSubscriptionDocumentApiImpl::removesdm_subscriptions(
    const std::string &ueId, const std::string &subsId,
    Pistache::Http::ResponseWriter &response) {
  MYSQL_RES *res = NULL;
  nlohmann::json j;
  ProblemDetails problemdetails;

  const std::string select_query =
      "SELECT * from SdmSubscriptions WHERE ueid=" + ueId +
      " AND subsId=" + subsId;

  const std::string query = "DELETE from SdmSubscriptions WHERE ueid=" + ueId +
                            " AND subsId=" + subsId;

  if (mysql_real_query(mysql_WitcommUDRDB, select_query.c_str(),
                       (unsigned long)select_query.size())) {
    problemdetails.setCause("USER_NOT_FOUND");
    to_json(j, problemdetails);
    std::cout << "mysql_real_query failure！" << std::endl;
    response.send(Pistache::Http::Code::Not_Found, j.dump());
    return;
  }
  res = mysql_store_result(mysql_WitcommUDRDB);
  if (res == NULL) {
    problemdetails.setCause("USER_NOT_FOUND");
    to_json(j, problemdetails);
    std::cout << "mysql_store_result failure！" << std::endl;
    response.send(Pistache::Http::Code::Not_Found, j.dump());
    return;
  }
  if (!mysql_num_rows(res)) {
    problemdetails.setCause("DATA_NOT_FOUND");
    to_json(j, problemdetails);
    response.send(Pistache::Http::Code::Not_Found, j.dump());
    return;
  }
  mysql_free_result(res);
  if (mysql_real_query(mysql_WitcommUDRDB, query.c_str(),
                       (unsigned long)query.size())) {
    problemdetails.setCause("USER_NOT_FOUND");
    to_json(j, problemdetails);
    std::cout << "mysql_real_query failure！" << std::endl;
    response.send(Pistache::Http::Code::Not_Found, j.dump());
    return;
  }

  response.send(Pistache::Http::Code::No_Content, "");
}
void SDMSubscriptionDocumentApiImpl::updatesdmsubscriptions(
    const std::string &ueId, const std::string &subsId,
    SdmSubscription &sdmSubscription,
    Pistache::Http::ResponseWriter &response) {
  MYSQL_RES *res = NULL;
  MYSQL_ROW row;
  const std::string select_query =
      "SELECT * from SdmSubscriptions WHERE ueid=" + ueId +
      " AND subsId=" + subsId;
  std::string query;
  nlohmann::json j;
  ProblemDetails problemdetails;

  if (mysql_real_query(mysql_WitcommUDRDB, select_query.c_str(),
                       (unsigned long)select_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;
  }
  if (mysql_num_rows(res)) {
    nlohmann::json MonitoredResourceUris_json(
        sdmSubscription.getMonitoredResourceUris());

    query =
        "update SdmSubscriptions set nfInstanceId='" +
        sdmSubscription.getNfInstanceId() + "'" +
        (sdmSubscription.implicitUnsubscribeIsSet()
             ? (sdmSubscription.isImplicitUnsubscribe()
                    ? ",implicitUnsubscribe=1"
                    : ",implicitUnsubscribe=0")
             : "") +
        (sdmSubscription.expiresIsSet()
             ? ",expires='" + sdmSubscription.getExpires() + "'"
             : "") +
        ",callbackReference='" + sdmSubscription.getCallbackReference() + "'" +
        (sdmSubscription.dnnIsSet() ? ",dnn='" + sdmSubscription.getDnn() + "'"
                                    : "") +
        (sdmSubscription.subscriptionIdIsSet()
             ? ",subscriptionId='" + sdmSubscription.getSubscriptionId() + "'"
             : "") +
        (sdmSubscription.immediateReportIsSet()
             ? (sdmSubscription.isImmediateReport() ? ",immediateReport=1"
                                                    : ",immediateReport=0")
             : "") +
        (sdmSubscription.supportedFeaturesIsSet()
             ? ",supportedFeatures='" + sdmSubscription.getSupportedFeatures() +
                   "'"
             : "");

    if (sdmSubscription.amfServiceNameIsSet()) {
      to_json(j, sdmSubscription.getAmfServiceName());
      query += ",amfServiceName='" + j.dump() + "'";
    }
    if (sdmSubscription.singleNssaiIsSet()) {
      to_json(j, sdmSubscription.getSingleNssai());
      query += ",singleNssai='" + j.dump() + "'";
    }
    if (sdmSubscription.plmnIdIsSet()) {
      to_json(j, sdmSubscription.getPlmnId());
      query += ",plmnId='" + j.dump() + "'";
    }
    if (sdmSubscription.reportIsSet()) {
      to_json(j, sdmSubscription.getReport());
      query += ",report='" + j.dump() + "'";
    }
    if (sdmSubscription.contextInfoIsSet()) {
      to_json(j, sdmSubscription.getContextInfo());
      query += ",contextInfo='" + j.dump() + "'";
    }

    query +=
        ",monitoredResourceUris='" + MonitoredResourceUris_json.dump() + "'";

    query += " where ueid=" + ueId + " AND subsId=" + subsId;
  } else {
    to_json(j, problemdetails);
    response.send(Pistache::Http::Code::Not_Found, j.dump());
    mysql_free_result(res);
    return;
  }

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

  response.send(Pistache::Http::Code::No_Content, "");
}

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