#include "layeroperator.h"
#include "qdebug.h"
#include "routeglobalvariant.h"

#include "translator.h"
#include "Geometry/UGGeoLine.h"
#include "Geometry/UGGeoPoint.h"
#include "Scene/UGSelection3D.h"
#include "Render/UGRenderObject.h"
#include "QDynamicLayer.h"
#include "QDynamicLayers.h"
#include "geofeatureoperator.h"

LayerOperator::LayerOperator()
{

}

QMap<int,QStringList> LayerOperator::getSelectedFeature(UGMap *pMap)
{
    UGLayer* layer = NULL;
    UGString layerName;
    UGSelection* selection = NULL;
    UGRecordsetPtr res;
    UGVariant v;
    QStringList num;
    QMap<int,QStringList> featureInfo;
    for(int i=1;i<=routeGVar.getRouteType().count();i++)
    {
        layerName = Translator::QStr2UGStr("RouteLayer" + QString::number(i));
        if(!pMap->m_Layers.IsLayerExisted(layerName)) continue;
        layer = pMap->m_Layers.GetLayer(layerName);
        selection = layer->GetSelection();
        if(selection->IsEmpty()) continue;
        //获取选中要素的航线编号以及航线类型,用于数据集查询
        res = selection->ToRecordset(false);
        res->MoveFirst();
        while(!res->IsEOF())
        {
            res->GetFieldValue(_U("RouteNumber"),v);
            num << Translator::UGStr2QStr(v.ToString());
            res->MoveNext();
        }

        featureInfo.insert(i,num);
        num.clear();
        selection = NULL;
    }
    selection = NULL;
    layer = NULL;
    return featureInfo;
}

//设置图层风格
void LayerOperator::setVectorLayerStyle(UGLayer *layer, UGDataset::DatasetType m_nType)
{
    UGStyle sty;
    switch(m_nType){
        case (UGDataset::Point):
            sty.SetMarkerStyle(1110);//设置点符号
            sty.SetMarkerHeight(10); //设置符号高度
            sty.SetMarkerWidth(10); //设置符号宽度
            sty.SetLineColor(UGRGB(255,0,255)); //设置符号颜色
            layer->SetStyle(sty);  //给图层设置风格
            break;

        case (UGDataset::Line):
            sty.SetLineStyle(6); //设置线样式
            sty.SetLineColor(UGRGB(255,0,122)); //设置符号颜色
            sty.SetLineWidth(1); //设置线宽度
            layer->SetStyle(sty);  //给图层设置风格
            break;

        case (UGDataset::Region):
            sty.SetFillStyle(54); //设置填充符号样式
            sty.SetLineStyle(19);  //设置线条符号样式
            sty.SetFillForeColor(UGRGB(122,50,63));  //设置填充符号颜色
            sty.SetFillBackColor(UGRGB(1,1,1)); //设置背景填充颜色
            layer->SetStyle(sty);  //给图层设置风格
            break;

        default:
            break;
    };
}

void LayerOperator::addGeometryInTrackingLayer(UGTrackingLayer *pTrackingLayer, UGRecordsetPtr res,UGStyle &sty)
{
    res->MoveFirst();
    UGGeometry* pGeometry = NULL;
    int i = 1;
    while (!res->IsEOF()) {
        res->GetGeometry(pGeometry);
        pGeometry->SetStyle(&sty);
        pTrackingLayer->Add(pGeometry,Translator::QStr2UGStr("Geometry"+QString::number(i)));
        qDebug()<<"*************:"<< ("Geometry"+QString::number(i));
        res->MoveNext();
        i++;
    }
    pGeometry = NULL;
}

void LayerOperator::addGeometryInDynamicLayer(UGDynamicLayer *pDyLayer, UGRecordsetPtr res, UGStyle &sty)
{
    res->MoveFirst();
    UGGeometry* pGeometry = NULL;
    int i = 1;
    while (!res->IsEOF()) {
        res->GetGeometry(pGeometry);
        pGeometry->SetStyle(&sty);
        pDyLayer->Add(Translator::QStr2UGStr("Geometry"+QString::number(i)),pGeometry);
        res->MoveNext();
        i++;
        pGeometry = NULL;
    }
//    pGeometry = NULL;
}

void LayerOperator::getDynamicLayer(UGMap *pMap, UGDynamicLayer *&pDyLayer, UGString dyLayerName)
{
    if(pMap->m_DynamicLayers.GetDynamicLayer(dyLayerName)==NULL)
    {
        pDyLayer = new UGDynamicLayer();
        pDyLayer->SetLayerName(dyLayerName);
    }
    else
    {
        pDyLayer = pMap->m_DynamicLayers.GetDynamicLayer(dyLayerName);
    }
}

