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

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

      /**
       * 要素服务文档查询
       * @param options 查询参数
       * @param {Function} [options.success] 成功回调函数
       * @param {Function} [options.failure] 失败回调函数
       * @param {Array} [options.layerDefs] 每个图层的查询条件
       * @param {Object} [options.geometries] 几何查询条件
       * @param {String} [options.geometryType] 几何类型
       * @param {String} [options.inSR] 几何查询的坐标系
       * @param {String} [options.spatialRel] 几何查询的相交关系
       * @param {Number} [options.time] 几何查询的相交关系
       * @param {String} [options.outSR] 返回的数据的坐标系
       * @param {String} [options.gdbVersion]
       * @param {Boolean} [options.returnGeometry] 是否返回几何
       * @param {Number} [options.maxAllowableOffset]
       * @param {Boolean} [options.returnIdsOnly] 是否仅返回要素id
       * @param {Boolean} [options.returnCountOnly] 是否仅返回要素数量
       * @param {Boolean} [options.returnZ] 返回几何是否包含z值
       * @param {Boolean} [options.returnM] 返回几何是否包含m值
       * @param {Number} [options.geometryPrecision] 返回几何的小数点位数
       */
      queryFeatures(options) {
        // 设置PATH PARAMETERS校验
        const checkPathOpts = {}

        // 设置QUERY PARAMETERS校验
        const checkQueryOpts = {
          layerDefs: {
            type: 'Array'
          },
          geometries: {
            type: 'Object',
            required: true,
            process(geometries) {
              return `&geometries=${JSON.stringify(geometries)}`
            }
          },
          geometryType: {
            type: 'String'
          },
          inSR: {
            type: 'String'
          },
          spatialRel: {
            type: 'String'
          },
          time: {
            type: 'Number'
          },
          outSR: {
            type: 'Number'
          },
          gdbVersion: {
            type: 'Number'
          },
          returnGeometry: {
            type: 'Boolean'
          },
          maxAllowableOffset: {
            type: 'Number'
          },
          returnIdsOnly: {
            type: 'Boolean'
          },
          returnCountOnly: {
            type: 'Boolean'
          },
          returnZ: {
            type: 'Boolean'
          },
          returnM: {
            type: 'Boolean'
          },
          geometryPrecision: {
            type: 'Boolean'
          }
        }

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

      /**
       * 查询指定图层信息
       * @param options 查询参数
       * @param {String} [options.layerId] 图层ID，必填
       * @param {Function} [options.success] 查询成功回调函数，若使用Promise方式则不必填写
       * @param {Function} [options.failure] 查询失败回调函数，若使用Promise方式则不必填写
       */
      queryLayerInfo(options) {
        // 设置PATH PARAMETERS校验
        const checkPathOpts = {
          layerId: 'String'
        }

        // 设置QUERY PARAMETERS校验
        const checkQueryOpts = {}

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

      /**
       * @description 添加要素
       * @param options 查询参数
       * @param {String} [options.layerId] 要添加要素的图层id，必填
       * @param {Array} [options.features] 要添加的要素，必填
       * @param {Function} [options.success] 成功回调函数
       * @param {Function} [options.failure] 失败回调函数
       * @param {String} [options.gdbVersion]
       * @param {String} [options.rollbackOnFailure]
       */
      addFeatures(options) {
        // 设置PATH PARAMETERS校验
        const checkPathOpts = {
          layerId: {
            type: 'String'
          }
        }

        // 设置QUERY PARAMETERS校验
        const checkQueryOpts = {
          features: {
            type: 'Array',
            required: true
          },
          gdbVersion: {
            type: 'String'
          },
          rollbackOnFailure: {
            type: 'Boolean'
          }
        }

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

      /**
       * 编辑指定图层要素
       * @param options 查询参数
       * @param {String} [options.layerId] 要添加要素的图层id，必填
       * @param {Array} [options.features] 要添加的要素，必填
       * @param {Function} [options.success] 成功回调函数
       * @param {Function} [options.failure] 失败回调函数
       * @param {String} [options.gdbVersion]
       * @param {String} [options.rollbackOnFailure]
       * @param {String} [options.adds]
       * @param {String} [options.updates]
       * @param {String} [options.deletes]
       */
      editFeatures(options) {
        // 设置PATH PARAMETERS校验
        const checkPathOpts = {
          layerId: {
            type: 'String'
          }
        }

        // 设置QUERY PARAMETERS校验
        const checkQueryOpts = {
          adds: {
            type: 'String'
          },
          updates: {
            type: 'String'
          },
          deletes: {
            type: 'String'
          },
          features: {
            type: 'Array',
            required: true
          },
          gdbVersion: {
            type: 'String'
          },
          rollbackOnFailure: {
            type: 'Boolean'
          }
        }

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

      /**
       * @description 指定图层删除要素
       * @param options 查询参数
       * @param {String} [options.layerId] 要添加要素的图层id，必填
       * @param {Function} [options.success] 成功回调函数
       * @param {Function} [options.failure] 失败回调函数
       * @param {String} [options.objectIds] 指定要删除的id，多个id以逗号分割
       * @param {String} [options.where] where查询
       * @param {Object} [options.geometry] 几何查询
       * @param {String} [options.geometryType] 几何查询类型
       * @param {String} [options.inSR] 几何查询坐标系
       * @param {String} [options.spatialRel] 几何查询关系
       * @param {String} [options.gdbVersion]
       * @param {String} [options.rollbackOnFailure]
       */
      deleteFeatures(options) {
        // 设置PATH PARAMETERS校验
        const checkPathOpts = {
          layerId: {
            type: 'String'
          }
        }

        // 设置QUERY PARAMETERS校验
        const checkQueryOpts = {
          objectIds: {
            type: 'String'
          },
          where: {
            type: 'String'
          },
          geometry: {
            type: 'Object'
          },
          geometryType: {
            type: 'String'
          },
          inSR: {
            type: 'String'
          },
          spatialRel: {
            type: 'String'
          },
          gdbVersion: {
            type: 'String'
          },
          rollbackOnFailure: {
            type: 'String'
          }
        }

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

      /**
       * 要素服务图层查询
       * @param options 查询参数
       * @param {String} [options.layerId] 图层ID，必填
       * @param {String} [options.where] where查询条件，类似sql语句
       * @param {Function} [options.success] 查询成功回调函数，若使用Promise方式则不必填写
       * @param {Function} [options.failure] 查询失败回调函数，若使用Promise方式则不必填写
       */
      queryFeaturesInLayer(options) {
        // 设置PATH PARAMETERS校验
        const checkPathOpts = {
          layerId: {
            type: 'String'
          }
        }

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

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

      /**
       * @description 指定图层更新要素
       * @param options 查询参数
       * @param {String} [options.layerId] 要添加要素的图层id，必填
       * @param {Array} [options.features] 要添加的要素，必填
       * @param {Function} [options.success] 成功回调函数
       * @param {Function} [options.failure] 失败回调函数
       * @param {String} [options.gdbVersion]
       * @param {String} [options.rollbackOnFailure]
       */
      updateFeatures(options) {
        // 设置PATH PARAMETERS校验
        const checkPathOpts = {
          layerId: {
            type: 'String'
          }
        }

        // 设置QUERY PARAMETERS校验
        const checkQueryOpts = {
          features: {
            type: 'Array',
            required: true
          },
          gdbVersion: {
            type: 'String'
          },
          rollbackOnFailure: {
            type: 'Boolean'
          }
        }

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

      /**
       * 查询指定要素
       * @param options 查询参数
       * @param {String} [options.layerId] 图层ID，必填
       * @param {String} [options.featureId] 要素ID，必填
       * @param {Function} [options.success] 查询成功回调函数，若使用Promise方式则不必填写
       * @param {Function} [options.failure] 查询失败回调函数，若使用Promise方式则不必填写
       */
      queryFeatureInfo(options) {
        // 设置PATH PARAMETERS校验
        const checkPathOpts = {
          layerId: {
            type: 'String'
          },
          featureId: {
            type: 'String'
          }
        }

        // 设置QUERY PARAMETERS校验
        const checkQueryOpts = {}

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

    Zondy.Service.ArcGISFeatureServer = ArcGISFeatureServer
    export default ArcGISFeatureServer