#!/usr/bin/env bash
# install_python312
# -----------------
# Instala Python 3.12 en Linux detectando la distribución automáticamente.
# - Ubuntu/Debian/Pop/Mint/Elementary: usa deadsnakes PPA
# - Fedora/RHEL/CentOS: usa dnf
# - Arch/Manjaro: usa pacman
# Instala también python3.12-venv, python3.12-dev y verifica pip.
#
# USO:
#   source install_python312.sh
#   install_python312

install_python312() {
    echo "Instalando Python 3.12..."
    echo ""

    # Detectar distribución
    local distro="unknown"
    if [[ -f /etc/os-release ]]; then
        # shellcheck disable=SC1091
        distro="$(. /etc/os-release && echo "${ID:-unknown}")"
        echo "Distribución detectada: ${distro}"
    else
        echo "install_python312: no se pudo detectar la distribución" >&2
    fi
    echo ""

    # Verificar si Python 3.12 ya está instalado
    if command -v python3.12 &>/dev/null; then
        local current_version
        current_version="$(python3.12 --version 2>&1)"
        echo "Python 3.12 ya está instalado: ${current_version}"
        return 0
    fi

    case "$distro" in
        ubuntu|debian|pop|mint|elementary)
            echo "Instalando Python 3.12 usando deadsnakes PPA..."
            echo ""

            echo "Actualizando repositorios..."
            if ! sudo apt update; then
                echo "install_python312: falló la actualización de repositorios" >&2
                return 1
            fi

            echo "Verificando software-properties-common..."
            if ! dpkg -l 2>/dev/null | grep -q software-properties-common; then
                if ! sudo apt install -y software-properties-common; then
                    echo "install_python312: falló la instalación de software-properties-common" >&2
                    return 1
                fi
            fi

            echo "Añadiendo deadsnakes PPA..."
            if ! sudo add-apt-repository -y ppa:deadsnakes/ppa; then
                echo "install_python312: falló al añadir deadsnakes PPA" >&2
                return 1
            fi

            echo "Actualizando lista de paquetes..."
            if ! sudo apt update; then
                echo "install_python312: falló la actualización después de añadir PPA" >&2
                return 1
            fi

            echo "Instalando Python 3.12 y herramientas..."
            if ! sudo apt install -y python3.12 python3.12-venv python3.12-dev python3-pip; then
                echo "install_python312: falló la instalación de Python 3.12" >&2
                return 1
            fi
            ;;

        fedora|rhel|centos)
            echo "Instalando Python 3.12 usando dnf..."
            if ! sudo dnf install -y python3.12 python3.12-devel; then
                echo "install_python312: falló la instalación con dnf" >&2
                return 1
            fi
            ;;

        arch|manjaro)
            echo "Instalando Python 3.12 usando pacman..."
            if ! sudo pacman -S --noconfirm python; then
                echo "install_python312: falló la instalación con pacman" >&2
                return 1
            fi
            ;;

        *)
            echo "install_python312: distribución no soportada automáticamente: ${distro}" >&2
            echo "  Opciones manuales:" >&2
            echo "    - Compilar desde fuente: https://www.python.org/downloads/" >&2
            echo "    - Usar pyenv: curl https://pyenv.run | bash" >&2
            return 1
            ;;
    esac

    echo ""

    # Verificar instalación
    if ! command -v python3.12 &>/dev/null; then
        echo "install_python312: Python 3.12 no está disponible después de la instalación" >&2
        echo "  Puede que necesites reiniciar la terminal" >&2
        return 1
    fi

    local installed_version
    installed_version="$(python3.12 --version 2>&1)"
    echo "Python 3.12 instalado correctamente: ${installed_version}"
    echo ""

    # Verificar pip
    echo "Verificando pip para Python 3.12..."
    if ! python3.12 -m pip --version &>/dev/null; then
        echo "pip no disponible, instalando..."
        if ! python3.12 -m ensurepip --upgrade; then
            echo "  Instala pip manualmente: curl -sS https://bootstrap.pypa.io/get-pip.py | python3.12"
        else
            echo "pip instalado para Python 3.12"
        fi
    else
        echo "pip disponible para Python 3.12"
    fi

    echo ""
    echo "Comandos útiles:"
    echo "  python3.12 -m venv .venv   - Crear entorno virtual"
    echo "  source .venv/bin/activate  - Activar entorno"
}

# Ejecutar si se invoca directamente
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
    install_python312 "$@"
fi
