# Source: MapServer.js

    /*
     * @Description: In User Settings Edit
     * @Author: xiaoying
     * @Date: 2019-09-02 19:28:54
     * @LastEditTime: 2019-09-23 15:31:23
     * @LastEditors: mayuanye
     */
    import { NativeModules } from 'react-native';
    import SRefData from './SRefData.js';
    import Rect from './Rect.js';
    import ServerLayer from './ServerLayer.js';
    let MS = NativeModules.JSMapServer;

    /**
     * @class MapServer
     * @description 地图服务对象，此类中定义服务类型的字符串常量，例：MAPSERVER_TYPE_TDF等
     *
     *
     * @property {String} MapServerType.MAPSERVER_TYPE_TDF - MapGISHDF 。
     * @property {String} MapServerType.MAPSERVER_TYPE_MBTILES - MBTiles 。
     * @property {String} MapServerType.MAPSERVER_TYPE_TPKTILE - TPKTile 。
     * @property {String} MapServerType.MAPSERVER_TYPE_GEOPACKAGETILE - GeoPackageTile 。
     *
     * @property {String} MapServerType.MAPSERVER_TYPE_IGSERVER_TILE - MapGISIGServerTile 。
     * @property {String} MapServerType.MAPSERVER_TYPE_IGSERVER_VECTOR - MapGISIGServerVector 。
     * @property {String} MapServerType.MAPSERVER_TYPE_IGSERVER_VECTORTILE - MapGISIGServerVectorTile 。
     * @property {String} MapServerType.MAPSERVER_TYPE_IGSERVER_SCENE - MapGISIGServerScene 。
     *
     * @property {String} MapServerType.MAPSERVER_TYPE_OGC_WMS - OGCWMS 。
     * @property {String} MapServerType.MAPSERVER_TYPE_OGC_WMTS - OGCWMTS 。
     * @property {String} MapServerType.MAPSERVER_TYPE_OGC_WFS - OGCWFS 。
     *
     * @property {String} MapServerType.MAPSERVER_TYPE_TIANDITU - Tianditu 。
     * @property {String} MapServerType.MAPSERVER_TYPE_TIANDITU_EMAP - TianDiTuEMap 。
     * @property {String} MapServerType.MAPSERVER_TYPE_TIANDITU_ANNMAP - TianDiTuAnnMap 。
     * @property {String} MapServerType.MAPSERVER_TYPE_TIANDITU_SATELLITEMAP - TianDiTuSatelliteMap 。
     * @property {String} MapServerType.MAPSERVER_TYPE_TIANDITU_SATELLITEANNMAP - TianDiTuSatelliteAnnMap 。
     * @property {String} MapServerType.MAPSERVER_TYPE_TIANDITU_MERCATOR_EMAP - TianDiTuMercatorEMap 。
     * @property {String} MapServerType.MAPSERVER_TYPE_TIANDITU_MERCATOR_ANNMAP - TianDiTuMercatorAnnMap 。
     * @property {String} MapServerType.MAPSERVER_TYPE_TIANDITU_MERCATOR_SATELLITEMAP - TianDiTuMercatorSatelliteMap 。
     * @property {String} MapServerType.MAPSERVER_TYPE_TIANDITU_MERCATOR_SATELLITEANNMAP - TianDiTuMercatorSatelliteAnnMap 。
     *
     * @property {String} MapServerType.MAPSERVER_TYPE_OPENSTREET_STANDARD - OpenStreetStandard 。
     * @property {String} MapServerType.MAPSERVER_TYPE_OPENSTREET_CYCLE - OpenStreetCycle 。
     * @property {String} MapServerType.MAPSERVER_TYPE_OPENSTREET_TRANSPORT - OpenStreetTransport 。
     * @property {String} MapServerType.MAPSERVER_TYPE_OPENSTREET_MAPQUESTOPEN - OpenStreetMapQuestOpen 。
     * @property {String} MapServerType.MAPSERVER_TYPE_OPENSTREET_HUNAMITARIAN - OpenStreetHunamitarian 。
     *
     * @property {String} MapServerType.MapServerType.MAPSERVER_TYPE_BING_MAP - BingMap 。
     * @property {String} MapServerType.MAPSERVER_TYPE_BING_SATELLITEMAP - BingSatelliteMap 。
     * @property {String} MapServerType.MAPSERVER_TYPE_BING_HYBRIDMAP - BingHybridMap 。
     *
     * @property {String} MapServerType.MAPSERVER_TYPE_YAHOO_MAP - YahooMap 。
     * @property {String} MapServerType.MAPSERVER_TYPE_YAHOO_MAPSATELLITE - YahooMapSatellite 。
     * @property {String} MapServerType.MAPSERVER_TYPE_YAHOO_MAPVECTOR - YahooMapVector 。
     * @property {String} MapServerType.MAPSERVER_TYPE_YAHOO_MAPHYBRID - YahooMapHybrid 。
     *
     * @property {String} MapServerType.MAPSERVER_TYPE_GOOGLE_MAP - GoogleMap 。
     * @property {String} MapServerType.MAPSERVER_TYPE_GOOGLE_SATELLITEMAP - GoogleSatelliteMap 。
     * @property {String} MapServerType.MAPSERVER_TYPE_GOOGLE_MAPVECTOR - GoogleMapVector 。
     * @property {String} MapServerType.MAPSERVER_TYPE_GOOGLE_MAPHYBRID - GoogleMapHybrid 。
     * @property {String} MapServerType.MAPSERVER_TYPE_GOOGLE_MAPTERRAIN - GoogleMapTerrain 。
     * @property {String} MapServerType.MAPSERVER_TYPE_GOOGLE_CHINA_MAP - GoogleChinaMap 。
     * @property {String} MapServerType.MAPSERVER_TYPE_GOOGLE_CHINA_MAPSATELLITE - GoogleChinaMapSatellite 。
     * @property {String} MapServerType.MAPSERVER_TYPE_GOOGLE_CHINA_MAPVECTOR - GoogleChinaMapVector 。
     * @property {String} MapServerType.MAPSERVER_TYPE_GOOGLE_CHINA_MAPHYBRID - GoogleChinaMapHybrid 。
     * @property {String} MapServerType.MAPSERVER_TYPE_GOOGLE_CHINA_MAPTERRAIN - GoogleChinaMapTerrain 。
     *
     * @property {String} MapServerType.MAPSERVER_TYPE_BAIDU_MAP - BaiduMap 。
     * @property {String} MapServerType.MAPSERVER_TYPE_BAIDU_MAPSATELLITE - BaiduMapSatellite 。
     * @property {String} MapServerType.MAPSERVER_TYPE_BAIDU_MAPVECTOR - BaiduMapVector 。
     * @property {String} MapServerType.MAPSERVER_TYPE_BAIDU_MAPHYBRID - BaiduMapHybrid 。
     *
     * @property {String} MapServerType.MAPSERVER_TYPE_TMC_MAPABCMAP - TMCMapABCMap 。
     * @property {String} MapServerType.MAPSERVER_TYPE_TMC_SOSOMAP - TMCSOSOMap 。
     *
     * @property {String} MapServerType.MAPSERVER_TYPE_AMAP_MERCATOR_EMAP - AMapMercatorEMap 高德电子地图 。
     * @property {String} MapServerType.MAPSERVER_TYPE_AMAP_MERCATOR_SATELLITEMAP - AMapMercatorSatelliteMap 高德卫星图 。
     * @property {String} MapServerType.MAPSERVER_TYPE_AMAP_MERCATOR_SATELLITEANNMAP - AMapMercatorSatelliteAnnMap 高德卫星图 。
     *
     */

    export default class MapServer {
      /**
       * 构建一个新的MapServer对象
       *
       * @memberof MapServer
       * @returns {Promise<MapServer>} 地图服务对象
       */
      async createObj() {
        try {
          var { MapServerId } = await MS.createObj();
          var mapServer = new MapServer();
          mapServer._MGMapServerId = MapServerId;
          return mapServer;
        } catch (e) {
          console.error(e);
        }
      }

      /**
       * 获取服务类型
       *
       * @memberof MapServer
       * @returns {String} 服务类型
       */
      async getType() {
        try {
          let type = await MS.getType(this._MGMapServerId);
          return type;
        } catch (e) {
          console.error(e);
        }
      }

      /**
       * 获取地图浏览类型
       *
       * @memberof MapServer
       * @returns {Number} 地图浏览类型（int类型的Number） 例：0-MapServerBrowseType.MapTile
       */
      async getMapBrowseType() {
        try {
          let mapBrowserType = await MS.getMapBrowseType(this._MGMapServerId);
          return mapBrowserType;
        } catch (e) {
          console.error(e);
        }
      }

      /**
       * 设置具体服务名称
       *
       * @memberof MapServer
       * @param {String} name 具体服务名称
       * @returns {Promise<Void>}
       */
      async setName(name) {
        try {
          await MS.setName(this._MGMapServerId, name);
        } catch (e) {
          console.error(e);
        }
      }

      /**
       * 获取具体服务名称
       *
       * @memberof MapServer
       * @returns {String} 具体服务名称
       */
      async getName() {
        try {
          let name = await MS.getName(this._MGMapServerId);
          return name;
        } catch (e) {
          console.error(e);
        }
      }

      /**
       * 设置服务地址URL
       *
       * @memberof MapServer
       * @param {String} URL 服务地址URL
       * @returns {Promise<Void>}
       */
      async setURL(URL) {
        try {
          await MS.setURL(this._MGMapServerId, URL);
        } catch (e) {
          console.error(e);
        }
      }

      /**
       * 获取服务地址URL
       *
       * @memberof MapServer
       * @returns {String}
       */
      async getURL() {
        try {
          let URL = await MS.getURL(this._MGMapServerId);
          return URL;
        } catch (e) {
          console.error(e);
        }
      }

      /**
       * 连接数据 (真实地连接数据源，可以获取服务返回相关信息 如HDF瓦片信息。)
       *
       * @memberof MapServer
       * @returns {Number} 1-成功； 0-失败 （int类型的Number）
       */
      async connectData() {
        try {
          let result = await MS.connectData(this._MGMapServerId);
          return result;
        } catch (e) {
          console.error(e);
        }
      }

      /**
       * 判断服务地址URL是否有效性
       *
       * @memberof MapServer
       * @returns {boolean} true-服务地址有效； false-服务地址无效
       */
      async getIsValid() {
        try {
          let isValid = await MS.getIsValid(this._MGMapServerId);
          return isValid;
        } catch (e) {
          console.error(e);
        }
      }

      /**
       * 获取地图服务的源参照系
       *
       * @memberof MapServer
       * @returns {Object} SRefData 参照系
       */
      async getSRS() {
        try {
          var { SRefDataId } = await MS.getSRS(this._MGMapServerId);
          var sRefData = new SRefData();
          sRefData._MGSRefDataId = SRefDataId;
          return sRefData;
        } catch (e) {
          console.error(e);
        }
      }

      /**
       * 获取全图范围（数据范围）
       *
       * @memberof MapServer
       * @returns {Object} Rect 范围
       */
      async getEntireExtent() {
        try {
          var { RectId } = await MS.getEntireExtent(this._MGMapServerId);
          var rect = new Rect();
          rect._MGRectId = RectId;
          return rect;
        } catch (e) {
          console.error(e);
        }
      }

      /**
       * 返回服务对象个数 获得本服务对象下的服务对象列表,主要针对混合服务图层由多个服务对象组成。 eg.
       * CGGoogleHybridMapServer谷歌混合地图由CGGoogleSatelliteMapServer卫星地图和CGGoogleVectorMapServer矢量地图组成
       *
       * @memberof MapServer
       * @returns {Number} 服务对象个数 （int类型的Number）
       */
      async getMapServerCount() {
        try {
          let mapServerCount = await MS.getMapServerCount(this._MGMapServerId);
          return mapServerCount;
        } catch (e) {
          console.error(e);
        }
      }

      /**
       * 获取索引对应的地图服务对象
       *
       * @memberof MapServer
       * @param {Number} index 索引 （int类型的Number）
       * @returns {Object} 返回地图服务对象
       *
       */
      async getMapServer(index) {
        try {
          var { MapServerId, MapBrowseType, Type } = await MS.getMapServer(
            this._MGMapServerId,
            index
          );
          let mapServer = ServerLayer.createMapServerByIdAndType(
            MapServerId,
            MapBrowseType,
            Type
          );

          return mapServer;
        } catch (e) {
          console.error(e);
        }
      }

      /**
       *  设置服务版权
       *
       * @memberof MapServer
       * @param {String}  strCopyright 服务版权
       * @returns {Number} 1-成功 ； 0-失败 （int类型的Number）
       */
      async setCopyright(strCopyright) {
        try {
          let result = await MS.setCopyright(this._MGMapServerId, strCopyright);
          return result;
        } catch (e) {
          console.error(e);
        }
      }

      /**
       * 获取服务版权
       *
       * @memberof MapServer
       * @returns {String} 服务版权
       */
      async getCopyright() {
        try {
          let copyRight = await MS.getCopyright(this._MGMapServerId);
          return copyRight;
        } catch (e) {
          console.error(e);
        }
      }

      /**
       * 设置用户名和密码认证信息
       *
       * @memberof MapServer
       * @param {String} strUser  用户名
       * @param {String} strPwd  密码（或Token）,可用来设置Token验证码.
       * @returns {Number} 1-成功 ；0-失败 （int类型的Number）
       */
      async setAuthentication(strUser, strPwd) {
        try {
          let result = await MS.setAuthentication(
            this._MGMapServerId,
            strUser,
            strPwd
          );
          return result;
        } catch (e) {
          console.error(e);
        }
      }

      /**
       * 获取用户名
       *
       * @memberof MapServer
       * @returns {String} 用户名
       */
      async getAuthenticUser() {
        try {
          let authenticUser = await MS.getAuthenticUser(this._MGMapServerId);
          return authenticUser;
        } catch (e) {
          console.error(e);
        }
      }

      /**
       * 获密码或验证码（比如token验证码）
       *
       * @memberof MapServer
       * @returns {String} 密码或验证码
       */
      async getAuthenticPassword() {
        try {
          let authenticPassword = await MS.getAuthenticPassword(
            this._MGMapServerId
          );
          return authenticPassword;
        } catch (e) {
          console.error(e);
        }
      }

      /**
       *  获取服务所支持的版本列表
       *
       * @memberof MapServer
       * @returns {Number} 服务版本个数 （int类型的Number）
       * @description 我们认为所有服务都存在一个“Default version”默认版本
       */
      async getVersionCount() {
        try {
          let versionCount = await MS.getVersionCount(this._MGMapServerId);
          return versionCount;
        } catch (e) {
          console.error(e);
        }
      }

      /**
       * 获取索引对应的版本名称
       *
       * @memberof MapServer
       * @param {Number} index  索引 （int类型的Number）
       * @returns {String} 版本名称
       */
      async getVersion(index) {
        try {
          let version = await MS.getVersion(this._MGMapServerId, index);
          return version;
        } catch (e) {
          console.error(e);
        }
      }

      /**
       * 设置服务的当前版本
       *
       * @memberof MapServer
       * @param {String} strVersion  当前版本
       * @returns {Number} 1-成功 ； 0-失败 （int类型的Number）
       */
      async setCurrentVersion(strVersion) {
        try {
          let result = await MS.setCurrentVersion(this._MGMapServerId, strVersion);
          return result;
        } catch (e) {
          console.error(e);
        }
      }

      /**
       * 获取服务的当前版本
       *
       * @memberof MapServer
       * @returns {String} 返回当前版本
       */
      async getCurrentVersion() {
        try {
          let currentVersion = await MS.getCurrentVersion(this._MGMapServerId);
          return currentVersion;
        } catch (e) {
          console.error(e);
        }
      }
    }

    MapServer.MapServerType = {
      MAPSERVER_TYPE_TDF: 'MapGISHDF',
      MAPSERVER_TYPE_MBTILES: 'MBTiles',
      MAPSERVER_TYPE_TPKTILE: 'TPKTile',
      MAPSERVER_TYPE_GEOPACKAGETILE: 'GeoPackageTile',

      MAPSERVER_TYPE_IGSERVER_TILE: 'MapGISIGServerTile',
      MAPSERVER_TYPE_IGSERVER_VECTOR: 'MapGISIGServerVector',
      MAPSERVER_TYPE_IGSERVER_VECTORTILE: 'MapGISIGServerVectorTile',
      MAPSERVER_TYPE_IGSERVER_SCENE: 'MapGISIGServerScene',

      MAPSERVER_TYPE_OGC_WMS: 'OGCWMS',
      MAPSERVER_TYPE_OGC_WMTS: 'OGCWMTS',
      MAPSERVER_TYPE_OGC_WFS: 'OGCWFS',

      MAPSERVER_TYPE_TIANDITU: 'Tianditu',
      MAPSERVER_TYPE_TIANDITU_EMAP: 'TianDiTuEMap',
      MAPSERVER_TYPE_TIANDITU_ANNMAP: 'TianDiTuAnnMap',
      MAPSERVER_TYPE_TIANDITU_SATELLITEMAP: 'TianDiTuSatelliteMap',
      MAPSERVER_TYPE_TIANDITU_SATELLITEANNMAP: 'TianDiTuSatelliteAnnMap',
      MAPSERVER_TYPE_TIANDITU_MERCATOR_EMAP: 'TianDiTuMercatorEMap',
      MAPSERVER_TYPE_TIANDITU_MERCATOR_ANNMAP: 'TianDiTuMercatorAnnMap',
      MAPSERVER_TYPE_TIANDITU_MERCATOR_SATELLITEMAP: 'TianDiTuMercatorSatelliteMap',
      MAPSERVER_TYPE_TIANDITU_MERCATOR_SATELLITEANNMAP:
        'TianDiTuMercatorSatelliteAnnMap',

      MAPSERVER_TYPE_OPENSTREET_STANDARD: 'OpenStreetStandard',
      MAPSERVER_TYPE_OPENSTREET_CYCLE: 'OpenStreetCycle',
      MAPSERVER_TYPE_OPENSTREET_TRANSPORT: 'OpenStreetTransport',
      MAPSERVER_TYPE_OPENSTREET_MAPQUESTOPEN: 'OpenStreetMapQuestOpen',
      MAPSERVER_TYPE_OPENSTREET_HUNAMITARIAN: 'OpenStreetHunamitarian',

      MAPSERVER_TYPE_BING_MAP: 'BingMap',
      MAPSERVER_TYPE_BING_SATELLITEMAP: 'BingSatelliteMap',
      MAPSERVER_TYPE_BING_HYBRIDMAP: 'BingHybridMap',

      MAPSERVER_TYPE_YAHOO_MAP: 'YahooMap',
      MAPSERVER_TYPE_YAHOO_MAPSATELLITE: 'YahooMapSatellite',
      MAPSERVER_TYPE_YAHOO_MAPVECTOR: 'YahooMapVector',
      MAPSERVER_TYPE_YAHOO_MAPHYBRID: 'YahooMapHybrid',

      MAPSERVER_TYPE_GOOGLE_MAP: 'GoogleMap',
      MAPSERVER_TYPE_GOOGLE_SATELLITEMAP: 'GoogleSatelliteMap',
      MAPSERVER_TYPE_GOOGLE_MAPVECTOR: 'GoogleMapVector',
      MAPSERVER_TYPE_GOOGLE_MAPHYBRID: 'GoogleMapHybrid',
      MAPSERVER_TYPE_GOOGLE_MAPTERRAIN: 'GoogleMapTerrain',
      MAPSERVER_TYPE_GOOGLE_CHINA_MAP: 'GoogleChinaMap',
      MAPSERVER_TYPE_GOOGLE_CHINA_MAPSATELLITE: 'GoogleChinaMapSatellite',
      MAPSERVER_TYPE_GOOGLE_CHINA_MAPVECTOR: 'GoogleChinaMapVector',
      MAPSERVER_TYPE_GOOGLE_CHINA_MAPHYBRID: 'GoogleChinaMapHybrid',
      MAPSERVER_TYPE_GOOGLE_CHINA_MAPTERRAIN: 'GoogleChinaMapTerrain',

      MAPSERVER_TYPE_BAIDU_MAP: 'BaiduMap',
      MAPSERVER_TYPE_BAIDU_MAPSATELLITE: 'BaiduMapSatellite',
      MAPSERVER_TYPE_BAIDU_MAPVECTOR: 'BaiduMapVector',
      MAPSERVER_TYPE_BAIDU_MAPHYBRID: 'BaiduMapHybrid',

      MAPSERVER_TYPE_TMC_MAPABCMAP: 'TMCMapABCMap',
      MAPSERVER_TYPE_TMC_SOSOMAP: 'TMCSOSOMap',

      MAPSERVER_TYPE_AMAP_MERCATOR_EMAP: 'AMapMercatorEMap',
      MAPSERVER_TYPE_AMAP_MERCATOR_SATELLITEMAP: 'AMapMercatorSatelliteMap',
      MAPSERVER_TYPE_AMAP_MERCATOR_SATELLITEANNMAP: 'AMapMercatorSatelliteAnnMap',
    };