void LayerOperator::getQDynamicLayer(QMapControl *pMapControl, QDynamicLayer *&pDyLayer, QString dyLayerName)
{
    UGDynamicLayers* pDylayers = &(pMapControl->GetMap()->m_DynamicLayers);
    if(pDylayers->GetDynamicLayer(Translator::QStr2UGStr(dyLayerName)==NULL))
    {
        pDyLayer = new QDynamicLayer(dyLayerName);
    }
    else
    {
        int index = pDylayers->IndexOf(pDylayers->GetDynamicLayer(Translator::QStr2UGStr(dyLayerName)));
        pDyLayer = pMapControl->getDynamicLayers().Get(index);
    }
    pDylayers = NULL;
}

UGLayer *LayerOperator::appendDatasetToMap(UGDatasetPtr pDataset, UGMap *m_pMap)
{
    // 判断数据有效性
    if(pDataset == NULL)
    {
        return NULL;
    }
    //获取到用于显示的qMapControl中的map
    UGMap* pMap = m_pMap;

    // 将Dataset添加到地图中
    UGLayer* pLayer = pMap->m_Layers.AddDataset(pDataset, pDataset->GetType());

    pMap = NULL;
    pLayer = NULL;

    return pLayer;
}

//添加二维航点标记
void LayerOperator::addNodeLabel(UGGeoLine *pGeoline, UGDynamicLayer *pLabelDyLayer, QString routeType, QString routeNum)
{
    int pointNum = pGeoline->GetPointCount();
    const UGPoint2D* nodePoints = pGeoline->GetPoints(); //节点指针
    if(pGeoline->GetStartNode() == pGeoline->GetEndNode()) pointNum--;

    UGPoint2D point;
    //labelStyle
    UGTextStyle tSty = routeGVar.getLabelTextStyle(routeType.toInt());
    tSty.SetFixedSize(true);

    UGStyle sty;
//    sty.SetMarkerStyle(0);
    sty.SetMarkerSize(6);
    sty.SetFillForeColor(UGRGB(255,0,0));
//    sty.SetFillForeColor(routeGVar.getRouteTypeColor(routeType.toInt()));
//    sty.SetPointColor(routeGVar.getRouteTypeColor(routeType.toInt()));
    auto pGeoText(new UGGeoText);
    pGeoText->SetTextStyle(tSty);
    QString geoTextName;
    for(int i=1;i<=pointNum;i++)
    {
        point.x = nodePoints->x;
        point.y = nodePoints->y;
        //添加注记
        geoTextName = routeNum + "-" + QString::number(i);
        auto text = UGSubText(Translator::QStr2UGStr(geoTextName));
        pGeoText->AddSub(point, text);
        pLabelDyLayer->Add(Translator::QStr2UGStr("LB"+geoTextName),pGeoText);
        //添加节点
//        auto pGeoNode(new UGGeoPoint);
//        pGeoNode->Make(point);
//        pGeoNode->SetStyle(&sty);
//        pLabelDyLayer->Add(Translator::QStr2UGStr("PT"+geoTextName),pGeoNode);

        nodePoints++; //Node指针移动
//        delete pGeoNode;
    }
//    delete pGeoText;
    nodePoints = NULL;
}

void LayerOperator::addNodeLabel(QMapControl *qMapControl, UGRecordsetPtr selectionRes)
{
    selectionRes->MoveFirst();
//    UGDynamicLayers* pDyLayers = &qMapControl->GetMap()->m_DynamicLayers;
    UGGeometry* geometry = NULL;
    UGGeoLine* line = NULL;
    UGVariant v;
    QString routeType;
    QString routeNum;
    UGString labelText;
    UGDynamicLayer* pDyLayer = NULL;
    qDebug()<<"********************RecordCount:"<<selectionRes->GetRecordCount();
    while(!selectionRes->IsEOF())
    {
        selectionRes->GetFieldValue(Translator::QStr2UGStr(routeGVar.routeFieldsName.RouteType),v);
        routeType = Translator::UGStr2QStr(v.ToString());
        selectionRes->GetFieldValue(Translator::QStr2UGStr(routeGVar.routeFieldsName.RouteNumber),v);
        routeNum = Translator::UGStr2QStr(v.ToString());

//        pDyLayer = pDyLayers->GetDynamicLayer(Translator::QStr2UGStr(("LabelDyLayer" + routeType)));
        getDynamicLayer(qMapControl->GetMap(),pDyLayer,Translator::QStr2UGStr(("LabelDyLayer" + routeType)));
        selectionRes->GetGeometry(geometry);
        line = (UGGeoLine*)geometry;
        addNodeLabel(line,pDyLayer,routeType,routeNum);

        selectionRes->MoveNext();
//        for(int i = 1;i<=geometry->GetSubPntCount(0);i++)
//        {
//            labelText = v.ToString() + _U("-") + Translator::QStr2UGStr(QString::number(i));
//            pDyLayer->Add();
//        }
    }
    qMapControl->GetMap()->m_DynamicLayers.Add(pDyLayer);
    pDyLayer = NULL;
    geometry = NULL;
    line = NULL;
}

