#pragma once

#include <QString>
#include <QStandardPaths>
#include <QDir>

/**
 * @brief 网络配置管理类
 * 
 * 统一管理项目中所有的网络配置，包括：
 * - HTTP API 基础URL
 * - RTMP 推流服务器配置
 * - WebSocket 连接配置
 * - 其他网络相关配置
 */
class NetworkConfig
{
public:
    /**
     * @brief 网络服务器配置结构
     */
    struct ServerConfig {
        QString host = "127.0.0.1";           // 服务器主机地址
        int port = 8200;                      // 服务器端口
        bool useHttps = false;                // 是否使用HTTPS
        QString apiPath = "/api";              // API路径前缀
        
        QString getBaseUrl() const {
            QString protocol = useHttps ? "https" : "http";
            return QString("%1://%2:%3").arg(protocol, host).arg(port);
        }
        
        QString getWebSocketUrl() const {
            QString protocol = useHttps ? "wss" : "ws";
            return QString("%1://%2:%3").arg(protocol, host).arg(port);
        }
    };
    
    /**
     * @brief 流媒体协议枚举
     */
    enum class StreamProtocol {
        RTMP,       // Real-Time Messaging Protocol
        SRT,        // Secure Reliable Transport
        WebRTC,     // Web Real-Time Communication
        RTSP,       // Real Time Streaming Protocol
        UDP,        // User Datagram Protocol
        TCP         // Transmission Control Protocol
    };
    
    /**
     * @brief 通用流媒体配置结构
     */
    struct StreamConfig {
        StreamProtocol protocol = StreamProtocol::RTMP;  // 流媒体协议
        QString host = "127.0.0.1";                     // 服务器地址
        int port = 1935;                                // 端口
        QString app = "stream";                         // 应用名/路径
        QString streamKey = "V1";                       // 推流密钥/流名称
        
        QString getStreamUrl() const {
            switch (protocol) {
                case StreamProtocol::RTMP:
                    return QString("rtmp://%1:%2/%3/%4").arg(host).arg(port).arg(app).arg(streamKey);
                case StreamProtocol::SRT:
                    return QString("srt://%1:%2?streamid=%3/%4").arg(host).arg(port).arg(app).arg(streamKey);
                case StreamProtocol::RTSP:
                    return QString("rtsp://%1:%2/%3/%4").arg(host).arg(port).arg(app).arg(streamKey);
                case StreamProtocol::UDP:
                    return QString("udp://%1:%2").arg(host).arg(port);
                case StreamProtocol::TCP:
                    return QString("tcp://%1:%2").arg(host).arg(port);
                case StreamProtocol::WebRTC:
                    return QString("webrtc://%1:%2/%3/%4").arg(host).arg(port).arg(app).arg(streamKey);
                default:
                    return QString("rtmp://%1:%2/%3/%4").arg(host).arg(port).arg(app).arg(streamKey);
            }
        }
        
        // 保持向后兼容的RTMP方法
        QString getRtmpUrl() const {
            return QString("rtmp://%1:%2/%3/%4").arg(host).arg(port).arg(app).arg(streamKey);
        }
    };
    
    /**
     * @brief 录制配置结构
     */
    struct RecordConfig {
        QString outputDir;                    // 录制输出目录
        int videoBitRate = 8000000;          // 视频比特率 (8Mbps)
        int videoFrameRate = 30;             // 视频帧率
        int videoQuality = 100;              // 视频质量
        int audioBitRate = 128000;           // 音频比特率 (128kbps)
    };

public:
    /**
     * @brief 获取配置管理器单例
     */
    static NetworkConfig& instance();
    
    /**
     * @brief 重置为默认配置
     */
    void resetToDefaults();
    
    // 获取配置
    const ServerConfig& serverConfig() const { return m_serverConfig; }
    const StreamConfig& streamConfig() const { return m_streamConfig; }
    const RecordConfig& recordConfig() const { return m_recordConfig; }
    
    // 向后兼容的RTMP配置访问方法
    const StreamConfig& rtmpConfig() const { return m_streamConfig; }
    
    // 设置配置
    void setServerConfig(const ServerConfig& config);
    void setStreamConfig(const StreamConfig& config);
    void setRecordConfig(const RecordConfig& config);
    
    // 向后兼容的RTMP配置设置方法
    void setRtmpConfig(const StreamConfig& config);
    
    // 便捷方法
    QString getApiBaseUrl() const { return m_serverConfig.getBaseUrl(); }
    QString getWebSocketBaseUrl() const { return m_serverConfig.getWebSocketUrl(); }
    QString getStreamUrl() const { return m_streamConfig.getStreamUrl(); }
    
    // 向后兼容的RTMP方法
    QString getRtmpUrl(const QString& streamName = QString()) const;
    QString getRtmpStreamUrl() const;
    
    /**
     * @brief 检查网络配置是否有效
     */
    bool isValid() const;

private:
    NetworkConfig() = default;
    ~NetworkConfig() = default;
    NetworkConfig(const NetworkConfig&) = delete;
    NetworkConfig& operator=(const NetworkConfig&) = delete;
    
    /**
     * @brief 初始化默认配置
     */
    void initDefaults();

private:
    ServerConfig m_serverConfig;
    StreamConfig m_streamConfig;
    RecordConfig m_recordConfig;
};

// 便捷的全局访问宏
#define NetworkConfigInstance NetworkConfig::instance()