/**
 * @file MainWindow.h
 * @brief SkyLink Qt 地面站 - 主窗口头文件
 * 
 * 用户界面入口，负责显示实时视频、GPS 位置、统计信息等。
 * 
 * @author flowzl
 * @date 2026-01-19
 */

#pragma once

#include <QMainWindow>
#include <QLabel>
#include <QPushButton>
#include <QTcpSocket>
#include <QUdpSocket>
#include <QTimer>
#include <QImage>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include "DeviceInfo.h"
#include "DeviceInfoReceiver.h"
#include <memory>

class GroundReceiver;
class DataLogger;

/**
 * @class MainWindow
 * @brief 主窗口类
 */
class MainWindow : public QMainWindow {
    Q_OBJECT

public:
    /**
     * @brief 构造函数
     * @param parent 父窗口指针
     */
    explicit MainWindow(QWidget* parent = nullptr);
    
    /**
     * @brief 析构函数
     */
    ~MainWindow();

private slots:
    /**
     * @brief 处理接收到的完整帧
     */
    void on_frame_received(const QImage& img, double lat, double lon, double alt, uint32_t photo_number);
    
    /**
     * @brief 处理统计信息更新
     */
    void on_stats_updated(int fps, int kbs);
    
    /**
     * @brief 保存当前帧按钮点击
     */
    void on_save_frame_clicked();
    
    /**
     * @brief 启动/停止录制按钮点击
     */
    void on_record_toggled(bool checked);
    
    /**
     * @brief 设置按钮点击
     */
    void on_settings_clicked();
    
    /**
     * @brief 触发拍照按钮点击
     */
    void on_trigger_capture_clicked();

    /**
     * @brief 收到设备信息
     */
    void on_device_info_received(const DeviceInfo& info);

private:
    // ========================================================================
    // UI 组件
    // ========================================================================
    
    QLabel* video_label_;            ///< 视频显示标签
    QLabel* stats_label_;            ///< 统计信息标签
    QLabel* gps_label_;              ///< GPS 信息标签
    QLabel* device_info_label_;      ///< 设备信息标签
    
    QPushButton* save_frame_btn_;    ///< 保存帧按钮
    QPushButton* record_btn_;        ///< 录制按钮
    QPushButton* settings_btn_;      ///< 设置按钮
    QPushButton* trigger_capture_btn_;  ///< 触发拍照按钮
    
    // ========================================================================
    // 业务逻辑对象
    // ========================================================================
    
    std::shared_ptr<GroundReceiver> receiver_;  ///< UDP 接收器
    std::shared_ptr<DeviceInfoReceiver> device_info_receiver_; ///< 设备信息接收器
    std::shared_ptr<DataLogger> logger_;        ///< 数据记录器
    QNetworkAccessManager* network_manager_;     ///< HTTP 网络管理器
    
    // ========================================================================
    // 状态变量
    // ========================================================================
    
    QImage current_image_;           ///< 当前显示的图像
    double current_lat_ = 0.0;      ///< 当前纬度
    double current_lon_ = 0.0;      ///< 当前经度
    double current_alt_ = 0.0;      ///< 当前海拔
    bool is_recording_ = false;     ///< 是否正在录制
    uint32_t total_photos_received_ = 0;  ///< 接收到的总照片数
    uint32_t current_photo_number_ = 0;   ///< 当前照片编号
    QString ros2_node_ip_ = "localhost";  ///< ROS2 节点 IP 地址
    int ros2_http_port_ = 8080;           ///< ROS2 HTTP API 端口
    
    // ========================================================================
    // 初始化函数
    // ========================================================================
    
    /**
     * @brief 初始化 UI
     */
    void init_ui();
    
    /**
     * @brief 初始化连接
     */
    void init_connections();
    
    /**
     * @brief 创建菜单栏
     */
    void create_menus();
    
    /**
     * @brief 通过 HTTP 触发拍照
     * @param duration 总时间（秒）
     * @param count 拍照数量
     * @param interval 时间间隔（秒）
     * @param mode 传输模式（0=原图，1=缩略图）
     */
    void triggerCaptureViaHttp(double duration, int count, double interval, int mode);
    
    /**
     * @brief HTTP 请求响应处理
     * @param reply 网络响应
     */
    void onHttpReply(QNetworkReply* reply);
};
