    ﻿import {
        Zondy
    } from '../../common/Base';
    import {
        GeometryAnalysisBase
    } from "./GeometryAnalysisBase";
    import {
        IgsServiceBase
    } from "../../baseserver/IServiceBase";
    import {
        GPoint
    } from "../../common/GPoint";
    import {
        GLine
    } from "../../common/GLine";
    import {
        GRegion
    } from "../../common/GRegion";
    import {
        getTopAnalysisResult
    } from "../../common/Util";

    /**
     * 拓扑分析类,您只应该对pnt,line,reg3个属性中的一个赋值
     * @class module:几何分析服务.TopAnalysis
     * @classdesc  拓扑分析类
     * @description Zondy.Service.TopAnalysis 只应该对pnt,line,reg3个属性中的一个赋值
     * @extends Zondy.Service.GeometryAnalysisBase
     * @param {Object} option 属性键值对
     * @param {Zondy.Object.GPoint} [option.pnt = null] 需要设置的点类型
     * @param {Zondy.Object.GLine} [option.line = null] 需要设置的线类型
     * @param {Zondy.Object.GRegion} [option.reg = null] 需要设置的区类型
     * @param {Number} [option.nearDis = 0.01]  分析半径
     * @param {Zondy.Object.GRegion} [option.relativeObj = null] 相对对象
     * @param {function} [option.p_onSuccess = null] 回调函数
     * @example
     //创建线几何对象
     var lineObj = new Zondy.Object.GLine(
     new Zondy.Object.AnyLine([new Zondy.Object.Arc
     ([
     new Zondy.Object.Point2D(114.40, 30.60),
     new Zondy.Object.Point2D(114.45, 30.20)
     ])
     ])
     );
     //创建区几何对象
     var regionObj = new Zondy.Object.GRegion([
     new Zondy.Object.AnyLine([new Zondy.Object.Arc([
     new Zondy.Object.Point2D(114.301586, 30.533613),
     new Zondy.Object.Point2D(114.301586, 30.396517),
     new Zondy.Object.Point2D(114.544453, 30.396517),
     new Zondy.Object.Point2D(114.444453, 30.533613),
     new Zondy.Object.Point2D(114.401586, 30.533613)
     ])
     ])
     ]);
     //初始化TopAnalysis类
     var topService = new Zondy.Service.TopAnalysis({
                        //IP地址
                        ip: "develop.smaryun.com",
                        //端口号
                        port: "6163"
                    });
     //调用setLine方法，设置线类型
     topService.setLine(lineObj);
     //调用setRelativeObj方法，设置拓扑分析参照物
     topService.setRelativeObj(regionObj);
     //设置拓扑分析半径
     topService.nearDis = "0.05";
     topService.execute(function (res) {
                        console.log(res);
                    }, function (error) {
                        console.log(error);
                    });
     */
    class TopAnalysis extends GeometryAnalysisBase {
        constructor(option) {
            var options = option ? option : {};
            super(options);

            /**
             * @private
             * @member Zondy.Service.TopAnalysis.prototype.pnt
             * @type {Zondy.Service.GPoint}
             * @description 需要设置的点类型
             * @default null
             */
            this.pnt = options.pnt !== undefined ? options.pnt : null;

            /**
             * @private
             * @member Zondy.Service.TopAnalysis.prototype.line
             * @type {Zondy.Service.GLine}
             * @description 步长，插值时的间隔步长
             * @default null
             */
            this.line = options.line !== undefined ? options.line : null;

            /**
             * @private
             * @member Zondy.Service.TopAnalysis.prototype.reg
             * @type {Zondy.Service.GRegion}
             * @description 步长，插值时的间隔步长
             * @default null
             */
            this.reg = options.reg !== undefined ? options.reg : null;

            /**
             * @private
             * @member Zondy.Service.TopAnalysis.prototype.nearDis
             * @type {Number}
             * @description 分析半径
             * @default 0.01
             */
            this.nearDis = options.nearDis !== undefined ? options.nearDis : 0.01;

            /**
             * @private
             * @member Zondy.Service.TopAnalysis.prototype.relativeObj
             * @type {Zondy.Object.GRegion}
             * @description 相对对象
             * @default null
             */
            this.relativeObj = options.relativeObj !== undefined ? options.relativeObj : null;

            /**
             * @private
             * @member Zondy.Service.TopAnalysis.prototype.p_onSuccess
             * @type {function}
             * @description 回调函数
             * @default null
             */
            this.p_onSuccess = options.p_onSuccess !== undefined ? options.p_onSuccess : null;
        }

        /**
         * @function Zondy.Service.TopAnalysis.prototype.setPnt
         * @description 设置点类型
         * @param {Zondy.Object.GPoint} pnt 需要设置的点类型
         */
        setPnt(pnt) {
            this.pnt = pnt;
        }

        /**
         * @function Zondy.Service.TopAnalysis.prototype.setLine
         * @description 设置线类型
         * @param {Zondy.Object.GLine} line 需要设置的线类型
         */
        setLine(line) {
            this.line = line;
        }

        /**
         * @function Zondy.Service.TopAnalysis.prototype.setReg
         * @description 设置区类型
         * @param {Zondy.Object.GRegion} reg 需要设置的区类型
         */
        setReg(reg) {
            this.reg = reg;
        }

        /**
         * @function Zondy.Service.TopAnalysis.prototype.setReg
         * @description 设置拓扑分析的相对参照物
         * @param {Zondy.Object.GRegion} obj 相对参照物
         */
        setRelativeObj(obj) {
            this.relativeObj = obj;
        }

        /**
         * @function Zondy.Service.TopAnalysis.prototype.onGetRltSuccess
         * @description 这里应该还需对返回结果解析（2018/01/30）
         * @param {Number} enumNum 缺少注释，请联系IGServer部门
         */
        onGetRltSuccess(enumNum) {
            var rlt = getTopAnalysisResult(enumNum);
            this.p_onSuccess(rlt);
        }

        /**
         * @function Zondy.Service.TopAnalysis.prototype.execute
         * @description 执行拓扑分析
         * @param {callback} onSuccess 执行成功后的回调函数
         * @param {callback} onError 执行失败后的回调函数
         */
        execute(onSuccess, onError) {
            var me = this;
            me.p_onSuccess = onSuccess;
            var postObj = {};
            postObj.NearDis = this.nearDis;
            postObj.Pnt = this.pnt;
            postObj.Line = this.line;
            postObj.Reg = this.reg;
            postObj.RelativeObj = this.relativeObj;
            me.partUrl = "geomservice/topanalysis?f=json";
            var url = me.getFullUrl();
            var me = this;
            var service = new IgsServiceBase(url, {
                eventListeners: {
                    scope: me,
                    processCompleted: me.onGetRltSuccess,
                    processFailed: onError
                }
            });
            service.processAsync({
                method: 'POST',
                data: JSON.stringify(postObj),
                headers: {
                    'Content-Type': 'text/plain;charset=UTF-8'
                }
            });
        }
    }
    export {
        TopAnalysis
    };
    Zondy.Service.TopAnalysis = TopAnalysis;