    import { Zondy, Evented, Collection } from '../../base'
    import { defaultValue, getGUID } from '../../util'
    import TileInfoUtil from '../layer/support/TileInfoUtil'

    /**
     * 基础地图对象
     * <br>[ES5引入方式]：<br/>
     * Zondy.Basemap() <br/>
     * [ES6引入方式]：<br/>
     * import { Map } from "@mapgis/webclient-common" <br/>
     * @class Basemap
     * @moduleEX MapModule
     * @extends Evented
     * @fires Map#添加基础图层事件
     * @param {Object} options 构造参数
     * @param {Collection}  [options.baseLayers = new Collection()]  图层管理器
     * @param {String} [options.id = ''] 基础地图的ID
     * @param {String} [options.title = ''] 基础地图的名称
     * @param {String} [options.thumbnailUrl = ''] 基础地图的缩略图地址

     * @summary <h5>支持如下方法：</h5>
     * <a href='#destroy'>[1、销毁Map对象]</a><br/>
     * <a href='#fromJSON'>[2、通过json对象构造并返回一个新的Map对象]</a><br/>
     * <a href='#toJSON'>[3、转换为json对象]</a><br/>
     * <a href='#clone'>[4、克隆并返回一个新的Map对象]</a><br/>
     *
     * @example <caption><h7 id='valueExpression'>添加底图图层</h7></caption>
     * // ES5引入方式
     * const { Map, Basemap, Collection } = Zondy
     * const { IGSTileLayer } = Zondy.Layer
     * // ES6引入方式
     * import { Map, Basemap, Collection, IGSTileLayer } from "@mapgis/webclient-common"
     * //创建Map对象
     * const map = new Map({
     *   // 初始化底图图层集合
     *   basemap: new Basemap({
     *     // 可以设置多个图层到底图集合中
     *     baseLayers: new Collection(
     *       [
     *         // 创建一个图层
     *         new IGSTileLayer({
     *           url: '服务及地址'
     *         })
     *       ]
     *     )
     *   })
     * });
     */

    /**
     * @event BaseView#视图图层创建事件
     * @property {Object} event 事件对象
     * @property {LayerEventType} [event.type = 'layerview-created'] 事件类型
     * @property {Layer} [event.layer] 事件接收对象
     * @property {LayerView} [event.layerView] 事件地图视图中心
     * @property {BaseView} [event.view] 事件地图视图对象
     * @example <caption><h7>视图图层创建事件</h7></caption>
     * basemap.on('layerview-created', (event) => {
     *   console.log("添加地图图层事件:", event)
     * })
     */

    class Basemap extends Evented {
      constructor(options) {
        options = defaultValue(options, {})
        super()
        /**
         * 图层管理容器中包含的子图层
         * @member {Collection} Basemap.prototype.baseLayers
         */
        // this.baseLayers = defaultValue(options.baseLayers, new Collection())
        this._baseLayers = defaultValue(options.baseLayers, new Collection())
        /**
         * 基础地图的id
         * @member {Collection} Basemap.prototype.id
         */
        this.id = defaultValue(options.id, getGUID())
        /**
         * 基础地图的名称
         * @member {Collection} Basemap.prototype.title
         */
        this.title = defaultValue(options.title, '')
        /**
         * 基础地图的缩略图地址
         * @member {Collection} Basemap.prototype.thumbnailUrl
         */
        this.thumbnailUrl = defaultValue(options.thumbnailUrl, '')
        /**
         * 基础地图的坐标系
         * @member {Collection} Basemap.prototype.spatialReference
         */
        this.spatialReference = null
        this._referenceLayer = null
        this._initBaseLayer()
      }

      setSpatialReference() {
        const target = TileInfoUtil.getSpatialReference(this._baseLayers)
        this.spatialReference = target.spatialReference
        this._referenceLayer = target.referenceLayer
      }

      _initBaseLayer() {
        for (let i = 0; i < this._baseLayers.items.length; i++) {
          const layer = this._baseLayers.items[i]
          if (!layer.loaded) {
            layer._isBasemapLayer = true
          } else if (!layer._isBasemapLayer) {
            this._baseLayers.items.splice(i, 1)
            i--
          }
        }
      }

      /**
       * 通过json对象构造并返回一个新的Map对象<a id='fromJSON'></a>
       * @param {Object} json json数据
       * @return {Map} 一个新的Map对象
       * */
      static fromJSON(json) {
        json = defaultValue(json, {})
        return new Basemap(json)
      }

      /**
       * 转换为json对象<a id='toJSON'></a>
       * @return {Object} 导出的json对象
       */
      toJSON() {
        const json = {}
        json._baseLayers = []
        this._baseLayers.items.forEach((item) => {
          json.baseLayers.push(item.toJSON())
        })
        json.id = JSON.id
        json.title = this.title
        json.thumbnailUrl = this.thumbnailUrl.toJSON()
        json.spatialReference = this.spatialReference.toJSON()
        return json
      }

      /**
       * 克隆并返回一个新的Map对象<a id='clone'></a>
       * @return {Basemap} 新的Basemap对象
       */
      clone() {
        return new Basemap(this.toJSON())
      }

      /**
       * 销毁Map对象<a id='destroy'></a>
       */
      destroy() {
        this.fire('destroyed', {}, this)
        // this._destroyed = true
        this._baseLayers = null
        this.id = null
        this.title = null
        this.thumbnailUrl = null
        this.spatialReference = null
        this._referenceLayer = null
        this._haveView = null
      }

      _setBaseLayers(value) {
        this._baseLayers = value
        this.setSpatialReference()
      }
    }
    Object.defineProperties(Basemap.prototype, {
      baseLayers: {
        get() {
          return this._baseLayers
        },
        set(value) {
          this._setBaseLayers(value)
        }
      }
    })

    export default Basemap
    Zondy.Basemap = Basemap