#ifndef AV_RECORDER_AUDIO_WIDGET_H
#define AV_RECORDER_AUDIO_WIDGET_H

#include <QWidget>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QProgressBar>
#include <QLabel>
#include <QPushButton>
#include <QSlider>
#include <QComboBox>
#include <QTimer>
#include <QMutex>
#include <QPainter>
#include <QStyleOption>
#include <QPropertyAnimation>
#include <QGraphicsOpacityEffect>
#include <memory>

/**
 * 音频电平显示组件
 * 
 * 显示实时音频电平，支持：
 * - 左右声道分别显示
 * - 峰值保持
 * - 过载指示
 * - 平滑动画
 */
class AudioLevelWidget : public QWidget {
    Q_OBJECT
    Q_PROPERTY(double leftLevel READ leftLevel WRITE setLeftLevel)
    Q_PROPERTY(double rightLevel READ rightLevel WRITE setRightLevel)

public:
    explicit AudioLevelWidget(QWidget* parent = nullptr);
    ~AudioLevelWidget();

    /**
     * 设置音频电平 (0.0 - 1.0)
     */
    void setLeftLevel(double level);
    void setRightLevel(double level);
    void setLevels(double left, double right);
    
    /**
     * 获取当前电平
     */
    double leftLevel() const { return m_leftLevel; }
    double rightLevel() const { return m_rightLevel; }
    
    /**
     * 设置峰值保持时间 (毫秒)
     */
    void setPeakHoldTime(int ms) { m_peakHoldTime = ms; }
    
    /**
     * 设置过载阈值 (0.0 - 1.0)
     */
    void setOverloadThreshold(double threshold) { m_overloadThreshold = threshold; }
    
    /**
     * 设置是否显示数值
     */
    void setShowValues(bool show) {
        m_showValues = show;
        update();
    }
    
    /**
     * 重置峰值
     */
    void resetPeaks();

protected:
    void paintEvent(QPaintEvent* event) override;
    QSize sizeHint() const override;
    QSize minimumSizeHint() const override;

private slots:
    void updatePeaks();

private:
    /**
     * 绘制单个声道
     */
    void drawChannel(QPainter& painter, const QRect& rect, 
                    double level, double peak, bool isLeft);
    
    /**
     * 获取电平颜色
     */
    QColor getLevelColor(double level) const;

private:
    double m_leftLevel;
    double m_rightLevel;
    double m_leftPeak;
    double m_rightPeak;
    qint64 m_leftPeakTime;
    qint64 m_rightPeakTime;
    
    int m_peakHoldTime;
    double m_overloadThreshold;
    bool m_showValues;
    
    QTimer* m_peakTimer;
    mutable QMutex m_mutex;
};

/**
 * 录制器音频控制组件
 * 
 * 提供音频相关的控制界面，包括：
 * - 音量控制
 * - 静音开关
 * - 音频电平显示
 * - 音频设备选择
 * - 音频格式信息
 */
class RecorderAudioWidget : public QWidget {
    Q_OBJECT

public:
    /**
     * 音频信息结构
     */
    struct AudioInfo {
        QString deviceName;
        int sampleRate = 44100;
        int channels = 2;
        int bitDepth = 16;
        QString format;
        bool isRecording = false;
        bool isMuted = false;
        double volume = 1.0;
        
        AudioInfo() = default;
    };

public:
    explicit RecorderAudioWidget(QWidget* parent = nullptr);
    ~RecorderAudioWidget();

    /**
     * 设置音频信息
     */
    void setAudioInfo(const AudioInfo& info);
    
    /**
     * 获取音频信息
     */
    AudioInfo audioInfo() const { return m_audioInfo; }
    
    /**
     * 设置音量 (0.0 - 1.0)
     */
    void setVolume(double volume);
    
    /**
     * 获取音量
     */
    double volume() const { return m_audioInfo.volume; }
    
    /**
     * 设置静音状态
     */
    void setMuted(bool muted);
    
    /**
     * 获取静音状态
     */
    bool isMuted() const { return m_audioInfo.isMuted; }
    
    /**
     * 设置录制状态
     */
    void setRecording(bool recording);
    
    /**
     * 获取录制状态
     */
    bool isRecording() const { return m_audioInfo.isRecording; }
    
    /**
     * 更新音频电平
     */
    void updateAudioLevels(double left, double right);
    
    /**
     * 设置可用音频设备列表
     */
    void setAvailableDevices(const QStringList& devices);
    
    /**
     * 设置当前音频设备
     */
    void setCurrentDevice(const QString& device);
    
    /**
     * 获取当前音频设备
     */
    QString currentDevice() const;
    
    /**
     * 设置是否显示高级控制
     */
    void setShowAdvancedControls(bool show);
    
    /**
     * 重置音频电平峰值
     */
    void resetAudioPeaks();

signals:
    /**
     * 音量改变信号
     */
    void volumeChanged(double volume);
    
    /**
     * 静音状态改变信号
     */
    void mutedChanged(bool muted);
    
    /**
     * 音频设备改变信号
     */
    void deviceChanged(const QString& device);
    
    /**
     * 音频设置改变信号
     */
    void audioSettingsRequested();

protected:
    void paintEvent(QPaintEvent* event) override;

private slots:
    void onVolumeSliderChanged(int value);
    void onMuteButtonClicked();
    void onDeviceComboChanged(const QString& device);
    void onSettingsButtonClicked();
    void updateVolumeAnimation();

private:
    /**
     * 初始化UI
     */
    void initializeUI();
    
    /**
     * 连接信号槽
     */
    void connectSignals();
    
    /**
     * 更新UI状态
     */
    void updateUI();
    
    /**
     * 更新音量显示
     */
    void updateVolumeDisplay();
    
    /**
     * 更新静音按钮
     */
    void updateMuteButton();
    
    /**
     * 更新设备信息
     */
    void updateDeviceInfo();
    
    /**
     * 格式化音频信息文本
     */
    QString formatAudioInfoText() const;

private:
    // UI组件
    QVBoxLayout* m_mainLayout;
    QHBoxLayout* m_controlLayout;
    QHBoxLayout* m_deviceLayout;
    QHBoxLayout* m_infoLayout;
    
    // 音量控制
    QLabel* m_volumeLabel;
    QSlider* m_volumeSlider;
    QLabel* m_volumeValueLabel;
    QPushButton* m_muteButton;
    
    // 音频电平
    AudioLevelWidget* m_levelWidget;
    
    // 设备选择
    QLabel* m_deviceLabel;
    QComboBox* m_deviceCombo;
    QPushButton* m_settingsButton;
    
    // 信息显示
    QLabel* m_statusLabel;
    
    // 数据
    AudioInfo m_audioInfo;
    
    // 动画
    QPropertyAnimation* m_volumeAnimation;
    QGraphicsOpacityEffect* m_levelOpacityEffect;
    
    // 状态
    bool m_showAdvancedControls;
    bool m_volumeChanging;
    
    // 线程安全
    mutable QMutex m_mutex;
};

#endif // AV_RECORDER_AUDIO_WIDGET_H