"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports["default"] = void 0;
var _BgpConfig = _interopRequireDefault(require("./BgpConfig"));
var _InternalRoutingConfig = _interopRequireDefault(require("./InternalRoutingConfig"));
var _ValidationScopes = _interopRequireDefault(require("../../../validation/ValidationScopes"));
var _ValidationUtils = _interopRequireDefault(require("../../../../utils/ValidationUtils"));
var _ValidationError = _interopRequireDefault(require("../../../validation/ValidationError"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }
function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
function _classPrivateMethodInitSpec(e, a) { _checkPrivateRedeclaration(e, a), a.add(e); }
function _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError("Cannot initialize the same private elements twice on an object"); } /*
 * Nutanix Networking APIs
 *
 * OpenAPI spec version: 4.0.1
 *
 * NOTE: This class is auto generated by the Open API Dev Platform.
 *
 * Open API Dev Platform Codegen version: 16.9.0.8546-RELEASE
 *
 * Do not edit the class manually.
 *
 */
/**
 * The LocalVpnService model module.
 * @module Ntnx/LocalVpnService
 * @version 4.0.1
 * @class LocalVpnService
 */
var _LocalVpnService_brand = /*#__PURE__*/new WeakSet();
var LocalVpnService = exports["default"] = /*#__PURE__*/function () {
  /**
   * Constructs a new <code>LocalVpnService</code>.
   * VPN service hosted on this local gateway.
   * @alias module:Ntnx/LocalVpnService
  */
  function LocalVpnService() {
    _classCallCheck(this, LocalVpnService);
    /*
    * toJson method for a map type which supports map with primitive keys and values of object types
    * @param {Object} obj
    * @returns {Object|Map} Returns a new transofrmed Map by calling toJson on the values if applicable.
    * Otherwise, just returns the input object.
    */
    _classPrivateMethodInitSpec(this, _LocalVpnService_brand);
    this.$objectType = "networking.v4.config.LocalVpnService";
    /** @type {object<string, any>} */
    this.$reserved = {
      '$fv': "v4.r0"
    };
    /** @type {object<string, any>} */
    this.$unknownFields = {};
  }

  /**
   * Constructs a <code>LocalVpnService</code> from a plain JavaScript object, optionally creating a new instance.
   * Copies all relevant properties from <code>data</code> to <code>obj</code> if supplied or a new instance if not.
   * @param {Object} data The plain JavaScript object bearing properties of interest.
   * @param {module:Ntnx/LocalVpnService} obj Optional instance to populate.
   * @param callFromChild {Boolean} Flag to recognise calling instance
   * @return {module:Ntnx/LocalVpnService} The populated <code>LocalVpnService</code> instance.
   */
  return _createClass(LocalVpnService, [{
    key: "getEbgpConfig",
    value:
    /**
     * @return {BgpConfig}
     */
    function getEbgpConfig() {
      return this.ebgpConfig;
    }

    /**
     * @param {BgpConfig} ebgpConfig
     */
  }, {
    key: "setEbgpConfig",
    value: function setEbgpConfig(ebgpConfig) {
      this.ebgpConfig = ebgpConfig;
    }

    /**
     * @return {InternalRoutingConfig}
     */
  }, {
    key: "getPeerIgpConfig",
    value: function getPeerIgpConfig() {
      return this.peerIgpConfig;
    }

    /**
     * @param {InternalRoutingConfig} peerIgpConfig
     */
  }, {
    key: "setPeerIgpConfig",
    value: function setPeerIgpConfig(peerIgpConfig) {
      this.peerIgpConfig = peerIgpConfig;
    }
  }, {
    key: "get$Reserved",
    value: function get$Reserved() {
      return this.$reserved;
    }
  }, {
    key: "get$ObjectType",
    value: function get$ObjectType() {
      return this.$objectType;
    }
  }, {
    key: "get$UnknownFields",
    value: function get$UnknownFields() {
      return this.$unknownFields;
    }
  }, {
    key: "toJson",
    value: function toJson(forMutation) {
      if (forMutation === false) {
        return _objectSpread(_objectSpread(_objectSpread({}, typeof this.getEbgpConfig() !== 'undefined' && this.getEbgpConfig() !== null ? {
          'ebgpConfig': this.getEbgpConfig().toJson(false)
        } : {}), typeof this.getPeerIgpConfig() !== 'undefined' && this.getPeerIgpConfig() !== null ? {
          'peerIgpConfig': this.getPeerIgpConfig().toJson(false)
        } : {}), {}, {
          '$reserved': this.get$Reserved(),
          '$objectType': this.get$ObjectType(),
          '$unknownFields': this.get$UnknownFields()
        });
      }
      return _objectSpread(_objectSpread(_objectSpread({}, typeof this.getEbgpConfig() !== 'undefined' && this.getEbgpConfig() !== null ? {
        'ebgpConfig': this.getEbgpConfig().toJson(false)
      } : {}), typeof this.getPeerIgpConfig() !== 'undefined' && this.getPeerIgpConfig() !== null ? {
        'peerIgpConfig': this.getPeerIgpConfig().toJson(false)
      } : {}), {}, {
        '$reserved': this.get$Reserved(),
        '$objectType': this.get$ObjectType(),
        '$unknownFields': this.get$UnknownFields()
      });
    }
  }, {
    key: "validate",
    value: function validate(scope, properties) {
      var _this = this;
      var propList = [];
      if (arguments.length === 0 || arguments.length === 1 && arguments[0] instanceof _ValidationScopes["default"]) {
        //cases validate() and validate(scope)
        propList = [];
      } else if (arguments.length === 1) {
        //case validate(properties)
        propList = arguments[0];
        scope = null;
      } else {
        //case validate(scope, properties)
        propList = arguments[1];
      }
      var res = [];
      var err = null;
      propList.forEach(function (property) {
        err = _this.validateProperty(property, scope);
        if (err) {
          res.push(err);
        }
      });
      return new Promise(function (resolve, reject) {
        if (res.length !== 0) {
          reject(err);
        } else {
          resolve();
        }
      });
    }
  }, {
    key: "validateProperty",
    value: function validateProperty(scope, property) {
      if (property === "ebgpConfig") {
        if (typeof this.ebgpConfig === 'undefined' || this.ebgpConfig === null) {
          return new _ValidationError["default"]("ebgpConfig", "undefined or null");
        }
      }
      if (property === "peerIgpConfig") {
        if (typeof this.peerIgpConfig === 'undefined' || this.peerIgpConfig === null) {
          return new _ValidationError["default"]("peerIgpConfig", "undefined or null");
        }
      }
      if (property === "$reserved") {
        if (typeof this.$reserved === 'undefined' || this.$reserved === null) {
          return new _ValidationError["default"]("$reserved", "undefined or null");
        }
      }
      if (property === "$objectType") {
        if (typeof this.$objectType === 'undefined' || this.$objectType === null) {
          return new _ValidationError["default"]("$objectType", "undefined or null");
        }
      }
      if (property === "$unknownFields") {
        if (typeof this.$unknownFields === 'undefined' || this.$unknownFields === null) {
          return new _ValidationError["default"]("$unknownFields", "undefined or null");
        }
      }
      return new _ValidationError["default"](property, "no such property exists");
    }
  }], [{
    key: "constructFromObject",
    value: function constructFromObject(data) {
      var obj = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
      var callFromChild = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
      var items, item, i, itemArr, discriminator;
      if (data) {
        obj = obj || new LocalVpnService();
        if (data.hasOwnProperty('ebgpConfig') && data.ebgpConfig !== null && data.ebgpConfig !== undefined) {
          obj.setEbgpConfig(_BgpConfig["default"].constructFromObject(data['ebgpConfig']));
        }
        if (data.hasOwnProperty('peerIgpConfig') && data.peerIgpConfig !== null && data.peerIgpConfig !== undefined) {
          obj.setPeerIgpConfig(_InternalRoutingConfig["default"].constructFromObject(data['peerIgpConfig']));
        }
        if (data.hasOwnProperty('$reserved')) {
          obj.$reserved = data['$reserved'];
        }
        if (data.hasOwnProperty('$objectType')) {
          obj.$objectType = data['$objectType'];
        }
        if (data.hasOwnProperty('$unknownFields')) {
          obj.$unknownFields = data['$unknownFields'];
        }
        if (!callFromChild) {
          obj.$unknownFields = _objectSpread({}, data.$unknownFields);
          for (var property in data) {
            // Check if the `property` is not already present in `obj` keys, either in snake_case or camelCase,
            // as the model's fields are generated in camelCase, but the server might return snake_case (e.g., due to standards like OIDC).
            // Also, ensure the `property` does not start with '$' and end with 'ItemDiscriminator'.
            // If all conditions are true, add the `property` from `data` to `obj.$unknownFields` as an unknown field.
            if (!Object.keys(obj).includes(property) && !Object.keys(obj).includes(this.snakeToCamel(property)) && !(property[0] === "$" && property.endsWith("ItemDiscriminator"))) {
              obj.$unknownFields[property] = data[property];
            }
          }
        }
      }
      return obj;
    }

    /**
    * Converts a given snake_case string to camelCase.
    * @param {string} snakeStr - The input string in snake_case format.
    * @returns {string} - The converted string in camelCase format.
    */
  }, {
    key: "snakeToCamel",
    value: function snakeToCamel(snakeStr) {
      return snakeStr.replace(/(_\w)/g, function (match) {
        return match[1].toUpperCase();
      });
    }
  }]);
}();
/**
 * @memberof LocalVpnService
 */
