#include "injurydisiplayui.h"
#include "ui_injurydisiplayui.h"
#include "InjuryDatabase.h"
#include "guidingui.h"
#include <QWebEngineView>
#include <QString>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QPushButton>
#include <QDir>
#include <QUrl>
#include <QWebEnginePage>
#include <QTimer>
#include <QMessageBox>
#include <QWebChannel>
#include <QWebEngineScript>
#include <QDebug>

InjuryDisiplayUI::InjuryDisiplayUI(QWidget *parent)
    : QDialog(parent)
    , ui(new Ui::InjuryDisiplayUI)
{
    ui->setupUi(this);
    setWindowTitle("伤员位置显示");

    // 创建QWebEngineView实例
    QWebEngineView *view = new QWebEngineView(this);
    view->setMinimumSize(800, 600);

    // 设置HTML文件的路径，这里使用资源文件系统
    QUrl url = QUrl("qrc:/html/res/html/map.html");
    view->load(url);

    // 创建刷新按钮
    QPushButton *refreshButton = new QPushButton("立即刷新标记", this);
    
    // 连接refreshButton的点击信号到lambda函数
    connect(refreshButton, &QPushButton::clicked, [this, view]() {
        // 清除所有标记
        view->page()->runJavaScript("clearAllMarkers();", [](const QVariant &result) {
            qDebug() << "手动刷新 - 清除标记结果:" << result.toString();
        });
        
        // 添加调试信息按钮
        view->page()->runJavaScript("logAllMarkers();", [](const QVariant &result) {
            qDebug() << "标记信息:" << result.toString();
        });
        
        // 重新加载所有标记
        loadInjuryMarkers(view);
        
        QMessageBox::information(this, "刷新完成", "地图标记已刷新");
    });

    // 连接loadFinished信号来确认页面是否加载成功，并在加载成功后调用addMarker函数
    connect(view, &QWebEngineView::loadFinished, [this, view]() {
        qDebug() << "地图页面加载完成，准备添加标记";
        
        // 检查数据库连接
        InjuryDatabase checkDb;
        QList<Injury> testResult;
        bool dbOk = checkDb.select_all(testResult);
        
        if (!dbOk) {
            QMessageBox::warning(this, "数据库错误", "无法连接到伤员数据库，标记可能无法显示");
        } else {
            qDebug() << "数据库连接成功，找到" << testResult.length() << "条伤员记录";
        }
        
        // 加载所有伤员标记
        loadInjuryMarkers(view);

        // 添加与JavaScript的通信桥接，用于响应标记点击事件
        view->page()->runJavaScript(
            "function setupMarkerClickListener(markerId, injuryId, level) {"
            "  var marker = markersMap[markerId];"
            "  if (marker) {"
            "    marker.on('click', function() {"
            "      var position = marker.getPosition();"
            "      showInjuryInfo(injuryId, level, position);"
            "    });"
            "  }"
            "}"
        );
        
        // 测试JS调用
        view->page()->runJavaScript("logAllMarkers();", [](const QVariant &result) {
            qDebug() << "初始标记数量:" << result.toString();
        });
    });

    // 创建布局并添加QWebEngineView
    QVBoxLayout *layout = new QVBoxLayout(this);
    layout->addWidget(view);
    
    // 添加刷新按钮到底部
    QHBoxLayout *buttonLayout = new QHBoxLayout();
    buttonLayout->addStretch();
    buttonLayout->addWidget(refreshButton);
    layout->addLayout(buttonLayout);

    // 设置布局
    setLayout(layout);

    // 创建定时器，定期刷新地图上的标记
    QTimer *refreshTimer = new QTimer(this);
    connect(refreshTimer, &QTimer::timeout, [this, view]() {
        // 清除所有标记，注意这里使用clearAllMarkers而不是clearMarkers
        view->page()->runJavaScript("clearAllMarkers();", [](const QVariant &result) {
            // 输出JavaScript执行结果，帮助调试
            qDebug() << "定时刷新 - 清除标记结果:" << result.toString();
        });
        
        // 重新加载所有标记
        loadInjuryMarkers(view);
    });
    // 每30秒刷新一次标记
    refreshTimer->start(30000);

    // 显示初始化成功消息
    QMessageBox::information(this, "提示", "已在地图上标记所有伤员位置");
}

// 加载所有伤员标记到地图上
void InjuryDisiplayUI::loadInjuryMarkers(QWebEngineView *view)
{
    QList<Injury> result;
    InjuryDatabase injuryinfo;
    injuryinfo.select_all(result);
    
    // 输出调试信息
    qDebug() << "加载伤员标记，总数:" << result.length();
    
    for(int i=0; i<result.length(); i++)
    {
        double latitude = result[i].lat;
        double longitude = result[i].lon;
        int level = result[i].rank;
        QString injuryId = result[i].id;
        
        // 输出每个伤员的信息
        qDebug() << "标记伤员:" << injuryId << ", 位置:" << latitude << "," << longitude << ", 等级:" << level;
        
        // 获取伤情等级的中文描述
        QString levelDesc;
        switch(level) {
            case 0: levelDesc = "轻微"; break;
            case 1: levelDesc = "一般"; break;
            case 2: levelDesc = "严重"; break;
            default: levelDesc = "未知";
        }
        
        // 调用JavaScript函数，传递参数
        QString js = QString("var markerId = addMarker(%1, %2, %3); setupMarkerClickListener(markerId, '%4', '%5');")
                        .arg(latitude)
                        .arg(longitude)
                        .arg(level)
                        .arg(injuryId)
                        .arg(levelDesc);
                        
        view->page()->runJavaScript(js, [injuryId](const QVariant &result) {
            // 输出JavaScript执行结果
            qDebug() << "添加标记" << injuryId << "结果:" << result.toString();
        });
    }
    
    // 设置地图中心为第一个伤员的位置（如果有伤员）
    if (!result.isEmpty()) {
        QString centerJS = QString("map.setCenter([%1, %2]); map.setZoom(15);")
                            .arg(result[0].lon)
                            .arg(result[0].lat);
        view->page()->runJavaScript(centerJS);
        qDebug() << "设置地图中心到:" << result[0].lon << "," << result[0].lat;
    } else {
        qDebug() << "没有找到伤员记录，不更新地图中心";
    }
}

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