#ifndef SSHMANAGER_H
#define SSHMANAGER_H

// 如果libssh2版本 < 1.9.0 在包含头文件之前添加：
#define LIBSSH2_CHANNEL_EXTENDED_DATA_DEFAULT 0
#define LIBSSH2_CHANNEL_EXTENDED_DATA_IGNORE  1
#define LIBSSH2_CHANNEL_EXTENDED_DATA_MERGE   2

#include <QObject>
#include <QString>
#include <QTimer>
#include <QProcess>
#include <QTcpSocket>
#include "libssh2.h"
#include <libssh2_sftp.h>
#include <QJsonDocument>
#include <QtNetwork>
#include <QJsonObject>
#include <QJsonArray>
#include <QString>
#include <QFile>
#include <QRegularExpression>
#include <QSocketNotifier>

class SSHManager : public QObject {
    Q_OBJECT
    Q_DISABLE_COPY(SSHManager)  // 禁止拷贝

public:
    static SSHManager* instance();  // 单例访问方法
    //判断是否连接了服务器
    bool isConnected();
    //重连
    void reconnect();
    //连接至服务器
    Q_INVOKABLE void connectAndStartShell(const QString& ip,
                              const QString& port,
                              const QString& username,
                              const QString& password);
    //写入控制台内容
    Q_INVOKABLE void sendInput(const QString &input);
    //断开连接
    Q_INVOKABLE void disconnectFromServer();

public:
    // 新增枚举类型
    enum ConnectionStep {
        CONNECTION_STARTUP,
        AUTHENTICATION,
        CHANNEL_CREATION,
        PTY_SETUP,
        SHELL_START
    };
    // 新增成员变量
    ConnectionStep m_connectionStep;
    QSocketNotifier* m_notifier = nullptr;

    // 新增成员函数声明
    void handleConnected();
    void trySessionStartup();
    void tryAuthentication();
    void tryChannelCreation();
    void tryPtySetup();
    void tryShellStart();
    void setupSocketNotifier();
    void handleNextStep();
    void cleanup();
    void readShellOutput();
signals :
                                          // 连接成功
    void connectionSuccess();
    // 连接失败
    void connectionFailed(const QString &error);
    // 状态消息
    void statusMessage(const QString &message);
    // 断开连接
    void disconnected();
    //执行命令输出信号
    void shellOutput(const QString &data); // 实时输出信号

private:
    explicit SSHManager(QObject *parent = nullptr);  // 私有构造函数
    ~SSHManager();  // 私有析构函数


    QString Myip,Myport,Myuser,Mypass;

    static SSHManager* m_instance;  // 单例实例指针
    LIBSSH2_SESSION *m_session = nullptr;
    LIBSSH2_CHANNEL *m_channel = nullptr;
    int m_sock = -1;
    QTcpSocket *m_socket;

    // 添加成员变量
    int m_timeout = 30000; // 命令执行超时时间（毫秒）
    // 新增发送相关成员变量
    QByteArray m_writeBuffer;
    qint64 m_writeOffset = 0;
    void trySendData();  // 新增发送尝试方法
};

#endif // SSHMANAGER_H
