//模块:
xjsdk.widget.bindClass(xjsdk.widget.BaseWidget.extend({
    options: {
        resources: [
            "./lib/cesiumjs/plugins/class/GaodeRoute.js",//高德路径查询
            "./lib/cesiumjs/plugins/class/GaodePOI.js" //高德poi查询
        ],
        //弹窗
        view: {
            type: "window",
            url: "view.html",
            windowOptions: {
                width: 350
            }
        },
    },
    //初始化[仅执行1次]
    create: function () { },
    viewWindow: null,
    //每个窗口创建完成后调用
    winCreateOK: function (opt, result) {
        this.viewWindow = result;
    },
    //打开激活
    gaodeRoute: null,
    gaodePOI: null,
    activate: function () {
        this.gaodeRoute = new GaodeRoute();
        this.gaodePOI = new GaodePOI();
    },
    //关闭释放
    disable: function () {
        this.gaodeRoute = null;
        this.startLnglat = null;
        this.endLnglat = null;
        if (this.startPoint) {
            this.viewer.xjsdk.draw.deleteEntity(this.startPoint);
            this.viewer.entities.remove(this.startPoint);
            this.startPoint = null;
        }
        if (this.endPoint) {
            this.viewer.xjsdk.draw.deleteEntity(this.endPoint);
            this.viewer.entities.remove(this.endPoint);
            this.endPoint = null;
        }
        this.alreadyCompute = false;
        this.gaodePOI = null;
        this.gaodeRoute = null;
        this.startLnglat = null;
        this.startPoint = null;

        this.endLnglat = null;
        this.endPoint = null;
        this.clearCoumpute();
    },
    //===========gaodePOI 通过输入名称选点 ============
    queryPOI: function (text, type) {
        if (!text || !type) return;
        var arg = {};
        arg.success = function (res) {
            this.viewWindow.setHtmlInMCXD(res, type); //展示搜索结果
        }
        arg.error = function (msg) {
            window.toastr.error(msg);
            haoutil.loading.close();
        }
        arg.text = text;
        if (this.gaodePOI) this.gaodePOI.queryText(arg);
    },
    //=======================起点===============================
    //绘制起点
    startLnglat: null,
    startPoint: null,
    drawStartPoint: function (callback) {
        var that = this;
        that.viewer.xjsdk.draw.startDraw({
            type: "billboard",
            style: {
                image: this.path + "img/start.png"
            },
            success: function (entity) {
                var currentTime = that.viewer.clock.currentTime;
                var cartesian = entity.position.getValue(currentTime);
                var cartographic = Cesium.Cartographic.fromCartesian(cartesian);
                var jd = Number(Cesium.Math.toDegrees(cartographic.longitude).toFixed(6));
                var wd = Number(Cesium.Math.toDegrees(cartographic.latitude).toFixed(6));
                if (callback) callback(jd + "," + wd);
                that.startLnglat = [jd, wd];
                if (that.startPoint) {
                    that.viewer.xjsdk.draw.deleteEntity(entity);
                    that.startPoint.position.setValue(cartesian);
                } else {
                    that.startPoint = entity;
                }
                that.startCompute();
            }
        });
    },
    //输入起点坐标
    inputStartPoint: function (jd, wd) {
        if (!jd || !wd) return;
        if (this.startPoint) {
            this.viewer.xjsdk.draw.deleteEntity(this.startPoint);
            this.viewer.entities.remove(this.startPoint);
        }
        this.startLnglat = [jd, wd];
        var cartesian = Cesium.Cartesian3.fromDegrees(jd, wd);
        var entity = this.viewer.entities.add({
            position: cartesian,
            billboard: {
                image: this.path + "img/start.png",
                horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
                verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
                scale: 1,
                heightReference: Cesium.HeightReference.CLAMP_TO_GROUND
            }
        });
        this.startPoint = entity;
        this.locateByJWD({
            jd: jd,
            wd: wd
        });
        this.startCompute();
    },
    //查询起点坐标
    queryStartPoint: function (text) {
        if (!text) {
            window.toastr.error("请输入查询条件!");
            return;
        }
        this.queryPOI(text, "start");
    },
    //=======================终点===============================
    //绘制终点
    endPoint: null,
    endLnglat: null,
    drawEndPoint: function (callback) {
        var that = this;
        that.viewer.xjsdk.draw.startDraw({
            type: "billboard",
            style: {
                image: this.path + "img/end.png"
            },
            success: function (entity) {
                var currentTime = that.viewer.clock.currentTime;
                var cartesian = entity.position.getValue(currentTime);
                var cartographic = Cesium.Cartographic.fromCartesian(cartesian);
                var jd = Number(Cesium.Math.toDegrees(cartographic.longitude).toFixed(6));
                var wd = Number(Cesium.Math.toDegrees(cartographic.latitude).toFixed(6));
                if (callback) callback(jd + "," + wd);
                that.endLnglat = [jd, wd];
                if (that.endPoint) {
                    that.viewer.xjsdk.draw.deleteEntity(entity);
                    that.endPoint.position.setValue(cartesian);
                } else {
                    that.endPoint = entity;
                }
                that.startCompute();
            }
        });
    },
    //输入终点坐标
    inputEndPoint: function (jd, wd) {
        if (!jd || !wd) return;
        if (this.endPoint) {
            this.viewer.xjsdk.draw.deleteEntity(this.endPoint);
            this.viewer.entities.remove(this.endPoint);
        }
        this.endLnglat = [jd, wd];
        var cartesian = Cesium.Cartesian3.fromDegrees(jd, wd);
        var entity = this.viewer.entities.add({
            position: cartesian,
            billboard: {
                image: this.path + "img/end.png",
                horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
                verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
                scale: 1,
                heightReference: Cesium.HeightReference.CLAMP_TO_GROUND
            }
        });
        this.endPoint = entity;
        this.locateByJWD({
            jd: jd,
            wd: wd
        });
        this.startCompute();
    },
    //查询终点坐标
    queryEndPoint: function (text) {
        if (!text) {
            window.toastr.error("请输入查询条件!");
            return;
        }
        this.queryPOI(text, "end");
    },
    //===================开始计算路线========================
    //清除计算的结果
    clearCoumpute: function () {
        this.colorStep = 0;
        //清除路线
        for (var i = 0; i < this.routeArr.length; i++) {
            var line = this.routeArr[i];
            if (line) this.viewer.entities.remove(line);
        }
        this.routeArr = [];
        this.viewWindow.clearRouteContent(); //清除页面搜索结果

        //清除漫游的数组
        for (var index = 0; index < this.flyLineArr.length; index++) {
            var flyline = this.flyLineArr[index];
            if (flyline) flyline.destroy();
        }
        this.flyLineArr = [];

        //取消当前的视角跟随
        this.removeTrack();
        if (this.nowFline) {
            this.nowFline.destroy();
            this.nowFline = null;
        }

        $("#mapDH_speed").remove();
    },
    //开始计算
    alreadyCompute: false, //是否已计算过 
    startCompute: function () {
        if (!this.startLnglat || this.startLnglat.length == 0) return;
        if (!this.endLnglat || this.endLnglat.length == 0) return;
        if (this.alreadyCompute) { //清除上一次的计算结果
            this.clearCoumpute();
        }

        //当两点存在时 自动计算
        var that = this;
        this.gaodeRoute.query({
            type: 3,
            points: [this.startLnglat, this.endLnglat],
            extensions: "all",
            strategy: 11,
            success: function (data) {
                that.alreadyCompute = true;
                that.viewWindow.startCompute();
                if (!data || data.paths.length < 1) return;
                that.viewWindow.showRouteBox(true);
                //添加速度控制面板
                for (var i = 0; i < data.paths.length; i++) {
                    var line = that.addRouteLine(data.paths[i]);
                    if (!line) return;
                    that.routeArr.push(line);
                    //展示路径信息
                    that.viewWindow.showRouteInfo(line);
                    //计算漫游路线
                    that.computeFlyline(line);
                }
            }
        });
    },
    //添加路径
    //设置路线随机色
    randomColor: [
        new Cesium.Color.fromCssColorString("#eaf731").withAlpha(0.8),
        new Cesium.Color.fromCssColorString("#57f72e").withAlpha(0.8),
        new Cesium.Color.fromCssColorString("#2effd2").withAlpha(0.8),
        new Cesium.Color.fromCssColorString("#cc6e26").withAlpha(0.8),
        new Cesium.Color.fromCssColorString("#ff2ec7").withAlpha(0.8),
    ],
    colorStep: 0,
    routeArr: [], //保存路径
    addRouteLine: function (path) {
        var steps = path.steps;
        var points = path.points;
        if (!steps || steps.length < 1 || !points || points.length < 1) return;
        if (this.colorStep > this.randomColor.length - 1) {
            this.colorStep = 0;
        }
        var material = this.randomColor[this.colorStep]

        var cartesians = xjsdk.pointconvert.lonlats2cartesians(points);
        var line = this.viewer.entities.add({
            polyline: {
                positions: cartesians,
                clampToGround: true,
                material: material,
                width: 3
            }
        });
        line.attr = path;

        this.colorStep++;

        return line;
    },
    //============= 计算漫游路线 ======================
    flyLineArr: [],
    computeFlyline: function (line) {
        if (!line || !line.attr) return;

        var lnglats = line.attr.points;

        var flydata = {
            "name": "贴地路线",
            "camera": { "type": "" },
            "points": lnglats,
            "speed": 200,
            "model": {
                "uri": serverURL_gltf + "/xjsdk/qiche.gltf",
                "scale": 0.3,
                "minimumPixelSize": 30,
                "clampToGround":true,
                "show": true,
            }
        };
        var flyLine = new xjsdk.FlyLine(this.viewer, flydata);
        flyLine.lineId = line.id;
        this.flyLineArr.push(flyLine);

        // var that = this;
        // haoutil.loading.show("正在计算路径!");
        // flyLine.clampToGround(function () { //异步计算完成贴地后再启动
        //     haoutil.loading.hide();

        //     flyLine.popup = {
        //         id: Number((new Date()).getTime() + "" + Number(Math.random() * 1000).toFixed(0)),
        //         anchor: [0, -20], //左右、上下的偏移像素值。
        //         timeRender: true, //实时更新html
        //         html: function () {
        //             var params = flyLine.timeinfo;
        //             if (!params) return "即将开始漫游";
        //             var html = '<div style="width:200px;">' +
        //                 '总距离:' + haoutil.str.formatLength(flyLine.alllen) + '<br/>' +
        //                 '总时间:' + haoutil.str.formatTime(flyLine.alltimes / viewer.clock.multiplier) + '<br/>' +
        //                 '开始时间:' + Cesium.JulianDate.toDate(flyLine.startTime).format("yyyy-M-d HH:mm:ss") + '<br/>' +
        //                 '剩余时间:' + haoutil.str.formatTime((flyLine.alltimes - params.time) / viewer.clock.multiplier) + '<br/>' +
        //                 '剩余距离:' + haoutil.str.formatLength(flyLine.alllen - params.len) + ' <br/>' +
        //                 '</div>';
        //             return html;
        //         }
        //     }
        // });
    },
    getFlylineById: function (id) {
        if (!id) return;
        var flyline;
        for (var index = 0; index < this.flyLineArr.length; index++) {
            if (this.flyLineArr[index].lineId == id) {
                flyline = this.flyLineArr[index];
                break;
            }
        }
        return flyline;
    },
    nowFline: null, //当前的漫游对象
    roamOneById: function (id) {
        var flyline;
        for (var index = 0; index < this.flyLineArr.length; index++) {
            this.flyLineArr[index].stop();
            if (this.flyLineArr[index].lineId == id) {
                flyline = this.flyLineArr[index];
            }
        }
        this.nowFline = flyline;

        this.viewer.xjsdk.popup.close();
        this.viewer.xjsdk.popup.show(flyline, flyline.property);

        var that = this;
        flyline.start(function () {
            that.reset();
            if (that.cameraView) that.viewer.xjsdk.centerAt(that.cameraView);
        });
    },
    //漫游自动结束 或点击 停止导航按钮 后,重置界面和操作
    reset: function () {
        //漫游结束 重置按钮 取消跟随 
        this.resetBtn();
        this.removeTrack();
        if (this.nowFline) {
            this.nowFline.entity.show = false;
            this.nowFline = null;
        }
        //重置速度面板
        this.viewer.clock.multiplier = 1;

        //还原线的高亮
        this.highLightLine();
    },
    //重置按钮
    resetBtn: function () {
        this.viewWindow.resetButton();
        this.viewer.xjsdk.popup.close();
    },
    //取消当前的视角跟随
    removeTrack: function () {
        if (this.nowFline) {
            this.nowFline.updateStyle({
                camera: {
                    type: ""
                }
            });
        }
        this.viewer.trackedEntity = undefined;
    },
    //==============开始导航===================
    startDH: function (id, isGS) {
        //导航前释放之前的所有导航操作
        this.reset();
        //检测视角跟随是否选中
        //开始导航
        if (!id) return;
        this.roamOneById(id);

        if (isGS) {
            this.nowFline.updateStyle({ camera: { type: "gs" } });
        }
    },
    //============开始视角跟随=============
    startGS: function (id, ele) {
        //判断当前点击的视角跟随的id 是否是已在导航时的id
        if (this.nowFline) { //表示已开始漫游即已点击开始导航
            if (this.nowFline.lineId == id) {
                this.nowFline.updateStyle({ camera: { type: "gs" } });
            } else {
                window.toastr.error("当前路径无车辆运行!");
                if (ele) ele.prop("checked", false);
                return;
            }
        }
    },
    //==================其它方法=====================
    highLightLine: function (id) {
        var currentTime = this.viewer.clock.currentTime;
        for (var i = 0; i < this.routeArr.length; i++) {
            var nowLineMaterial = this.routeArr[i].polyline.material;
            var rgba = nowLineMaterial.color.getValue(currentTime);
            this.routeArr[i].polyline.material = new Cesium.Color(rgba.red, rgba.green, rgba.blue, 0.3);
            this.routeArr[i].polyline.width = 3;
        }
        if (!id) return;
        var entity = this.viewer.entities.getById(id);
        var rgba3 = entity.polyline.material.color.valueOf();
        entity.polyline.material = new Cesium.Color(rgba3.red, rgba3.green, rgba3.blue, 1);
        entity.polyline.width = 5;
    },
    locateByJWD: function (obj) {
        if (!obj || !obj.jd || !obj.wd) return;
        var position = Cesium.Cartesian3.fromDegrees(obj.jd, obj.wd, obj.gd || 0);
        var heading = Cesium.Math.toRadians(obj.heading || 0);
        var pitch = Cesium.Math.toRadians(obj.pitch || -90);
        var roll = Cesium.Math.toRadians(obj.roll || 0);
        var hpr = new Cesium.HeadingPitchRange(heading, pitch, roll);
        var bs = new Cesium.BoundingSphere(position, obj.cameraHeight || 2000);
        this.viewer.camera.viewBoundingSphere(bs, hpr);
        this.viewer.scene.camera.lookAtTransform(Cesium.Matrix4.IDENTITY);
    },
    getCameraView: function () {
        this.cameraView = xjsdk.point.getCameraView(this.viewer, false);
    },
    setCameraView: function () {
        if (this.cameraView) this.viewer.xjsdk.centerAt(this.cameraView);
    },
    resetSpeed: function (num) {
        if (num == undefined) return;
        this.viewer.clock.multiplier = num / 120;
    }


}));