#include "loadonlinemapdialog.h"
#include "MapEditor/UGMapEditorWnd.h"
#include "Scene/UGLayer3D.h"
#include "qdebug.h"
#include "ui_loadonlinemapdialog.h"

#include "translator.h"

//MSVC编译器界面显示乱码问题
//#if _MSC_VER >= 1600
//    #pragma execution_character_set("utf-8")
//#endif

LoadOnlineMapDialog::LoadOnlineMapDialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::LoadOnlineMapDialog)
{
    ui->setupUi(this);

    this->setWindowTitle(u8"在线地图");
    this->resize(600,300);
    this->setWindowFlags(Qt::WindowCloseButtonHint);  //关闭右上角帮助(?)按钮。

    is3DMap = false;

    addMapSourceItem();
}

LoadOnlineMapDialog::~LoadOnlineMapDialog()
{
    delete ui;
}

void LoadOnlineMapDialog::setWorkspace(UGWorkspace *pWorkspace, UGMapEditorWnd* pEditorWnd)
{
    this->pWorkspace = pWorkspace;
    this->pEditorWnd = pEditorWnd;
    this->is3DMap =  false;
}

void LoadOnlineMapDialog::setScene(SceneControl *m_pSceneControl)
{
    this->m_pSceneControl = m_pSceneControl;
    this->is3DMap =  true;
}

void LoadOnlineMapDialog::addMapSourceItem()
{
    ui->mapSourceCbbox->addItem(u8"全球影像地图(经纬度)");
    ui->mapSourceCbbox->addItem(u8"全球影像注记(经纬度)");
    ui->mapSourceCbbox->addItem(u8"全球矢量地图(经纬度)");
    ui->mapSourceCbbox->addItem(u8"全球矢量注记(经纬度)");
    ui->mapSourceCbbox->addItem(u8"全球地形晕渲地图(经纬度)");
    ui->mapSourceCbbox->addItem(u8"全球地形注记(经纬度)");
}

QString LoadOnlineMapDialog::getDataType(int item)
{
    QString dataType;
    switch (item) {
    case 0:
        dataType = "img_c";  //影像底图(经纬度)
        break;
    case 1:
        dataType = "cia_c"; //影像注记
        break;
    case 2:
        dataType = "vec_c"; //矢量底图(经纬度)
        break;
    case 3:
        dataType = "cva_c"; //矢量注记
        break;
    case 4:
        dataType = "ter_c"; //地形晕渲(经纬度)
        break;
    case 5:
        dataType = "cta_c"; //地形注记
        break;
    default:
        dataType = "img_c";
        break;
    }
    return dataType;
}

bool LoadOnlineMapDialog::loadTiandituMap(int item)
{
//加载天地图在线影像
    QString dataType = getDataType(item);
//    QString serverAlias;

    QString token = "5ff7526440d3a7dab78037697c4679fa";
    QString serverName = "http://t0.tianditu.gov.cn/" + dataType + "/wmts?DPI=96&tk=" + token;

    //设置连接信息
    UGDsConnection dsCon;
    dsCon.m_strServer = Translator::QStr2UGStr(serverName);
    dsCon.m_strDriver = _U("WMTS");
    dsCon.m_nType = UGEngineType::WEB;
    dsCon.m_strAlias = Translator::QStr2UGStr(dataType);

    //获取数据源
    UGDataSource* ds_tianditu = pWorkspace->OpenDataSource(dsCon);
    if(ds_tianditu==NULL) return false;
    UGDatasetPtr dataset = ds_tianditu->GetDataset(0);
    UGMap* pMap = &pEditorWnd->m_mapWnd.m_Map;
    //添加图层
    pMap->m_Layers.AddDataset(dataset,true,UGLayer::UG_Layer_Normal,Translator::QStr2UGStr(dataType));
    pMap = NULL;
    return true;

}

void LoadOnlineMapDialog::loadSceneTiandituMap(int item)
{
    QString dataType = getDataType(item);
    QString token = "5ff7526440d3a7dab78037697c4679fa";
    QString serverName = "http://t0.tianditu.gov.cn/" + dataType + "/wmts?DPI=96&tk=" + token;
    //url图层参数设置
    UGLayerURLParameter urlParm;
    urlParm.m_strServerRootUrl = Translator::QStr2UGStr(serverName);
    urlParm.m_nType = UGLayer3DType::l3dWMTS;
    urlParm.m_strDataLayerName = _U("img");
    urlParm.m_strUserLayerName = _U("Img_tianditu");
    urlParm.m_dDPI = 96;
    urlParm.m_nImageType = UGFileType::JPGPNG;
    urlParm.m_bAddToScene = true;
    urlParm.m_bVisible = true;
    //添加到场景
    m_pSceneControl->GetUGLayer3Ds()->AddLayer(urlParm);
}

void LoadOnlineMapDialog::on_openMapBtn_clicked()
{
    int item = ui->mapSourceCbbox->currentIndex();
    if(is3DMap)
    {//三维地图
        loadSceneTiandituMap(item);
    }
    else
    {//二维地图
        QString dataType = getDataType(item);
        if(pWorkspace->m_DataSources.IsAliasExisted(Translator::QStr2UGStr(dataType)))
        {

        }
        else
        {
            loadTiandituMap(item);
            pEditorWnd->ViewEntire();
            pEditorWnd->Refresh();

        }
    }
    this->accept();
}


void LoadOnlineMapDialog::on_cancelBtn_clicked()
{
    this->close();
}