#ifndef __AUDIO_H__
#define __AUDIO_H__

#include <QObject>
#include <QDBusContext>
#include <QDBusConnection>
#include <QDBusConnectionInterface>
#include <QDBusInterface>
#include <QDBusPendingCall>
#include <QDBusReply>
#include <QDebug>
#include <QString>
#include <QDebug>

class Audio : public QObject, QDBusContext
{
    Q_OBJECT
    Q_CLASSINFO("D-Bus Interface", "org.ukui.Framework.Devices.Audio")

    Q_PROPERTY(int SinkVolume READ GetSinkVolume WRITE SetSinkVolume NOTIFY SinkVolumeChanged)
    Q_PROPERTY(bool SinkMute READ GetSinkMute WRITE SetSinkMute NOTIFY SinkMuteChanged)
    Q_PROPERTY(QString SinkDevice READ GetSinkDevice WRITE SetSinkDevice NOTIFY SinkDeviceChanged)

    Q_PROPERTY(int SourceVolume READ GetSourceVolume WRITE SetSourceVolume NOTIFY SourceVolumeChanged)
    Q_PROPERTY(bool SourceMute READ GetSourceMute WRITE SetSourceMute NOTIFY SourceMuteChanged)
    Q_PROPERTY(QString SourceDevice READ GetSourceDevice WRITE SetSourceDevice NOTIFY SourceDeviceChanged)

public:
    explicit Audio(QObject *parent = nullptr);
    ~Audio();

    /**
     * @brief initSignals 初始化dbus信号连接
     */
    void initSignals();

public slots:
    /**
     * @brief GetSinkVolume 获取系统输出设备的音量属性值
     * @return  音量值，范围0~100
     */
    int GetSinkVolume();

    /**
     * @brief GetSinkMute 获取系统输出设备的静音状态属性值
     * @return  true：静音，false：未静音
     */
    bool GetSinkMute();

    /**
     * @brief GetSinkDevice 获取系统输出设备的设备名属性值
     * @return  系统输出设备的设备名属性值
     */
    QString GetSinkDevice();

    /**
     * @brief GetSourceVolume 获取系统输入设备的音量属性值
     * @return  音量值，范围0~100
     */
    int GetSourceVolume();

    /**
     * @brief GetSourceMute 获取系统输入设备的静音状态属性值
     * @return  true：静音，false：未静音
     */
    bool GetSourceMute();

    /**
     * @brief GetSourceDevice 获取系统输入设备的设备名属性值
     * @return  系统输入设备的设备名属性值
     */
    QString GetSourceDevice();



    /**
     * @brief SetSinkVolume 设置系统输出设备音量
     * @param volume 音量值，范围0~100
     * @return 是否操作成功 true为成功 false为失败
     */
    bool SetSinkVolume(int volume);

    /**
     * @brief SetSinkMute 设置系统输出设备静音状态
     * @param mute 静音状态，true为静音，false为取消静音
     * @return 是否操作成功 true为成功 false为失败
     */
    bool SetSinkMute(bool mute);

    /**
     * @brief SetSinkDevice 设置系统输出设备
     * @param device 输出设备的名称
     * @return 是否操作成功 true为成功 false为失败
     */
    bool SetSinkDevice(QString device);

    /**
     * @brief SetSourceVolume 设置系统输入设备音量
     * @param volume 音量值，范围0~100
     * @return 是否操作成功 true为成功 false为失败
     */
    bool SetSourceVolume(int volume);

    /**
     * @brief SetSourceMute 设置系统输入设备静音状态
     * @param mute 静音状态，true为静音，false为取消静音
     * @return 是否操作成功 true为成功 false为失败
     */
    bool SetSourceMute(bool mute);

    /**
     * @brief SetSourceDevice 设置系统输入设备
     * @param device 输入设备的名称
     * @return 是否操作成功 true为成功 false为失败
     */
    bool SetSourceDevice(QString device);

private:
    QDBusMessage callMedia(const QString &method,
                              const QVariant &arg1 = QVariant(),
                              const QVariant &arg2 = QVariant());

signals:
    /**
     * @brief sinkVolumeChanged 系统输出设备音量改变信号
     * @param volume 音量值，范围0~65536,使用(volume / 65536.0 * 100.0) + 0.5转换为范围0~100
     */
    void SinkVolumeChanged(int volume);

    /**
     * @brief sinkMuteChanged 系统输出设备静音状态改变信号
     * @param mute 静音状态，true为静音，false为取消静音
     */
    void SinkMuteChanged(bool mute);

    /**
     * @brief sinkDeviceChanged 系统输出设备改变信号
     * @param device 输出设备的名称
     */
    void SinkDeviceChanged(QString device);

    /**
     * @brief sourceVolumeChanged 系统输入设备音量改变信号
     * @param volume 音量值，范围0~65536,使用(volume / 65536.0 * 100.0) + 0.5转换为范围0~100
     */
    void SourceVolumeChanged(int volume);

    /**
     * @brief sourceMuteChanged 系统输入设备静音状态改变信号
     * @param mute 静音状态，true为静音，false为取消静音
     */
    void SourceMuteChanged(bool mute);

    /**
     * @brief sourceDeviceChanged 系统输入设备改变信号
     * @param device 输入设备的名称
     */
    void SourceDeviceChanged(QString device);

private:
    int sinkVolume;
    bool sinkMute;
    QString sinkDevice;

    int sourceVolume;
    bool sourceMute;
    QString sourceDevice;
};

#endif   /* __AUDIO_H__ */