function _toJsonMapType(obj, forMutation) {
  if (obj instanceof Map) {
    return Object.fromEntries(Array.from(obj, function (_ref) {
      var _ref2 = _slicedToArray(_ref, 2),
        k = _ref2[0],
        v = _ref2[1];
      return [k, typeof v.toJson !== "undefined" ? v.toJson(forMutation) : v];
    }));
  } else if (_typeof(obj) === 'object' && obj != null && obj.constructor === Object) {
    return Object.fromEntries(Array.from(Object.entries(obj), function (entry) {
      return [entry[0], typeof entry[1].toJson !== "undefined" ? entry[1].toJson(forMutation) : entry[1]];
    }));
  }
  return obj;
}
/*
* toJson method for a date type which serializes a Date object to proper Date or DateTime formatting
* @param {Object} obj Object to serialize
* @param {boolean} isDateOnly Boolean variable to identify Date or DateTime format for serialization
* @returns {Object|string} Returns serialized date object or original input object
*/
function _handleDateType(obj, isDateOnly) {
  if (obj instanceof Date && isDateOnly !== undefined) {
    return isDateOnly ? obj.toISOString().slice(0, 10) : obj.toISOString();
  }
  return obj;
}
LocalVpnService.prototype.ebgpConfig = undefined;

/**
 * @memberof LocalVpnService
 */
LocalVpnService.prototype.peerIgpConfig = undefined;
LocalVpnService.prototype.$reserved = undefined;
LocalVpnService.prototype.$objectType = undefined;
LocalVpnService.prototype.$unknownFields = undefined;