"use strict";

var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
  value: true
});
exports["default"] = void 0;
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
var _Fetcher = _interopRequireDefault(require("../Provider/Fetcher"));
var _C3DTilesSource2 = _interopRequireDefault(require("./C3DTilesSource"));
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function () { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
/**
 * @classdesc
 * An object defining the source connection to a 3DTiles asset of a [Cesium ion server](https://cesium.com/learn/ion/).
 *
 * @extends Source
 *
 * @property {boolean} isC3DTilesIonSource - Used to checkout whether this source is a C3DTilesIonSource. Default is
 * true. You should not change this, as it is used internally for optimisation.
 * @property {string} url - The URL of the tileset json.
 * @property {string} baseUrl - The base URL to access tiles.
 * @property {string} accessToken - The Cesium ion access token used to retrieve the resource.
 * @property {string} assetId - The id of the asset on Cesium ion.
 */
var C3DTilesIonSource = /*#__PURE__*/function (_C3DTilesSource) {
  (0, _inherits2["default"])(C3DTilesIonSource, _C3DTilesSource);
  var _super = _createSuper(C3DTilesIonSource);
  /**
   * Create a new Source for 3D Tiles data from Cesium ion.
   *
   * @constructor
   * @extends Source
   *
   * @param {Object} source An object that can contain all properties of a C3DTilesIonSource and {@link Source}.
   * Only `accessToken` and `assetId` are mandatory.
   */
  function C3DTilesIonSource(source) {
    var _this;
    (0, _classCallCheck2["default"])(this, C3DTilesIonSource);
    if (!source.accessToken) {
      throw new Error('New 3D Tiles Ion Source: access token is required');
    }
    if (!source.assetId) {
      throw new Error('New 3D Tiles Ion Source: asset id is required');
    }

    // Url to query cesium ion the first time to retrieve metadata of the asset with assetId
    source.url = "https://api.cesium.com/v1/assets/".concat(source.assetId, "/endpoint?access_token=").concat(source.accessToken);
    _this = _super.call(this, source);
    _this.isC3DTilesIonSource = true;
    _this.accessToken = source.accessToken;
    _this.assetId = source.assetId;

    // get asset metadata
    _this.whenReady = _Fetcher["default"].json(source.url, _this.networkOptions).then(function (json) {
      if (json.type !== '3DTILES') {
        throw new Error("".concat(json.type, " datasets from Cesium ion are not supported with C3DTilesIonSource. ") + 'Only 3D Tiles datasets are supported.');
      }
      _this.url = json.url; // Store url to the tileset.json
      _this.baseUrl = json.url.slice(0, json.url.lastIndexOf('/') + 1); // baseUrl for tiles queries
      _this.networkOptions.headers = {};
      _this.networkOptions.headers.Authorization = "Bearer ".concat(json.accessToken);
      _this.attribution = json.attributions;
      return _Fetcher["default"].json(_this.url, _this.networkOptions);
    });
    return _this;
  }
  return (0, _createClass2["default"])(C3DTilesIonSource);
}(_C3DTilesSource2["default"]);
var _default = C3DTilesIonSource;
exports["default"] = _default;