    import BaseServer from '../../BaseServer'
    import { Zondy } from '../../../base'

    /**
     * ArcGIS的MapServer服务
     * @class ArcGISMapServer
     * @moduleEx ServerModule
     * @extends BaseServer
     * @param {Object} options 构造参数
     * @param {String} [options.url = 无] 服务基地址
     */
    class ArcGISMapServer extends BaseServer {
      constructor(options) {
        super(options)
      }

      /**
       * 针对地图或地图中一个或多个图层进行属性查询
       * @param options 查询参数
       * @param {String} [options.searchText] 搜索包含该字符串的要素，在该服务下的所有文档中搜索，必填
       * @param {String} [options.layers] 要搜索的图层id，多个图层id以逗号分割，必填
       * @param {Function} [options.success] 查询成功回调函数，若使用Promise方式则不必填写
       * @param {Function} [options.failure] 查询失败回调函数，若使用Promise方式则不必填写
       * @param {Boolean} [options.contains = true] 匹配字符串时，是否是包含匹配，默认为true，即包含匹配，false时进行全词匹配
       * @param {String} [options.searchFields] 要搜索的字段名，多个字段名以逗号分割，不指定则全字段搜索
       * @param {Boolean} [options.returnGeometry = true] 是否返回几何数据
       * @param {Number} [options.geometryPrecision = 3] 返回几何数据的小数点位数
       */
      find(options) {
        // 设置PATH PARAMETERS校验
        const checkPathOpts = {}

        // 设置QUERY PARAMETERS校验
        const checkQueryOpts = {
          searchText: {
            type: 'String',
            required: true
          },
          contains: {
            type: 'Boolean'
          },
          searchFields: {
            type: 'String'
          },
          sr: {
            type: 'String'
          },
          layers: {
            type: 'String',
            required: true
          },
          returnGeometry: {
            type: 'Boolean'
          },
          geometryPrecision: {
            type: 'Number'
          },
          callback: {
            type: 'String'
          }
        }

        // 调用基类的查询信息方法
        return this._queryByParameters(
          options,
          checkPathOpts,
          checkQueryOpts,
          // 拼装返回基地址
          function (url) {
            return `${url}/find?f=json`
          }
        )
      }

      /**
       * 识别地图中与传入几何要素相交的要素
       * @param options 查询参数
       * @param {Function} [options.success] 查询成功回调函数，若使用Promise方式则不必填写
       * @param {Function} [options.failure] 查询失败回调函数，若使用Promise方式则不必填写
       */
      identify(options) {
        // 设置PATH PARAMETERS校验
        const checkPathOpts = {}

        // 设置QUERY PARAMETERS校验
        const checkQueryOpts = {
          geometry: {
            type: 'String'
          },
          geometryType: {
            type: 'String'
          },
          sr: {
            type: 'String'
          },
          layers: {
            type: 'String'
          },
          layerDefs: {
            type: 'Array'
          },
          tolerance: {
            type: 'String'
          },
          mapExtent: {
            type: 'String'
          },
          imageDisplay: {
            type: 'String'
          },
          returnGeometry: {
            type: 'String'
          },
          geometryPrecision: {
            type: 'String'
          },
          spatialFilter: {
            type: 'String'
          }
        }

        // 调用基类的查询信息方法
        return this._queryByParameters(
          options,
          checkPathOpts,
          checkQueryOpts,
          // 拼装返回基地址
          function (url) {
            return `${url}/identify?f=json`
          }
        )
      }

      /**
       * 获取所有图层资源
       * @param options 查询参数
       * @param {Function} [options.success] 查询成功回调函数，若使用Promise方式则不必填写
       * @param {Function} [options.failure] 查询失败回调函数，若使用Promise方式则不必填写
       * @param {String} [options.callback]
       */
      getLayers(options) {
        // 设置PATH PARAMETERS校验
        const checkPathOpts = {}

        // 设置QUERY PARAMETERS校验
        const checkQueryOpts = {
          callback: {
            type: 'String'
          }
        }

        // 调用基类的查询信息方法
        return this._queryByParameters(
          options,
          checkPathOpts,
          checkQueryOpts,
          // 拼装返回基地址
          function (url) {
            return `${url}/layers?f=json`
          }
        )
      }

      /**
       * 获取图例
       * @param options 查询参数
       * @param {Function} [options.success] 查询成功回调函数，若使用Promise方式则不必填写
       * @param {Function} [options.failure] 查询失败回调函数，若使用Promise方式则不必填写
       * @param {Number} [options.dpi = 96] 图例图像的分辨率
       * @param {String} [options.size = '15,15'] 图例图像的大小
       */
      getLegend(options) {
        // 设置PATH PARAMETERS校验
        const checkPathOpts = {}

        // 设置QUERY PARAMETERS校验
        const checkQueryOpts = {
          dpi: {
            type: 'Number'
          },
          size: {
            dpi: 'String'
          },
          callback: {
            dpi: 'String'
          }
        }

        // 调用基类的查询信息方法
        return this._queryByParameters(
          options,
          checkPathOpts,
          checkQueryOpts,
          // 拼装返回基地址
          function (url) {
            return `${url}/legend?f=json`
          }
        )
      }

      /**
       * 查询指定图层信息
       * @param options 查询参数
       * @param {Function} [options.success] 查询成功回调函数，若使用Promise方式则不必填写
       * @param {Function} [options.failure] 查询失败回调函数，若使用Promise方式则不必填写
       */
      queryLayerInfo(options) {
        // 调用基类的查询信息方法
        return this._queryInfoByLayerId(
          options,
          // 拼装返回基地址
          function (url, options) {
            return `${url}/${options.layerId}?f=json`
          }
        )
      }

      /**
       * 指定图层的空间和属性查询
       * @param options 查询参数
       * @param {String} [options.layerId] 图层ID，必填
       * @param {String} [options.geometry] 几何查询
       * @param {String} [options.geometryType] 几何查询
       * @param {String} [options.inSR] 查询几何的参考系
       * @param {String} [options.outSR] 返回数据的几何参考系
       * @param {String} [options.spatialRel] 几何查询空间关系
       * @param {String} [options.units] 设置几何数据的单位
       * @param {String} [options.where] where查询语句，类似sql语句
       * @param {String} [options.objectIds] 根据要素ID查询并返回数据，多个id以逗号分割
       * @param {String} [options.outFields] 指定返回数据的显示字段，多个字段名以逗号分割
       * @param {String} [options.orderByFields] 指定排序字段，多个字段名以逗号分割，例如orderByFields=field1 <ORDER>, field2 <ORDER>, field3 <ORDER>，orderByFields=STATE_NAME ASC, RACE DESC, GENDER
       * @param {Array<OutStatistic>} [options.outStatistics] 字段统计参数数组
       * @param {String} [options.groupByFieldsForStatistics]
       * @param {String} [options.geometryPrecision] 指定返回几何数据的小数点位数
       * @param {Number} [options.resultOffset = 0] 查询偏移位数，例如resultOffset=10，则从第11位开始查询
       * @param {Boolean} [options.returnIdsOnly = false] 仅返回查询到的要素id
       * @param {Boolean} [options.returnCountOnly = false] 仅返回查询到的要素的数目
       * @param {Boolean} [options.returnGeometry = true] 是否返几何数据
       * @param {Boolean} [options.returnZ = false] 是否返几何Z轴坐标
       * @param {Function} [options.success] 查询成功回调函数，若使用Promise方式则不必填写
       * @param {Function} [options.failure] 查询失败回调函数，若使用Promise方式则不必填写
       */
      queryFeatureInLayers(options) {
        // 设置PATH PARAMETERS校验
        const checkPathOpts = {
          layerId: {
            type: 'String'
          }
        }

        // 设置QUERY PARAMETERS校验
        const checkQueryOpts = {
          geometry: {
            type: 'String'
          },
          geometryType: {
            type: 'String'
          },
          geometryPrecision: {
            type: 'Number'
          },
          inSR: {
            type: 'String'
          },
          outSR: {
            type: 'String'
          },
          spatialRel: {
            type: 'String'
          },
          where: {
            type: 'String'
          },
          objectIds: {
            type: 'String'
          },
          distance: {
            type: 'String'
          },
          units: {
            type: 'String'
          },
          outFields: {
            type: 'String'
          },
          returnGeometry: {
            type: 'Boolean'
          },
          returnIdsOnly: {
            type: 'Boolean'
          },
          returnCountOnly: {
            type: 'Boolean'
          },
          orderByFields: {
            type: 'String'
          },
          outStatistics: {
            type: 'OutStatistics'
          },
          groupByFieldsForStatistics: {
            type: 'String'
          },
          resultOffset: {
            type: 'Number'
          },
          resultRecordCount: {
            type: 'String'
          },
          returnZ: {
            type: 'Boolean'
          }
        }

        // 调用基类的查询信息方法
        return this._queryByParameters(
          options,
          checkPathOpts,
          checkQueryOpts,
          // 拼装返回基地址
          function (url, options) {
            return `${url}/${options.layerId}/query?f=json`
          }
        )
      }
    }

    Zondy.Service.ArcGISMapServer = ArcGISMapServer
    export default ArcGISMapServer