// 微站上的百度地图

// NOTE!!! 这里的 ./ 一定不要忽略;否则被外部模块加载时,路径解析错误
define(['../testDrive', './baiduMapApi'], function(module){
        return module.directive('icBaiduMap', function(baiduMapApi){
            // 绘制路径
            function drawPaths(map, paths,flag){
                var points = [];
                var lon = 0,lat=0;
                if(paths.length>0){
                    angular.forEach(paths,function(paths){
                        var i=0;
                        angular.forEach(paths.points,function(locus){
                            if(i % 2 == 0 || i == paths.points.length - 1){
                                var Position=new BMap.Point(locus.lon2,locus.lat2);
                                points.push(Position);
                            }
                            lon += parseInt(locus.lon2);
                            lat += parseInt(locus.lat2);
                            i++;
                        });
                    });
                }
                var curve = new BMap.Polyline(points, {strokeColor:"red", strokeWeight:3, strokeOpacity:0.5}); //创建弧线对象
                map.addOverlay(curve); //添加到地图中
                //map.setCenter(new BMap.Point(lon/points.length,lat/points.length));
                //map.setViewport(points);

                var top_right_navigation = new BMap.NavigationControl({anchor: BMAP_ANCHOR_TOP_RIGHT, type: BMAP_NAVIGATION_CONTROL_ZOOM}); //右上角，仅包含平移和缩放按钮
                /*缩放控件type有四种类型:
                 BMAP_NAVIGATION_CONTROL_SMALL：仅包含平移和缩放按钮；BMAP_NAVIGATION_CONTROL_PAN:仅包含平移按钮；BMAP_NAVIGATION_CONTROL_ZOOM：仅包含缩放按钮*/
                //map.addControl(top_left_control);
                //map.addControl(top_left_navigation);
                map.addControl(top_right_navigation);

            }
            function drewMap(map,icPaths,flag,isBmap,icType){
                    var view = [];
                    var lon = 0,lat=0;
                    angular.forEach(icPaths,function(pos){
                        if(pos.trackFlag){
                            if(pos.track && pos.track[0] && pos.track[0].fixed){
                                drawPaths(map, pos.track,false);
                                //drawIco(map, value);
                            }
                            else {
                                fixBD09(pos.track, 20, 20, function (valueFixed) {
                                    if (valueFixed && valueFixed.length > 0)
                                        valueFixed[0].fixed = true; // 已经修正过了的标志位
                                    drawPaths(map, valueFixed,false);
                                    //drawIco(map, valueFixed);
                                });
                            }
                        }
                        var new_point = new BMap.Point(pos.lon,pos.lat);
                        var icon = new BMap.Icon("/fleet/styles/images/mapIcon/"+pos.mark+".png", new BMap.Size(40,19)); // 设置图片偏移});
                        var marker = new BMap.Marker(new_point,{icon:icon,rotation:pos.direction});  // 创建标注
                        var content = "<span>车牌号："+pos.license+"<br/>当前里程："+pos.mileage+"(km)<br/>状态："+pos.status+"<br/>";
                        map.addOverlay(marker);              // 将标注添加到地图中
                        if(icType=="BMAP_SATELLITE_MAP") {
                            opts.height = 160;
                            content +="车辆品牌："+pos.brand+"<br/>车系："+pos.series+"<br/>司机：司机A<br/>司机电话：13296630210</span>";
                            var label = new BMap.Label(pos.license,{offset:new BMap.Size(-10,-20)});
                            label.setStyle({                                   //给label设置样式，任意的CSS都是可以的
                                color:"red",                   //颜色
                                fontWeight:"bold",
                                fontSize:"14px",               //字号
                                height:"0",                //高度
                                width:"0",                 //宽
                                border:0,
                                textAlign:"center",            //文字水平居中显示
                                lineHeight:"105px"         //行高，文字垂直居中显示
                            });
                            marker.setLabel(label);
                        }else{
                            content +="</span>"
                        }
                        addClickHandler(map,content,marker);
                        if(flag) {
                            //map.panTo(new_point);
                            view.push(new_point);
                        }
                         lon += parseInt(pos.lon);
                         lat += parseInt(pos.lat);
                    })
                if(flag){
               if(isBmap){
                var top_left_control = new BMap.ScaleControl({anchor: BMAP_ANCHOR_TOP_LEFT});// 左上角，添加比例尺
                var top_left_navigation = new BMap.NavigationControl();  //左上角，添加默认缩放平移控件
                   map.addControl(top_left_control);
                   map.addControl(top_left_navigation);
               }else{
                  var top_right_navigation = new BMap.NavigationControl({anchor: BMAP_ANCHOR_TOP_RIGHT, type: BMAP_NAVIGATION_CONTROL_ZOOM}); //右上角，仅包含平移和缩放按钮
                 /*缩放控件type有四种类型:
                 BMAP_NAVIGATION_CONTROL_SMALL：仅包含平移和缩放按钮；BMAP_NAVIGATION_CONTROL_PAN:仅包含平移按钮；BMAP_NAVIGATION_CONTROL_ZOOM：仅包含缩放按钮*/
                  map.addControl(top_right_navigation);
               }
                map.addControl(new BMap.MapTypeControl({mapTypes: [BMAP_NORMAL_MAP,BMAP_SATELLITE_MAP ]}));   //添加地图类型控件
                map.setCenter(new BMap.Point(lon/icPaths.length,lat/icPaths.length));
                map.setViewport(view);
                }
                if(view.length == 1){
                  map.setZoom(12);
                }
                map.enableScrollWheelZoom(true); //自动缩放
            }
            function clearMap(map){
                map.clearOverlays();
            }
                var opts = {
                    width: 250,     // 信息窗口宽度
                    height: 80,     // 信息窗口高度
                    title: "<b>车辆信息</b>", // 信息窗口标题
                    enableMessage: false//设置允许信息窗发送短息
                };

            function addClickHandler(map,content,marker){
                marker.addEventListener("click",function(e){
                        openInfo(map,content,e)}
                );
            }


            function openInfo(map,content,e){
                var p = e.target;
                var point = new BMap.Point(p.getPosition().lng, p.getPosition().lat);
                var infoWindow = new BMap.InfoWindow(content,opts);  // 创建信息窗口对象
                map.openInfoWindow(infoWindow,point); //开启信息窗口
            }

            // BD-09坐标系转换
            function fixBD09(paths, fixLonKM, fixLatKM, cb){
                // 1KM大约是9/1000度
                var lonFix = Number(fixLonKM) * 9 / 1000;
                var latFix = Number(fixLatKM) * 9 / 1000;

                var ptFix = null; // 当前修正点
                var ptsNeedFix = []; // 需要修正的点集合
                var ptsNeedFixGroup = []; // 百度修正服务,每次只能接受100个点

                if(paths){
                    // 计算需要多少个修正点,存放在ptsNeedFix中
                    for(var i=0;i<paths.length;i++){
                        var path = paths[i];
                        if(path.points){
                            for(var j=0;j<path.points.length;j++){
                                var pt = path.points[j];
                                // 去除前置的东经E,北纬N;如果以后需要处理西半球或南半球的坐标,这里需要添加符号
                                pt.lon2 = pt.lon.substr(1);
                                pt.lat2 = pt.lat.substr(1);
                                if(i===0 && j===0){ // 第一个点必修正
                                    ptFix = pt;
                                    ptsNeedFix.push({i:i,j:j, lon: pt.lon2, lat:pt.lat2});
                                    ptsNeedFixGroup.push({pts: ptsNeedFix, done: false});
                                }
                                else{ // 如果和ptFix的偏移量超出lonFix或latFix,则增加一个修正点
                                    if(pt.lon2 - ptFix.lon2 > lonFix || pt.lat2 - ptFix.lat2 > latFix){
                                        ptFix = pt;
                                        ptsNeedFix.push({i:i,j:j, lon: pt.lon2, lat:pt.lat2});
                                        // 分组,每100个分一组
                                        if(ptsNeedFix.length === 1){
                                            ptsNeedFixGroup.push({pts: ptsNeedFix, done: false});
                                        }
                                        else if(ptsNeedFix.length === 100){
                                            ptsNeedFix = [];
                                        }
                                    }
                                }
                            }
                        }
                    }

                    // 发往百度服务器计算修正值
                    for(var g=0;g<ptsNeedFixGroup.length;g++){
                        (function(i){
                            baiduMapApi.geoConv(ptsNeedFixGroup[i].pts, function(data){
                                var fixGroup = ptsNeedFixGroup[i];
                                if(data.status == 0 && data.result && data.result.length === fixGroup.pts.length){
                                    for(var k=0;k<data.result.length;k++){
                                        fixGroup.pts[k].deltaLon = data.result[k].x - fixGroup.pts[k].lon;
                                        fixGroup.pts[k].deltaLat = data.result[k].y - fixGroup.pts[k].lat;
                                    }
                                }
                                fixGroup.done = true;

                                // 全部DELTA值计算完成
                                for(var j=0;j<ptsNeedFixGroup.length;j++) {
                                    if (ptsNeedFixGroup[j].done === false) return;
                                }

                                // 拼接全部GROUP统一处理
                                var m,n;
                                var ptsFixAll = [];
                                for(m=0;m<ptsNeedFixGroup.length;m++){
                                    for(n=0;n<ptsNeedFixGroup[m].pts.length;n++){
                                        ptsFixAll.push(ptsNeedFixGroup[m].pts[n]);
                                    }
                                }

                                var fixedCurrent = null, fixedNext = null, idxFixedNext = 1;
                                if(ptsFixAll.length > 0) fixedCurrent = ptsFixAll[0];
                                if(ptsFixAll.length > idxFixedNext) fixedNext = ptsFixAll[idxFixedNext];
                                console.log("共计修正点数:" + ptsFixAll.length);

                                if(fixedCurrent) { // 至少有一个修正点
                                    for (m = 0; m < paths.length; m++) {
                                        var path = paths[m];
                                        for (n = 0; n < path.points.length; n++) {
                                            var pt = path.points[n];
                                            // console.log(pt.lon + ":" + pt.lat);
                                            if (fixedNext === null || m < fixedNext.i || ( m === fixedNext.i && n < fixedNext.j )) {
                                                // 使用fixedCurrent进行修正
                                                pt.lon2 = Number(pt.lon2) + fixedCurrent.deltaLon;
                                                pt.lat2 = Number(pt.lat2) + fixedCurrent.deltaLat;
                                            }
                                            else{
                                                // 使用下一个修正点
                                                fixedCurrent = fixedNext;
                                                pt.lon2 = Number(pt.lon2) + fixedCurrent.deltaLon;
                                                pt.lat2 = Number(pt.lat2) + fixedCurrent.deltaLat;
                                                // 修正点后移一个
                                                idxFixedNext++;
                                                // console.log("fix point next" + JSON.stringify(fixedCurrent));
                                                if(idxFixedNext < ptsFixAll.length){
                                                    fixedNext = ptsFixAll[idxFixedNext];
                                                }
                                                else{
                                                    fixedNext = null; // 已到最后一个修正点
                                                }
                                            }
                                            // console.log(pt.lon + ":" + pt.lat + "->" + fixedCurrent.deltaLon + ":" + fixedCurrent.deltaLat);
                                        }
                                    }
                                }
                                // 发起回调
                                if(typeof cb === 'function') cb(paths);
                            })
                        })(g);
                    }
                }
            }

            // Link icBaiduMap
            function link(scope, element, attrs){
                var map = null;
                var flag = true;
                var isBmap =  scope.isBmap;
                var icType = scope.icType;
                // 我们使用异步方式加载百度地图API,很可能此时还没有完成加载过程
                // 因此,当百度地图异步加载完成后,需要通过回调完成初始化
                baiduMapApi.initBaiduMap(function(){
                    var id = attrs['id'];
                    if(!id){ // 如果没有id,那么随机分配一个
                        id = "maplocus_" + Math.random().toString().substr(2, 8);
                        element.attr('id', id);
                        attrs['id'] = id;
                    }
                    if(icType=="BMAP_SATELLITE_MAP"){
                       map = new BMap.Map(id,{mapType:BMAP_SATELLITE_MAP});
                       map.centerAndZoom(new BMap.Point(113.821942, 22.630798), 15); // 深圳宝安机场
                    }
                    else{
                        map = new BMap.Map(id);
                        map.centerAndZoom(new BMap.Point(106.28501, 35.561577), 5); // 天安门
                    }

                    //map.enableScrollWheelZoom();
                    // 如果在地图初始完成之前,icLocs数据已经准备好,那么立即绘制一次
                    if(scope.icLocs){
                        drewMap(map, scope.icLocs);
                    }
                });

                // 监视icLocs
                scope.$watch('icLocs',function(value){
                    // 地图初始后,每次icLocs更新,都需要重新绘制路径
                    if(map){
                        clearMap(map); //清除覆盖物
                        if(value.length>0 && isBmap){
                            // 去除前置的东经E,北纬N;如果以后需要处理西半球或南半球的坐标,这里需要添加符号
                            var temValue = value;
                            var newValue = "";
                            baiduMapApi.geoConv(value, function(data){
                                newValue = data.result;
                                for(var i=0;i< temValue.length;i++){
                                    temValue[i].lon = newValue[i].x;
                                    temValue[i].lat = newValue[i].y;
                                }
                                drewMap(map, temValue, flag, isBmap ,icType);
                                flag = false;
                            })
                        }else{
                            var id = attrs['id'];
                            if(!id){ // 如果没有id,那么随机分配一个
                                id = "maplocus_" + Math.random().toString().substr(2, 8);
                                element.attr('id', id);
                                attrs['id'] = id;
                            }
                            map = new BMap.Map(id,{mapType:icType});
                            map.centerAndZoom(new BMap.Point(106.28501, 35.561577), 5); // 天安门
                            if(value.length>0){
                                var temValue = value;
                                var newValue = "";
                                baiduMapApi.geoConv(value, function(data){
                                    newValue = data.result;
                                    for(var i=0;i< temValue.length;i++){
                                        temValue[i].lon = newValue[i].x;
                                        temValue[i].lat = newValue[i].y;
                                    }
                                    drewMap(map, temValue, flag, isBmap,icType);
                                })
                            }
                        }
                    }
                });
            }
            
            return {
                restrict:'A',
                scope: {
                    icBaiduMap: '=', // 地图的初始位置
                    icLocs: '=', // 地图上的路径数据
                    isBmap: '=',
                    icType: '='//默认显示的地图类型
                },
                link: link
            };
        });
});