import shutil

# Lista completa de las dependencias de línea de comandos requeridas
REQUIRED_TOOLS = [
    "nmap",
    "whois",
    "dig",
    "nikto",
    "gobuster",
    "sqlmap",
    "theharvester",
    "sherlock",
    "metagoofil",
    "exiftool",
    "binwalk",
    "strings",
    "msfvenom",
    "john",
    "hydra",
    "aircrack-ng",
    "tshark",
    "ettercap",
    "torsocks",
    "proxychains"
]

# Mapeo de herramientas a sus paquetes de instalación en sistemas basados en APT (Debian/Ubuntu/Kali)
# Esto es una ayuda, los nombres de los paquetes pueden variar.
APT_PACKAGES = {
    "nmap": "nmap",
    "whois": "whois",
    "dig": "dnsutils",
    "nikto": "nikto",
    "gobuster": "gobuster",
    "sqlmap": "sqlmap",
    "theharvester": "theharvester",
    "sherlock": "sherlock", # A menudo se instala con pip: python3-sherlock
    "metagoofil": "metagoofil",
    "exiftool": "libimage-exiftool-perl",
    "binwalk": "binwalk",
    "strings": "binutils",
    "msfvenom": "metasploit-framework",
    "john": "john",
    "hydra": "hydra",
    "aircrack-ng": "aircrack-ng",
    "tshark": "tshark",
    "ettercap": "ettercap-graphical", # o ettercap-common
    "torsocks": "torsocks",
    "proxychains": "proxychains4"
}

def _is_sudo_required(tool_path):
    """
    Heurística simple para determinar si una herramienta típicamente requiere sudo
    basándose en su ruta de instalación.
    """
    if tool_path and (tool_path.startswith("/usr/sbin/") or tool_path.startswith("/sbin/") or tool_path.startswith("/usr/local/sbin/")):
        return True
    return False

def check_dependencies():
    """
    Verifica qué herramientas de la lista REQUIRED_TOOLS no están instaladas
    y si su ejecución suele requerir sudo.

    Returns:
        list: Una lista de tuplas (nombre_herramienta, requiere_sudo) para las herramientas que faltan.
    """
    missing = []
    for tool in REQUIRED_TOOLS:
        tool_path = shutil.which(tool)
        if tool_path is None:
            # Si no se encuentra, asumimos que puede requerir sudo si su nombre
            # coincide con herramientas que comúnmente están en sbin
            requires_sudo = False
            # Esta es una heurística y podría no ser 100% precisa
            if tool in ["nmap", "tshark", "hping3", "aircrack-ng", "ettercap"]: 
                requires_sudo = True 
            missing.append((tool, requires_sudo))
    return missing

def get_install_commands(missing_tools):
    """
    Genera los comandos de instalación sugeridos para una lista de herramientas faltantes.

    Args:
        missing_tools (list): Lista de tuplas (nombre_herramienta, requiere_sudo).

    Returns:
        dict: Un diccionario con la herramienta como clave y el comando de instalación como valor.
    """
    commands = {}
    for tool, requires_sudo in missing_tools:
        package = APT_PACKAGES.get(tool)
        if package:
            # Comando específico para Sherlock que a menudo es con pip
            if tool == "sherlock":
                commands[tool] = "sudo apt install sherlock -y  /  pip3 install sherlock"
            else:
                commands[tool] = f"sudo apt update && sudo apt install {package} -y"
        else:
            commands[tool] = "Instalación manual requerida. Busca la documentación oficial."
    return commands

if __name__ == '__main__':
    # ---- Ejemplo de uso ----
    print("Verificando dependencias...")
    missing_deps_info = check_dependencies()

    if not missing_deps_info:
        print("¡Excelente! Todas las dependencias están instaladas.")
    else:
        print("\nADVERTENCIA: Faltan las siguientes dependencias:")
        for dep, requires_sudo in missing_deps_info:
            sudo_msg = " (puede requerir sudo para ejecutar)" if requires_sudo else ""
            print(f"- {dep}{sudo_msg}")

        print("\nPara instalarlas en un sistema basado en Debian/Ubuntu, puedes usar los siguientes comandos:")
        missing_tool_names = [dep[0] for dep in missing_deps_info] # Extract just names for install commands
        install_cmds = get_install_commands(missing_deps_info) # Pass the full info for potential future use
        for tool, command in install_cmds.items():
            print(f"- {tool}: {command}")
