#pragma once

#include <QApplication>
#include <memory>

namespace impress {

class ConfigManager;
class SenseVoiceEngine;

/**
 * @brief 应用入口封装
 *
 * 管理全局共享组件：配置管理器、STT 引擎。
 * STT 引擎在启动时异步加载模型，所有页面和服务共享同一实例。
 */
class Application : public QApplication {
    Q_OBJECT
public:
    Application(int& argc, char** argv);
    ~Application() override;

    /** @brief 获取全局配置管理器 */
    ConfigManager* configManager() const;

    /** @brief 获取全局 STT 引擎（共享实例） */
    SenseVoiceEngine* sttEngine() const;

    /** @brief 获取当前模型路径 */
    QString modelPath() const { return modelPath_; }

    /** @brief 获取全局 STT 引擎加载状态 */
    bool isModelLoaded() const;

    /** @brief 加载全局模型（在配置加载后手动调用） */
    void loadGlobalModel();

    /** @brief 应用主题（light/dark），可在运行时调用 */
    static void applyTheme(const QString& theme);

    /** @brief 应用全局字体大小 */
    static void applyFontSize(int size);

    /** @brief 生成托盘图标（light=黑色，dark=白色） */
    static QIcon createTrayIcon(bool active);

    /** @brief 当前主题是否为 dark */
    static bool isDarkTheme();

signals:
    /** @brief 模型加载中（带路径） */
    void modelLoading(const QString& modelPath);

    /** @brief 模型加载完成（带路径） */
    void modelLoaded(const QString& modelPath);

    /** @brief 模型加载失败 */
    void modelLoadError(const QString& error);

private:
    std::unique_ptr<ConfigManager> configManager_;
    SenseVoiceEngine* sttEngine_ = nullptr;
    QString modelPath_;
    bool modelLoaded_ = false;
};

} // namespace impress
