import subprocess
from typing import Union, Tuple
from .system_utils import SystemUtils


class CommandUtils:
    """命令执行工具类"""

    @staticmethod
    def execute(command: Union[str, list], timeout: int = None) -> Tuple[int, str, str]:
        """
        执行系统命令并返回结果（兼容Windows/macOS/Linux）

        参数:
            command: 要执行的命令，可以是字符串或列表
            timeout: 超时时间（秒）

        返回:
            元组: (return_code, stdout, stderr)
        """
        # 预处理命令
        processed_cmd = CommandUtils._prepare_command(command)

        try:
            # 执行命令
            result = subprocess.run(
                processed_cmd,
                shell=isinstance(command, str),
                stdout=subprocess.PIPE,
                stderr=subprocess.PIPE,
                universal_newlines=True,
                timeout=timeout
            )
            return result.returncode, result.stdout, result.stderr
        except subprocess.TimeoutExpired:
            return -1, "", "Command timed out"
        except Exception as e:
            return -1, "", str(e)

    @staticmethod
    def _prepare_command(command: Union[str, list]) -> Union[str, list]:
        """预处理命令"""
        if SystemUtils.is_windows() and isinstance(command, str):
            return ['cmd', '/c'] + command.split()
        return command

    @staticmethod
    def execute_with_real_time_output(command: Union[str, list], timeout: int = None) -> int:
        """
        执行命令并实时输出（不捕获输出，直接打印到控制台）

        参数:
            command: 要执行的命令
            timeout: 超时时间（秒）

        返回:
            返回状态码
        """
        processed_cmd = CommandUtils._prepare_command(command)

        try:
            result = subprocess.run(
                processed_cmd,
                shell=isinstance(command, str),
                timeout=timeout
            )
            return result.returncode
        except subprocess.TimeoutExpired:
            return -1
        except Exception as e:
            return -1