//导入kml文件时临时显示航线,仅用于二维地图
void LayerOperator::showKMLTemporary(QMapControl *qMapControl, UGRecordsetPtr kmlRes)
{
    //添加航线到Tracking Layer
    LayerOperator layerOperator;
    UGStyle sty;
    routeGVar.getTemporaryStyle(sty);
    /* Tracking Layer
        UGTrackingLayer* pTrackingLayer = &qMapControl->GetMap()->m_TrackingLayer;
        layerOperator.addGeometryInTrackingLayer(pTrackingLayer,res,sty);
        routeGVar.getHighLightStyle(sty);
        UGGeoEvent* pGeoEvent = pTrackingLayer->GetAt(0);
        pGeoEvent->SetStyle(sty); //设置第一条航线高亮
        */
    //将kml航线临时展示在动态图层
    UGMap* pMap = qMapControl->GetMap();
    UGDynamicLayer* pDyLayer = NULL;
    UGString kmlLayerName = _U("KMLDyLayer");
    layerOperator.getDynamicLayer(pMap,pDyLayer,kmlLayerName);
    layerOperator.addGeometryInDynamicLayer(pDyLayer,kmlRes,sty);
    //设置第一条航线高亮
    routeGVar.getHighLightStyle(sty);
    pDyLayer->GetAt(0)->SetStyle(&sty);
    pMap->m_DynamicLayers.Add(pDyLayer);
    qMapControl->Refresh();

    pMap = NULL;
}

//显示三维航线注记
void LayerOperator::showNodeLabel3D(SceneControl* pSceneControl)
{
    map<int,UGRecordsetPtr>mapDisplayGeometryIDs = pSceneControl->m_mapDisplayGeometryID;
    UGRecordsetPtr res = NULL;
    map<int, UGRecordsetPtr>::iterator iter;
    UGTrackingLayer3D* pTrackingLayer = pSceneControl->GetTrackingLayer3D();
    GeoFeatureOperator geoFOpt;
    for(iter =mapDisplayGeometryIDs.begin(); iter != mapDisplayGeometryIDs.end(); iter++)
    {
        res = iter->second;
        geoFOpt.addNodeLabel3D(res,pTrackingLayer);
    };

}

//添加几何对象到三维追踪层
void LayerOperator::addGeometryToTrackingLayer3D(SceneControl *pSceneControl, UGRecordsetPtr kml3DRes)
{
    UGTrackingLayer3D* trackingLayer3D = pSceneControl->GetTrackingLayer3D();
    UGGeometry* pGeometry = NULL;
    UGGeoLine3D* line3D = NULL;
    UGRenderObject* ro = NULL;
    UGStyle3D sty;
    routeGVar.getHighLightStyle3D(sty);
    //高亮当前正在导入的线段
    int i = 1;
    kml3DRes->MoveFirst();
    kml3DRes->GetGeometry(pGeometry);
    line3D = (UGGeoLine3D*)pGeometry;
    line3D->SetStyle3D(&sty);
    trackingLayer3D->Add(line3D,Translator::QStr2UGStr("Geometry"+QString::number(i)));
    kml3DRes->MoveNext();
    pGeometry = NULL;
    line3D = NULL;
    ro = NULL;
    // 剩余默认风格
    routeGVar.getTemporaryStyle3D(sty);
    while (!kml3DRes->IsEOF()) {
        i++;
        kml3DRes->GetGeometry(pGeometry);
        line3D = (UGGeoLine3D*)pGeometry;
        line3D->SetStyle3D(&sty);
        ro = trackingLayer3D->Add(line3D,Translator::QStr2UGStr("Geometry"+QString::number(i)));
//        ro->SetStyle3D(&sty);
        kml3DRes->MoveNext();
        pGeometry = NULL;
        line3D = NULL;
        ro = NULL;
    }

    trackingLayer3D = NULL;
}

// 获取Layer3D中选中几何对象标记信息
QMap<int, QStringList> LayerOperator::getSelectedFeature3D(SceneControl *pSceneControl)
{
    UGArray<UGSelection3D*>* pSelectionArr = NULL;
    UGSelection3D* selection = NULL;
    UGRecordsetPtr res;
    UGVariant v;
    QStringList num;
    QMap<int,QStringList> featureInfo;

    pSelectionArr = pSceneControl->GetGeoSelections();
    for(int i = 0;i<pSelectionArr->GetSize();i++)
    {//获取选中要素的航线编号以及航线类型,用于数据集查询
        selection = pSelectionArr->GetAt(i);
        res = pSceneControl->ToRecordset(selection);
        res->GetFieldValue(Translator::QStr2UGStr(routeGVar.routeFieldsName.RouteType),v);
        int type = v.ToInt();
        res->MoveFirst();
        while(!res->IsEOF())
        {
            res->GetFieldValue(Translator::QStr2UGStr(routeGVar.routeFieldsName.RouteNumber),v);
            num << Translator::UGStr2QStr(v.ToString());
            res->MoveNext();
        }
        featureInfo.insert(type,num);
        num.clear();
        selection = NULL;
        res = NULL;
    }
    pSelectionArr = NULL;

    return featureInfo;
}