package com.qqchen.deploy.backend.framework.ssh;

import com.qqchen.deploy.backend.framework.dto.CommandResult;
import com.qqchen.deploy.backend.framework.dto.DiskInfo;
import com.qqchen.deploy.backend.framework.dto.DiskUsageInfo;
import com.qqchen.deploy.backend.framework.dto.MonitorData;
import com.qqchen.deploy.backend.framework.enums.OsTypeEnum;
import net.schmizz.sshj.SSHClient;

import java.math.BigDecimal;
import java.util.List;

/**
 * SSH命令服务接口（Framework层）
 * 封装了SSH连接和OS命令执行能力
 */
public interface ISSHCommandService {
    
    /**
     * 创建SSH连接
     * 
     * @param host IP地址
     * @param port SSH端口
     * @param username 用户名
     * @param password 密码（密码认证）
     * @param privateKey 私钥（密钥认证）
     * @param passphrase 私钥密码
     * @return SSH客户端
     * @throws Exception 连接失败时抛出
     */
    SSHClient createConnection(String host, Integer port, String username, 
                               String password, String privateKey, String passphrase) throws Exception;
    
    /**
     * 执行单个命令并返回结果（包含成功/失败状态）
     * 
     * @param sshClient SSH客户端
     * @param command 要执行的命令
     * @return 命令执行结果，包含成功/失败状态、输出和退出码
     * @throws Exception 连接异常时抛出
     */
    CommandResult executeCommand(SSHClient sshClient, String command) throws Exception;
    
    /**
     * 批量执行多个命令（性能优化：一次性执行多个命令，减少网络往返）
     * 每个命令独立执行，一个命令失败不影响其他命令
     * 
     * @param sshClient SSH客户端
     * @param commands 要执行的命令列表
     * @return 命令执行结果列表，顺序与输入commands对应，包含成功/失败状态和输出
     * @throws Exception 连接异常时抛出
     */
    List<CommandResult> executeCommands(SSHClient sshClient, List<String> commands) throws Exception;
    
    /**
     * 关闭SSH连接
     * 
     * @param sshClient SSH客户端
     */
    void closeConnection(SSHClient sshClient);
    
    /**
     * 获取主机名
     * 
     * @param sshClient SSH客户端
     * @return 主机名
     */
    String getHostname(SSHClient sshClient);
    
    /**
     * 获取操作系统版本
     * 
     * @param sshClient SSH客户端
     * @return 操作系统版本
     */
    String getOsVersion(SSHClient sshClient);
    
    /**
     * 获取CPU核心数
     * 
     * @param sshClient SSH客户端
     * @return CPU核心数
     */
    Integer getCpuCores(SSHClient sshClient);
    
    /**
     * 获取内存大小(GB)
     * 
     * @param sshClient SSH客户端
     * @return 内存大小
     */
    Integer getMemorySize(SSHClient sshClient);
    
    /**
     * 获取磁盘信息列表
     * 
     * @param sshClient SSH客户端
     * @return 磁盘信息列表
     */
    List<DiskInfo> getDiskInfo(SSHClient sshClient);
    
    /**
     * 获取CPU使用率(%)
     * 
     * @param sshClient SSH客户端
     * @return CPU使用率
     */
    BigDecimal getCpuUsage(SSHClient sshClient);
    
    /**
     * 获取内存使用率(%)
     * 
     * @param sshClient SSH客户端
     * @return 内存使用率
     */
    BigDecimal getMemoryUsage(SSHClient sshClient);
    
    /**
     * 获取各分区磁盘使用率
     * 
     * @param sshClient SSH客户端
     * @return 磁盘使用率列表
     */
    List<DiskUsageInfo> getDiskUsage(SSHClient sshClient);
    
    /**
     * 获取网络接收流量(KB/s)
     * 
     * @param sshClient SSH客户端
     * @return 网络接收流量，如果无法获取则返回null
     */
    Long getNetworkRx(SSHClient sshClient);
    
    /**
     * 获取网络发送流量(KB/s)
     * 
     * @param sshClient SSH客户端
     * @return 网络发送流量，如果无法获取则返回null
     */
    Long getNetworkTx(SSHClient sshClient);
    
    /**
     * 一次性采集所有监控数据（性能优化：批量执行命令，减少网络往返）
     * 每个OS实现类内部会使用 executeCommands 批量执行所有命令
     * 推荐在定时监控场景使用此方法，而不是分别调用单个方法
     * 
     * @param sshClient SSH客户端
     * @return 监控数据（包含CPU、内存、磁盘、网络）
     */
    MonitorData collectMonitorData(SSHClient sshClient);
    
    /**
     * 获取当前服务支持的操作系统类型
     * 
     * @return 操作系统类型
     */
    OsTypeEnum getSupportedOsType();
}
