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

    /**
     * M3d服务，服务地址:/igs/rest/services/{folder}/{serviceName}/M3dServer
     * @class M3DServer
     * @moduleEx ServerModule
     * @extends BaseServer
     * @param {Object} options 构造参数
     * @param {String} [options.url = 无] 服务基地址
     * @example
     * //初始化M3DServer服务对象
     * // ES5引入方式
     * const { M3DServer } = Zondy.Service
     * // ES6引入方式
     * import { M3DServer } from "@mapgis/webclient-common"
     *     const m3dServer = new M3DServer({
     *       //服务基地址
     *       url: 'http://192.168.82.89:8089/igs/rest/services/M3Dv2/武汉建筑轮廓白模/M3dServer'
     *     })
     */
    class M3DServer extends BaseServer {
      constructor(options) {
        super(options)
      }

      /**
       * @function M3DServer.prototype.queryRootNodeInfo
       * @description 获取M3d根节点信息 后端接口：/igs/rest/services/{serviceName}/M3dServer/nodes/root
       * @param options 查询参数
       * @param {String} [options.method = FetchMethod.get ] 请求类型
       * @param {Function} [options.success = 无] 查询成功回调函数，若使用Promise方式则不必填写
       * @param {Function} [options.failure = 无] 查询失败回调函数，若使用Promise方式则不必填写
       * @param {String} [options.include = 无] 返回节点信息包括的类型，默认为空，等于descendants时返回节点信息包括节点的子孙后代
       * @param {Number} [options.maxDepth = 1] 节点最大深度
       * @param {Number} [options.maxCount = 1000] 节点最大个数
       * @returns {Promise<Object>}
       * @example
       * //回调方式
       * m3dServer.queryRootNodeInfo({
       *         maxCount:1100,
       *         success: function (result) {
       *           console.log('请求成功：', result)
       *         }
       *       })
       * //promise方式
       * m3dServer.queryRootNodeInfo({
       *  maxCount:1100,
       * }).then(function (result) {
       *   console.log('请求成功：', result);
       * }).catch(function (result) {
       *   console.log('请求失败：', result);
       * });
       */
      queryRootNodeInfo(options) {
        // 设置PATH PARAMETERS校验
        const checkPathOpts = {}
        // 设置QUERY PARAMETERS校验
        const checkQueryOpts = {
          include: {
            type: 'String'
          },
          maxDepth: {
            type: 'Number'
          },
          maxCount: {
            type: 'Number'
          }
        }
        // 调用基类的查询信息方法
        return this._queryByParameters(
          options,
          checkPathOpts,
          checkQueryOpts,
          // 拼装返回基地址
          function (url) {
            return `${url}/nodes/root?f=json`
          }
        )
      }

      /**
       * @function M3DServer.prototype.queryRootInfo
       * @description 获取M3d节点信息,后端接口:/igs/rest/services/{serviceName}/M3dServer/nodes/{nodeId}
       * @param options 查询参数
       * @param {String} [options.nodeId = 无] 节点Id，必传
       * @param {String} [options.method = FetchMethod.get ] 请求类型
       * @param {Function} [options.success = 无] 查询成功回调函数，若使用Promise方式则不必填写
       * @param {Function} [options.failure = 无] 查询失败回调函数，若使用Promise方式则不必填写
       * @param {String} [options.include = 无] 返回节点信息包括的类型，默认为空，等于descendants时返回节点信息包括节点的子孙后代
       * @param {Number} [options.maxDepth = 1] 节点最大深度
       * @param {Number} [options.maxCount = 1000] 节点最大个数
       * @returns {Promise<Object>}
       * @example
       * //回调方式
       * m3dServer.queryNodeInfo({
       *         nodeId: '1',
       *         maxCount:2,
       *         success: function (result) {
       *           console.log('请求成功：', result)
       *         }
       *       })
       * //promise方式
       * m3dServer.queryNodeInfo({
       *         nodeId: '1',
       *         maxCount:2,
       * }).then(function (result) {
       *   console.log('请求成功：', result);
       * }).catch(function (result) {
       *   console.log('请求失败：', result);
       * });
       */
      queryNodeInfo(options) {
        // 设置PATH PARAMETERS校验
        const checkPathOpts = {
          nodeId: {
            type: 'String'
          }
        }

        // 设置QUERY PARAMETERS校验
        const checkQueryOpts = {
          include: {
            type: 'String'
          },
          maxDepth: {
            type: 'Number'
          },
          maxCount: {
            type: 'Number'
          }
        }

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

      /**
       * @function M3DServer.prototype.getSharedResources
       * @description 获取M3d公共服务资源,后端接口:/igs/rest/services/{serviceName}/M3dServer/sharedResources
       * @param options 查询参数
       * @param {String} [options.method = FetchMethod.get ] 请求类型
       * @param {Function} [options.success = 无] 查询成功回调函数，若使用Promise方式则不必填写
       * @param {Function} [options.failure = 无] 查询失败回调函数，若使用Promise方式则不必填写
       * @returns {Promise<Object>}
       * @example
       * //回调方式
       * m3dServer.getSharedResources({
       *         success: function (result) {
       *           console.log('请求成功：', result)
       *         }
       *       })
       * //promise方式
       * m3dServer.getSharedResources({
       * }).then(function (result) {
       *   console.log('请求成功：', result);
       * }).catch(function (result) {
       *   console.log('请求失败：', result);
       * });
       */
      getSharedResources(options) {
        // 设置PATH PARAMETERS校验
        const checkPathOpts = {}
        // 设置QUERY PARAMETERS校验
        const checkQueryOpts = {}
        // 调用基类的查询信息方法
        return this._queryByParameters(
          options,
          checkPathOpts,
          checkQueryOpts,
          // 拼装返回基地址
          function (url) {
            return `${url}/sharedResources?f=json`
          }
        )
      }
    }

    Zondy.Service.M3DServer = M3DServer
    export default M3DServer