    import { Zondy } from '../../base'
    import { Layer } from './baseLayer'
    import { defaultValue } from '../../util'
    import { LayerType, LoadStatus } from '../../base/enum'
    import { M3DServer } from '../../service'

    /**
     * M3D缓存图层
     * @class M3DModelCacheLayer
     * @moduleEX LayerManagerModule
     * @extends Layer
     * @param {Object} options 构造参数
     * @param {String} [options.url] 服务基地址
     * @param {Boolean} [options.autoReset = true] 模型加载后，是否自动跳转
     * @param {Number} [options.duration = 1] 跳转持续时间
     * @param {Number} [options.maximumScreenSpaceError = 16] 最大屏幕空间误差，用来控制模型加载数量
     * @param {Function} [options.callback] 最大屏幕空间误差，用来控制模型加载数量
     * @param {Function} [options.gltfParsedCallback] gltf解析完成回调，提供修改gltf对象能力，MapGISM3DSet中包含多个gltf,对所有的gltf应用同一个回调可能不合适
     * @param {Boolean} [options.fillClip = false] 是否需要填充M3D数据剖面，在MapGISM3DSet构造函数中给的原因是，要想支持剖面选取高亮必须统计primitive的oid列表,为了节省内存,原始数据在加载完成后就会释放，后续没有时机统计oid列表
     * @param {Boolean} [options.hasSectionGeometry = false] 是否会存在剖面几何，如果后续会addSectionGeometry方法给m3d图层设置剖切面设置为true
     * @param {Cartesian2} [options.textureCoordScale] 模型纹理拉伸比例，默认不发生变化
     */
    class M3DModelCacheLayer extends Layer {
      constructor(options) {
        super(options)
        options = defaultValue(options, {})

        /**
         * 服务基地址
         * @member {String} IGSM3DCacheLayer.prototype.url
         */
        this.url = defaultValue(options.url, '')
        /**
         * 图层类型
         * @member {String} IGSM3DCacheLayer.prototype.type
         */
        this.type = LayerType.m3dCache
        /**
         * 服务版本号
         * @member {String} IGSM3DCacheLayer.prototype.version
         */
        this.version = undefined
        /**
         * 模型外包盒
         * @member {Object} IGSM3DCacheLayer.prototype.boundingVolume
         */
        this.boundingVolume = undefined
        /**
         * 服务名
         * @member {String} IGSM3DCacheLayer.prototype.sceneName
         */
        this.sceneName = undefined
        /**
         * 服务包含的表字段数组
         * @member {String} IGSM3DCacheLayer.prototype.fieldInfo
         */
        this.fieldInfo = undefined
        /**
         * 模型位置
         * @member {Object} IGSM3DCacheLayer.prototype.position
         */
        this.position = undefined
        /**
         * 模型坐标系
         * @member {Object} IGSM3DCacheLayer.prototype.spatialReference
         */
        this.spatialReference = undefined
        /**
         * 描述信息
         * @member {String} IGSM3DCacheLayer.prototype.description
         */
        this.description = 'M3D图层'
        /**
         * 模型加载后，是否自动跳转
         * @member {Boolean} IGSM3DCacheLayer.prototype.autoReset
         */
        this.autoReset = defaultValue(options.autoReset, true)
        /**
         * 跳转持续时间
         * @member {Number} IGSM3DCacheLayer.prototype.duration
         */
        this.duration = defaultValue(options.duration, 1)
        /**
         * 最大屏幕空间误差，用来控制模型加载数量
         * @member {Number} IGSM3DCacheLayer.prototype.maximumScreenSpaceError
         */
        this.maximumScreenSpaceError = defaultValue(
          options.maximumScreenSpaceError,
          16
        )
        /**
         * MapGISM3DSet的每帧回调函数
         * @member {Function} IGSM3DCacheLayer.prototype.callback
         */
        this.callback = defaultValue(options.callback, undefined)
        /**
         * gltf解析完成回调，提供修改gltf对象能力，MapGISM3DSet中包含多个gltf,对所有的gltf应用同一个回调可能不合适
         * @member {Function} IGSM3DCacheLayer.prototype.gltfParsedCallback
         */
        this.gltfParsedCallback = defaultValue(
          options.gltfParsedCallback,
          undefined
        )
        /**
         * 是否需要填充M3D数据剖面，在MapGISM3DSet构造函数中给的原因是，要想支持剖面选取高亮必须统计primitive的oid列表,为了节省内存,原始数据在加载完成后就会释放，后续没有时机统计oid列表
         * @member {Boolean} IGSM3DCacheLayer.prototype.fillClip
         */
        this.fillClip = defaultValue(options.fillClip, false)
        /**
         * 是否会存在剖面几何，如果后续会addSectionGeometry方法给m3d图层设置剖切面设置为true
         * @member {Boolean} IGSM3DCacheLayer.prototype.hasSectionGeometry
         */
        this.hasSectionGeometry = defaultValue(options.hasSectionGeometry, false)
        /**
         * 模型纹理拉伸比例，默认不发生变化
         * @member {Cartesian2} IGSM3DCacheLayer.prototype.textureCoordScale
         */
        this.textureCoordScale = defaultValue(options.textureCoordScale, undefined)

        this._m3dServer = new M3DServer({
          url: this.url
        })
      }

      /**
       * 查询图层信息
       * */
      load() {
        const self = this
        return new Promise((resolve) => {
          self.loadStatus = LoadStatus.loaded
          self.loaded = true
          resolve(self)
        })
      }

      /**
       * 将图层转为json对象
       * @return {Object} josn对象
       * */
      toJSON() {
        const json = {
          url: this.url,
          type: this.type,
          version: this.version,
          boundingVolume: this.boundingVolume,
          sceneName: this.sceneName,
          fieldInfo: this.fieldInfo,
          position: this.position,
          spatialReference: this.spatialReference,
          description: this.description,
          autoReset: this.autoReset,
          duration: this.duration,
          maximumScreenSpaceError: this.maximumScreenSpaceError,
          callback: this.callback,
          gltfParsedCallback: this.gltfParsedCallback,
          fillClip: this.fillClip,
          hasSectionGeometry: this.hasSectionGeometry,
          textureCoordScale: this.textureCoordScale
        }
        return JSON.parse(JSON.stringify(json))
      }

      /**
       * 克隆图层对象
       * @return {M3DModelCacheLayer} 克隆后的图层对象
       */
      clone() {
        return new M3DModelCacheLayer(this.toJSON())
      }
    }

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

    Zondy.Layer.M3DModelCacheLayer = M3DModelCacheLayer
    export default M3DModelCacheLayer