/**
 * @file SystemLogger.h
 * @brief 系统日志管理器单例类头文件
 * @author Qt UI Developer Expert  
 * @date 2024-12-21
 * @version 1.0
 */

#ifndef SYSTEM_LOGGER_H
#define SYSTEM_LOGGER_H

#include <QObject>
#include <QString>
#include <QMutex>
#include <QDateTime>
#include <QDebug>

/**
 * @class SystemLogger
 * @brief 系统日志管理器单例类
 * 
 * SystemLogger是战场探索系统的核心日志管理组件，采用单例模式设计，
 * 负责统一管理和分发系统中的各种日志信息。
 * 
 * 主要功能：
 * - 多级别日志记录（Debug, Info, Warning, Error, Success）
 * - 线程安全的日志记录
 * - 信号机制实时通知UI组件
 * - 统一的日志接口，便于系统各模块调用
 * 
 * 使用方式：
 * @code
 * SystemLogger::getInstance()->logInfo("设备连接成功");
 * SystemLogger::getInstance()->logError("数据库连接失败");
 * @endcode
 */
class SystemLogger : public QObject
{
    Q_OBJECT

public:
    /**
     * @brief 日志级别枚举
     */
    enum LogLevel {
        Debug = 0,    ///< 调试信息 - 开发阶段使用
        Info = 1,     ///< 一般信息 - 正常操作记录
        Warning = 2,  ///< 警告信息 - 需要注意的情况
        Error = 3,    ///< 错误信息 - 系统错误和异常
        Success = 4   ///< 成功信息 - 重要操作成功完成
    };

    /**
     * @brief 获取单例实例
     * @return SystemLogger单例指针
     */
    static SystemLogger* getInstance();

    /**
     * @brief 销毁单例实例
     * 通常在应用程序退出时调用
     */
    static void destroyInstance();

    /**
     * @brief 记录调试信息
     * @param message 日志消息内容
     */
    void logDebug(const QString &message);

    /**
     * @brief 记录一般信息
     * @param message 日志消息内容
     */
    void logInfo(const QString &message);

    /**
     * @brief 记录警告信息
     * @param message 日志消息内容
     */
    void logWarning(const QString &message);

    /**
     * @brief 记录错误信息
     * @param message 日志消息内容
     */
    void logError(const QString &message);

    /**
     * @brief 记录成功信息
     * @param message 日志消息内容
     */
    void logSuccess(const QString &message);

    /**
     * @brief 通用日志记录方法
     * @param level 日志级别
     * @param message 日志消息内容
     */
    void log(LogLevel level, const QString &message);

    /**
     * @brief 设置是否启用控制台输出
     * @param enabled true为启用，false为禁用
     */
    void setConsoleOutputEnabled(bool enabled);

    /**
     * @brief 获取级别名称字符串
     * @param level 日志级别
     * @return 级别名称
     */
    static QString getLevelString(LogLevel level);

signals:
    /**
     * @brief 日志添加信号
     * @param level 日志级别
     * @param message 日志消息内容
     * 
     * 当有新日志记录时发出此信号，UI组件可以连接此信号来实时更新显示
     */
    void logAdded(LogLevel level, const QString &message);

private:
    /**
     * @brief 私有构造函数（单例模式）
     * @param parent 父对象指针
     */
    explicit SystemLogger(QObject *parent = nullptr);

    /**
     * @brief 私有析构函数（单例模式）
     */
    ~SystemLogger();

    /**
     * @brief 禁用拷贝构造函数
     */
    SystemLogger(const SystemLogger&) = delete;

    /**
     * @brief 禁用赋值运算符
     */
    SystemLogger& operator=(const SystemLogger&) = delete;

    /**
     * @brief 内部日志记录实现
     * @param level 日志级别
     * @param message 日志消息内容
     */
    void logInternal(LogLevel level, const QString &message);

    /**
     * @brief 输出到控制台
     * @param level 日志级别
     * @param message 日志消息内容
     */
    void outputToConsole(LogLevel level, const QString &message);

private:
    static SystemLogger *s_instance;    ///< 单例实例指针
    static QMutex s_mutex;             ///< 线程安全互斥锁

    bool m_consoleOutputEnabled;        ///< 是否启用控制台输出
    QMutex m_logMutex;                 ///< 日志记录互斥锁
};

/**
 * @brief 便捷宏定义，简化日志调用
 */
#define LOG_DEBUG(msg)   SystemLogger::getInstance()->logDebug(msg)
#define LOG_INFO(msg)    SystemLogger::getInstance()->logInfo(msg)
#define LOG_WARNING(msg) SystemLogger::getInstance()->logWarning(msg)
#define LOG_ERROR(msg)   SystemLogger::getInstance()->logError(msg)
#define LOG_SUCCESS(msg) SystemLogger::getInstance()->logSuccess(msg)

#endif // SYSTEM_LOGGER_H