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

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

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

      /**
       * 更新标绘图层
       * @param options 查询参数
       * @param {String} [options.layerName] 图层名称，必填
       * @param {FeatureSet} [options.content] 图层内容，必填
       * @param {Function} [options.success] 查询成功回调函数，若使用Promise方式则不必填写
       * @param {Function} [options.failure] 查询失败回调函数，若使用Promise方式则不必填写
       * @param {String} [options.layerId] 图层id
       */
      updateLayer(options) {
        // 设置PATH PARAMETERS校验
        const checkPathOpts = {}

        // 设置QUERY PARAMETERS校验
        const checkQueryOpts = {
          layerName: {
            type: 'String',
            required: true
          },
          content: {
            type: 'FeatureCollection',
            required: true
          },
          layerId: {
            type: 'String'
          }
        }

        // 设置为post请求
        options.method = FetchMethod.post

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

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

        // 设置QUERY PARAMETERS校验
        const checkQueryOpts = {
          layerId: {
            type: 'String',
            required: true
          }
        }

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

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

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

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

      /**
       * 查询态势推演脚本列表
       * @param options 查询参数
       * @param {Function} [options.success] 查询成功回调函数，若使用Promise方式则不必填写
       * @param {Function} [options.failure] 查询失败回调函数，若使用Promise方式则不必填写
       */
      queryAnimationScriptList(options) {
        // 调用基类的查询信息方法
        return this._querySimpleInfo(options, function (url) {
          // 拼装返回基地址
          return `${url}/scripts?f=json`
        })
      }

      /**
       * 更新态势推演脚本
       * @param options 查询参数
       * @param {String} [options.scriptName] 脚本名称，必填
       * @param {String} [options.content] 脚本内容，必填
       * @param {Function} [options.success] 查询成功回调函数，若使用Promise方式则不必填写
       * @param {Function} [options.failure] 查询失败回调函数，若使用Promise方式则不必填写
       * @param {String} [options.scriptId] 脚本id
       */
      updateAnimationScript(options) {
        // 设置PATH PARAMETERS校验
        const checkPathOpts = {}

        // 设置QUERY PARAMETERS校验
        const checkQueryOpts = {
          scriptName: {
            type: 'String',
            required: true
          },
          content: {
            type: 'String',
            required: true
          },
          scriptId: {
            type: 'String'
          }
        }

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

      /**
       * 获取态势推演脚本
       * @param options 查询参数
       * @param {String} [options.scriptId] 脚本id，必填
       * @param {Function} [options.success] 查询成功回调函数，若使用Promise方式则不必填写
       * @param {Function} [options.failure] 查询失败回调函数，若使用Promise方式则不必填写
       */
      getAnimationScript(options) {
        // 设置PATH PARAMETERS校验
        const checkPathOpts = {
          scriptId: {
            type: 'String'
          }
        }

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

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

      /**
       * 删除态势推演脚本
       * @param options 查询参数
       * @param {String} [options.scriptId] 脚本id，必填
       * @param {Function} [options.success] 查询成功回调函数，若使用Promise方式则不必填写
       * @param {Function} [options.failure] 查询失败回调函数，若使用Promise方式则不必填写
       */
      deleteAnimationScript(options) {
        // 设置PATH PARAMETERS校验
        const checkPathOpts = {
          scriptId: {
            type: 'String'
          }
        }

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

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

      /**
       * 获取标号库列表
       * @param options 查询参数
       * @param {Function} [options.success] 查询成功回调函数，若使用Promise方式则不必填写
       * @param {Function} [options.failure] 查询失败回调函数，若使用Promise方式则不必填写
       */
      getSymbolLibList(options) {
        // 调用基类的查询信息方法
        return this._querySimpleInfo(options, function (url) {
          // 拼装返回基地址
          return `${url}/symbolLibs?f=json`
        })
      }

      /**
       * 获取标号库列表
       * @param options 查询参数
       * @param {String} [options.libId] 标号库id，必填
       * @param {Function} [options.success] 查询成功回调函数，若使用Promise方式则不必填写
       * @param {Function} [options.failure] 查询失败回调函数，若使用Promise方式则不必填写
       */
      getSymbolLib(options) {
        // 设置PATH PARAMETERS校验
        const checkPathOpts = {
          libId: {
            type: 'String'
          }
        }

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

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

      /**
       * 获取标号
       * @param options 查询参数
       * @param {String} [options.libId] 标号库id，必填
       * @param {String} [options.symbolId] 标号id，必填
       * @param {Function} [options.success] 查询成功回调函数，若使用Promise方式则不必填写
       * @param {Function} [options.failure] 查询失败回调函数，若使用Promise方式则不必填写
       */
      getSymbol(options) {
        // 设置PATH PARAMETERS校验
        const checkPathOpts = {
          libId: {
            type: 'String'
          },
          symbolId: {
            type: 'String'
          }
        }

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

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

      /**
       * 删除标号
       * @param options 查询参数
       * @param {String} [options.libId] 标号库id，必填
       * @param {String} [options.symbolId] 标号id，必填
       * @param {Function} [options.success] 查询成功回调函数，若使用Promise方式则不必填写
       * @param {Function} [options.failure] 查询失败回调函数，若使用Promise方式则不必填写
       */
      deleteSymbol(options) {
        // 设置PATH PARAMETERS校验
        const checkPathOpts = {
          libId: {
            type: 'String'
          },
          symbolId: {
            type: 'String'
          }
        }

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

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

    Zondy.Service.PlotServer = PlotServer
    export default PlotServer