    import { Layer } from './baseLayer'
    import { Zondy } from '../../base'
    import { defaultValue, Log } from '../../util'
    import TerrainServer from '../../service/igs/TerrainServer'
    import { Extent } from '../../base/geometry'
    import { LayerType, LoadStatus } from '../../base/enum'
    /**
     * 地形图层
     * @class TerrainCacheLayer
     * @moduleEX LayerManagerModule
     * @extends Layer
     * @fires TerrainCacheLayer#图层加载完毕事件
     * @param {Object} options 构造参数
     * @param {String} [options.url] 服务基地址
     * @param {String} [options.tokenKey = 'token'] token名
     * @param {String} [options.tokenValue] token值
     * @param {Boolean} [options.autoReset = false] 是否自动跳转
     * @param {Boolean} [options.requestVertexNormals = true] 是否请求地形法向量
     * @example <caption><h7>添加地形</h7></caption>
     * // ES5引入方式
     * const { Map, SceneView } = Zondy
     * const { TerrainCacheLayer } = Zondy.Layer
     * // ES6引入方式
     * import { Map, SceneView, TerrainCacheLayer } from "@mapgis/webclient-common"
     * // 初始化图层管理容器
     * const map = new Map();
     * // 初始化地图视图对象
     * const sceneView = new SceneView({
     *   // 视图id
     *   viewId: "mapgis-3d-viewer",
     *   // 图层管理容器
     *   map: map
     * });
     * // 初始化地形图层对象
     * terrainCacheLayer = new TerrainCacheLayer({
     *   url: 'http://webclient.smaryun.com:8089/igs/rest/services/Scene/TwTerrain/SceneServer'
     * });
     * map.add(terrainCacheLayer);
     * */
    class TerrainCacheLayer extends Layer {
      constructor(options) {
        super(options)
        options = defaultValue(options, {})

        /**
         * 服务基地址
         * @member {String} TerrainCacheLayer.prototype.url
         */
        this.url = defaultValue(options.url, undefined)
        /**
         * token名
         * @member {String} TerrainCacheLayer.prototype.tokenKey
         */
        this.tokenKey = defaultValue(options.tokenKey, 'token')
        /**
         * token值
         * @member {String} TerrainCacheLayer.prototype.tokenValue
         */
        this.tokenValue = defaultValue(options.tokenValue, undefined)
        /**
         * 图层类型
         * @member {String} TerrainCacheLayer.prototype.type
         */
        this.type = LayerType.terrain
        /**
         * 是否自动跳转
         * @member {Boolean} TerrainCacheLayer.prototype.autoReset
         */
        this.autoReset = defaultValue(options.autoReset, false)
        /**
         * 是否请求地形法向量
         * @member {Boolean} TerrainCacheLayer.prototype.requestVertexNormals
         */
        this.requestVertexNormals = defaultValue(options.requestVertexNormals, true)

        // 地形服务
        this._terrainServer = new TerrainServer({
          url: this.url
        })
      }

      /**
       * 从igs获取图层信息的方法
       */
      load() {
        const self = this
        return this._terrainServer.queryServerInfo().then((result) => {
          Log.info('MapServer信息查询成功:', result)
          const data = result.data

          // 图层范围
          self.fullExtent = new Extent({
            xmin: data.sceneRange.xMin,
            ymin: data.sceneRange.yMin,
            xmax: data.sceneRange.xMax,
            ymax: data.sceneRange.yMax
          })
          return new Promise((resolve) => {
            self.loadStatus = LoadStatus.loaded
            self.loaded = true
            resolve(self)
          })
        })
      }

      /**
       * 将图层转为json对象
       * @return {Object} josn对象
       * */
      toJSON() {
        const json = {
          url: this.url,
          tokenKey: this.tokenKey,
          tokenValue: this.tokenValue,
          autoReset: this.autoReset,
          requestVertexNormals: this.requestVertexNormals
        }
        return JSON.parse(JSON.stringify(json))
      }

      /**
       * 克隆并返回一个新图层
       * @return {TerrainCacheLayer} 新的图层对象
       * */
      clone() {
        return new TerrainCacheLayer(this.toJSON())
      }
    }

    /**
     * 通过url创建图层对象
     * @param {String} url 服务基地址
     * @return {TerrainCacheLayer} 新的图层对象
     * */
    TerrainCacheLayer.fromServerUrl = function (url) {
      return new TerrainCacheLayer({
        url
      })
    }

    Zondy.Layer.TerrainCacheLayer = TerrainCacheLayer
    export default TerrainCacheLayer