/**
 * 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 "AccessAndMobilitySubscriptionDataDocumentApiImpl.h"
#include <nlohmann/json.hpp>

#include "logger.hpp"
#include "udr_app.hpp"
#include "udr_config.hpp"
using namespace config;
extern config::udr_config udr_cfg;
namespace oai::udr::api {

using namespace oai::udr::model;

AccessAndMobilitySubscriptionDataDocumentApiImpl::
    AccessAndMobilitySubscriptionDataDocumentApiImpl(
        std::shared_ptr<Pistache::Rest::Router> rtr, udr_app *udr_app_inst,
        std::string address, MYSQL *mysql)
    : AccessAndMobilitySubscriptionDataDocumentApi(rtr),
      m_udr_app(udr_app_inst),
      m_address(address) {
  mysql_WitcommUDRDB = mysql;
}

void AccessAndMobilitySubscriptionDataDocumentApiImpl::query_am_data(
    const std::string &ueId, const std::string &servingPlmnId,
    const Pistache::Optional<std::vector<std::string>> &fields,
    const Pistache::Optional<std::string> &supportedFeatures,
    const Pistache::Optional<Pistache::Http::Header::Raw> &ifNoneMatch,
    const Pistache::Optional<Pistache::Http::Header::Raw> &ifModifiedSince,
    Pistache::Http::ResponseWriter &response) {
  nlohmann::json response_data = {};
  Pistache::Http::Code code = {};
  m_udr_app->handle_access_mobility_subscription_data_document(
      ueId, servingPlmnId, response_data, code);

  Logger::udr_server().debug("HTTP reponse code %d.\n", code);
  response.send(code, response_data.dump());

  MYSQL_RES *res = NULL;
  MYSQL_ROW row;
  MYSQL_FIELD *field = nullptr;

  nlohmann::json j;

  AccessAndMobilitySubscriptionData accessandmobilitysubscriptiondata;
  const std::string query =
      "select * from AccessAndMobilitySubscriptionData WHERE ueid='" + ueId +
      "' and servingPlmnid='" + servingPlmnId + "'";

  if (mysql_real_query(mysql_WitcommUDRDB, query.c_str(),
                       (unsigned long)query.size())) {
    Logger::udr_server().error("mysql_real_query failure!");
    return;
  }

  res = mysql_store_result(mysql_WitcommUDRDB);
  if (res == NULL) {
    Logger::udr_server().error("mysql_store_result failure!");
    return;
  }

  row = mysql_fetch_row(res);

  if (row != NULL) {
    for (int i = 0; field = mysql_fetch_field(res); i++) {
      if (!strcmp("supportedFeatures", field->name) && row[i] != NULL) {
        accessandmobilitysubscriptiondata.setSupportedFeatures(row[i]);
      } else if (!strcmp("gpsis", field->name) && row[i] != NULL) {
        std::vector<std ::string> gpsis;
        nlohmann::json::parse(row[i]).get_to(gpsis);
        accessandmobilitysubscriptiondata.setGpsis(gpsis);
      } else if (!strcmp("internalGroupIds", field->name) && row[i] != NULL) {
        std::vector<std ::string> internalgroupids;
        nlohmann::json::parse(row[i]).get_to(internalgroupids);
        accessandmobilitysubscriptiondata.setInternalGroupIds(internalgroupids);
      } else if (!strcmp("sharedVnGroupDataIds", field->name) &&
                 row[i] != NULL) {
        std::map<std ::string, std::string> sharedvngroupdataids;
        nlohmann::json::parse(row[i]).get_to(sharedvngroupdataids);
        accessandmobilitysubscriptiondata.setSharedVnGroupDataIds(
            sharedvngroupdataids);
      } else if (!strcmp("subscribedUeAmbr", field->name) && row[i] != NULL) {
        AmbrRm subscribedueambr;
        nlohmann::json::parse(row[i]).get_to(subscribedueambr);
        accessandmobilitysubscriptiondata.setSubscribedUeAmbr(subscribedueambr);
      } else if (!strcmp("nssai", field->name) && row[i] != NULL) {
        Nssai nssai;
        nlohmann::json::parse(row[i]).get_to(nssai);
        accessandmobilitysubscriptiondata.setNssai(nssai);
      } else if (!strcmp("ratRestrictions", field->name) && row[i] != NULL) {
        std ::vector<RatType> ratrestrictions;
        nlohmann::json::parse(row[i]).get_to(ratrestrictions);
        accessandmobilitysubscriptiondata.setRatRestrictions(ratrestrictions);
      } else if (!strcmp("forbiddenAreas", field->name) && row[i] != NULL) {
        std ::vector<Area> forbiddenareas;
        nlohmann::json::parse(row[i]).get_to(forbiddenareas);
        accessandmobilitysubscriptiondata.setForbiddenAreas(forbiddenareas);
      } else if (!strcmp("serviceAreaRestriction", field->name) &&
                 row[i] != NULL) {
        ServiceAreaRestriction servicearearestriction;
        nlohmann::json::parse(row[i]).get_to(servicearearestriction);
        accessandmobilitysubscriptiondata.setServiceAreaRestriction(
            servicearearestriction);
      } else if (!strcmp("coreNetworkTypeRestrictions", field->name) &&
                 row[i] != NULL) {
        std ::vector<CoreNetworkType> corenetworktyperestrictions;
        nlohmann::json::parse(row[i]).get_to(corenetworktyperestrictions);
        accessandmobilitysubscriptiondata.setCoreNetworkTypeRestrictions(
            corenetworktyperestrictions);
      } else if (!strcmp("rfspIndex", field->name) && row[i] != NULL) {
        std::string s = row[i];
        std::stringstream ss;
        int32_t a;
        ss << s;
        ss >> a;
        accessandmobilitysubscriptiondata.setRfspIndex(a);
      } else if (!strcmp("subsRegTimer", field->name) && row[i] != NULL) {
        std::string s = row[i];
        std::stringstream ss;
        int32_t a;
        ss << s;
        ss >> a;
        accessandmobilitysubscriptiondata.setSubsRegTimer(a);
      } else if (!strcmp("ueUsageType", field->name) && row[i] != NULL) {
        std::string s = row[i];
        std::stringstream ss;
        int32_t a;
        ss << s;
        ss >> a;
        accessandmobilitysubscriptiondata.setUeUsageType(a);
      } else if (!strcmp("mpsPriority", field->name) && row[i] != NULL) {
        if (strcmp(row[i], "0"))
          accessandmobilitysubscriptiondata.setMpsPriority(true);
        else
          accessandmobilitysubscriptiondata.setMpsPriority(false);
      } else if (!strcmp("mcsPriority", field->name) && row[i] != NULL) {
        if (strcmp(row[i], "0"))
          accessandmobilitysubscriptiondata.setMcsPriority(true);
        else
          accessandmobilitysubscriptiondata.setMcsPriority(false);
      } else if (!strcmp("activeTime", field->name) && row[i] != NULL) {
        std::string s = row[i];
        std::stringstream ss;
        int32_t a;
        ss << s;
        ss >> a;
        accessandmobilitysubscriptiondata.setActiveTime(a);
      } else if (!strcmp("sorInfo", field->name) && row[i] != NULL) {
        SorInfo sorinfo;
        nlohmann::json::parse(row[i]).get_to(sorinfo);
        accessandmobilitysubscriptiondata.setSorInfo(sorinfo);
      } else if (!strcmp("sorInfoExpectInd", field->name) && row[i] != NULL) {
        if (strcmp(row[i], "0"))
          accessandmobilitysubscriptiondata.setSorInfoExpectInd(true);
        else
          accessandmobilitysubscriptiondata.setSorInfoExpectInd(false);
      } else if (!strcmp("sorafRetrieval", field->name) && row[i] != NULL) {
        if (strcmp(row[i], "0"))
          accessandmobilitysubscriptiondata.setSorafRetrieval(true);
        else
          accessandmobilitysubscriptiondata.setSorafRetrieval(false);
      } else if (!strcmp("sorUpdateIndicatorList", field->name) &&
                 row[i] != NULL) {
        std ::vector<SorUpdateIndicator> sorupdateindicatorlist;
        nlohmann::json::parse(row[i]).get_to(sorupdateindicatorlist);
        accessandmobilitysubscriptiondata.setSorUpdateIndicatorList(
            sorupdateindicatorlist);
      } else if (!strcmp("upuInfo", field->name) && row[i] != NULL) {
        UpuInfo upuinfo;
        nlohmann::json::parse(row[i]).get_to(upuinfo);
        accessandmobilitysubscriptiondata.setUpuInfo(upuinfo);
      } else if (!strcmp("micoAllowed", field->name) && row[i] != NULL) {
        if (strcmp(row[i], "0"))
          accessandmobilitysubscriptiondata.setMicoAllowed(true);
        else
          accessandmobilitysubscriptiondata.setMicoAllowed(false);
      } else if (!strcmp("sharedAmDataIds", field->name) && row[i] != NULL) {
        std ::vector<std ::string> sharedamdataids;
        nlohmann::json::parse(row[i]).get_to(sharedamdataids);
        accessandmobilitysubscriptiondata.setSharedAmDataIds(sharedamdataids);
      } else if (!strcmp("odbPacketServices", field->name) && row[i] != NULL) {
        OdbPacketServices odbpacketservices;
        nlohmann::json::parse(row[i]).get_to(odbpacketservices);
        accessandmobilitysubscriptiondata.setOdbPacketServices(
            odbpacketservices);
      } else if (!strcmp("serviceGapTime", field->name) && row[i] != NULL) {
        std::string s = row[i];
        std::stringstream ss;
        int32_t a;
        ss << s;
        ss >> a;
        accessandmobilitysubscriptiondata.setServiceGapTime(a);
      } else if (!strcmp("mdtUserConsent", field->name) && row[i] != NULL) {
        MdtUserConsent mdtuserconsent;
        nlohmann::json::parse(row[i]).get_to(mdtuserconsent);
        accessandmobilitysubscriptiondata.setMdtUserConsent(mdtuserconsent);
      } else if (!strcmp("mdtConfiguration", field->name) && row[i] != NULL) {
        MdtConfiguration mdtconfiguration;
        nlohmann::json::parse(row[i]).get_to(mdtconfiguration);
        accessandmobilitysubscriptiondata.setMdtConfiguration(mdtconfiguration);
      } else if (!strcmp("traceData", field->name) && row[i] != NULL) {
        TraceData tracedata;
        nlohmann::json::parse(row[i]).get_to(tracedata);
        accessandmobilitysubscriptiondata.setTraceData(tracedata);
      } else if (!strcmp("cagData", field->name) && row[i] != NULL) {
        CagData cagdata;
        nlohmann::json::parse(row[i]).get_to(cagdata);
        accessandmobilitysubscriptiondata.setCagData(cagdata);
      } else if (!strcmp("stnSr", field->name) && row[i] != NULL) {
        accessandmobilitysubscriptiondata.setStnSr(row[i]);
      } else if (!strcmp("cMsisdn", field->name) && row[i] != NULL) {
        accessandmobilitysubscriptiondata.setCMsisdn(row[i]);
      } else if (!strcmp("nbIoTUePriority", field->name) && row[i] != NULL) {
        std::string s = row[i];
        std::stringstream ss;
        int32_t a;
        ss << s;
        ss >> a;
        accessandmobilitysubscriptiondata.setNbIoTUePriority(a);
      } else if (!strcmp("nssaiInclusionAllowed", field->name) &&
                 row[i] != NULL) {
        if (strcmp(row[i], "0"))
          accessandmobilitysubscriptiondata.setNssaiInclusionAllowed(true);
        else
          accessandmobilitysubscriptiondata.setNssaiInclusionAllowed(false);
      } else if (!strcmp("rgWirelineCharacteristics", field->name) &&
                 row[i] != NULL) {
        accessandmobilitysubscriptiondata.setRgWirelineCharacteristics(row[i]);
      } else if (!strcmp("ecRestrictionDataWb", field->name) &&
                 row[i] != NULL) {
        EcRestrictionDataWb ecrestrictiondatawb;
        nlohmann::json::parse(row[i]).get_to(ecrestrictiondatawb);
        accessandmobilitysubscriptiondata.setEcRestrictionDataWb(
            ecrestrictiondatawb);
      } else if (!strcmp("ecRestrictionDataNb", field->name) &&
                 row[i] != NULL) {
        if (strcmp(row[i], "0"))
          accessandmobilitysubscriptiondata.setEcRestrictionDataNb(true);
        else
          accessandmobilitysubscriptiondata.setEcRestrictionDataNb(false);
      } else if (!strcmp("expectedUeBehaviourList", field->name) &&
                 row[i] != NULL) {
        ExpectedUeBehaviourData expecteduebehaviourlist;
        nlohmann::json::parse(row[i]).get_to(expecteduebehaviourlist);
        accessandmobilitysubscriptiondata.setExpectedUeBehaviourList(
            expecteduebehaviourlist);
      } else if (!strcmp("primaryRatRestrictions", field->name) &&
                 row[i] != NULL) {
        std ::vector<RatType> primaryratrestrictions;
        nlohmann::json::parse(row[i]).get_to(primaryratrestrictions);
        accessandmobilitysubscriptiondata.setPrimaryRatRestrictions(
            primaryratrestrictions);
      } else if (!strcmp("secondaryRatRestrictions", field->name) &&
                 row[i] != NULL) {
        std ::vector<RatType> secondaryratrestrictions;
        nlohmann::json::parse(row[i]).get_to(secondaryratrestrictions);
        accessandmobilitysubscriptiondata.setSecondaryRatRestrictions(
            secondaryratrestrictions);
      } else if (!strcmp("edrxParametersList", field->name) && row[i] != NULL) {
        std ::vector<EdrxParameters> edrxparameterslist;
        nlohmann::json::parse(row[i]).get_to(edrxparameterslist);
        accessandmobilitysubscriptiondata.setEdrxParametersList(
            edrxparameterslist);
      } else if (!strcmp("ptwParametersList", field->name) && row[i] != NULL) {
        std ::vector<PtwParameters> ptwparameterslist;
        nlohmann::json::parse(row[i]).get_to(ptwparameterslist);
        accessandmobilitysubscriptiondata.setPtwParametersList(
            ptwparameterslist);
      } else if (!strcmp("iabOperationAllowed", field->name) &&
                 row[i] != NULL) {
        if (strcmp(row[i], "0"))
          accessandmobilitysubscriptiondata.setIabOperationAllowed(true);
        else
          accessandmobilitysubscriptiondata.setIabOperationAllowed(false);
      } else if (!strcmp("wirelineForbiddenAreas", field->name) &&
                 row[i] != NULL) {
        std ::vector<WirelineArea> wirelineforbiddenareas;
        nlohmann::json::parse(row[i]).get_to(wirelineforbiddenareas);
        accessandmobilitysubscriptiondata.setWirelineForbiddenAreas(
            wirelineforbiddenareas);
      } else if (!strcmp("wirelineServiceAreaRestriction", field->name) &&
                 row[i] != NULL) {
        WirelineServiceAreaRestriction wirelineservicearearestriction;
        nlohmann::json::parse(row[i]).get_to(wirelineservicearearestriction);
        accessandmobilitysubscriptiondata.setWirelineServiceAreaRestriction(
            wirelineservicearearestriction);
      }
    }

    to_json(j, accessandmobilitysubscriptiondata);
    response.send(Pistache::Http::Code::Ok, j.dump());

    std::string out = j.dump();
    Logger::udr_server().debug(
        "AccessAndMobilitySubscriptionData GET - json:\n\"%s\"", out.c_str());
  } else {
    Logger::udr_server().error("AccessAndMobilitySubscriptionData no data!");
  }

  mysql_free_result(res);
}

}  // namespace oai::udr::api