#pragma once

#include <QObject>
#include <QSerialPort>
#include <QString>
#include <cstddef>
#include <QByteArray>

#include "hardware/interfaces/IStreamDriver.h"

// 这里的串口的唯一标识是串口的端口名，如 /dev/ttyUSB0, can0, tcp://...
// 串口的endpoint是串口的端口名，如 /dev/ttyUSB0, can0, tcp://...
// 使用说明：
// 1. 创建一个SerialQtDriver对象
// 2. 调用Open方法打开串口
// 3. 调用Write方法写数据
// 4. 调用SetReadCallback方法设置读回调
// 5. 调用SetErrorCallback方法设置错误回调
// 6. 调用Close方法关闭串口
// 7. 调用SetBaudRate方法设置波特率
// 8. 调用SetDataBits方法设置数据位
// 9. 调用SetParity方法设置校验位
// 10. 调用SetStopBits方法设置停止位
// 11. 调用SetFlowControl方法设置流控制
// eg:
// SerialQtDriver driver;
// driver.Open("/dev/ttyUSB0");
// driver.Write({0x01, 0x02, 0x03});
// driver.SetReadCallback([](const std::vector<std::uint8_t>& data) {
//     std::cout << "read data: " << data << std::endl;
// });
// driver.SetErrorCallback([](const std::string& error) {
//     std::cout << "error: " << error << std::endl;    
// });
// driver.Close();  
// 12. 调用SetBaudRate方法设置波特率
// 13. 调用SetDataBits方法设置数据位
// 14. 调用SetParity方法设置校验位
// 15. 调用SetStopBits方法设置停止位
// 16. 调用SetFlowControl方法设置流控制
// eg:
// driver.SetBaudRate(QSerialPort::Baud115200);
// driver.SetDataBits(QSerialPort::Data8);
// driver.SetParity(QSerialPort::NoParity);
// driver.SetStopBits(QSerialPort::OneStop);
// driver.SetFlowControl(QSerialPort::NoFlowControl);
// driver.Close();

namespace softbus::hardware::drivers::serial
{

// 基于 Qt 的串口驱动实现：只负责串口 open/read/write，不包含设备注册、数据库或协议逻辑
class SerialQtDriver : public QObject, public softbus::hardware::interfaces::IStreamDriver
{
    Q_OBJECT

public:
    explicit SerialQtDriver(QObject* parent = nullptr);
    ~SerialQtDriver() override;
    
    bool Open(const std::string& endpoint) override;
    void Close() override;

    bool Write(const std::vector<std::uint8_t>& data) override;
    bool Write(const std::uint8_t* data, std::size_t size) override;

    void SetReadCallback(ReadCallback cb) override;
    void SetErrorCallback(ErrorCallback cb) override;

    // 允许上层配置串口参数（最小集合）
    void SetBaudRate(QSerialPort::BaudRate baud);
    void SetDataBits(QSerialPort::DataBits bits);
    void SetParity(QSerialPort::Parity parity);
    void SetStopBits(QSerialPort::StopBits stopBits);
    void SetFlowControl(QSerialPort::FlowControl flow);

private slots:
    void handleReadyRead();
    void handleError(QSerialPort::SerialPortError error);

private:
    bool openOnOwnerThread(const QString& endpoint);
    void closeOnOwnerThread();
    bool writeOnOwnerThread(const QByteArray& bytes);

private:
    QSerialPort   m_port;
    ReadCallback  m_readCallback;
    ErrorCallback m_errorCallback;
};

} // namespace softbus::hardware::drivers::serial

