#!/usr/bin/env bash
# install_go
# ----------
# Instala Go en Linux. Detecta arquitectura automáticamente (amd64/arm64/armv6l).
# Descarga desde go.dev/dl, instala en /usr/local y configura PATH en el shell config.
#
# USO:
#   source install_go.sh
#   install_go [version] [--force]
#
# ARGUMENTOS:
#   version   Versión de Go a instalar (default: 1.22.0)
#   --force   Reinstala aunque Go ya esté instalado

install_go() {
    local version="1.22.0"
    local force=false

    for arg in "$@"; do
        case "$arg" in
            --force) force=true ;;
            *)       [[ "$arg" =~ ^[0-9] ]] && version="$arg" ;;
        esac
    done

    local go_os="linux"
    local go_arch

    # Detectar arquitectura
    local arch
    arch="$(uname -m)"
    case "$arch" in
        x86_64)        go_arch="amd64" ;;
        aarch64|arm64) go_arch="arm64" ;;
        armv6l)        go_arch="armv6l" ;;
        *)
            echo "install_go: arquitectura no soportada: ${arch}" >&2
            return 1
            ;;
    esac

    # Verificar si ya está instalado
    if command -v go &>/dev/null && [[ "$force" != true ]]; then
        local current_version
        current_version="$(go version | awk '{print $3}' | sed 's/go//')"
        echo "install_go: Go ya está instalado (versión: ${current_version}). Usa --force para reinstalar."
        return 0
    fi

    local tarball="go${version}.${go_os}-${go_arch}.tar.gz"
    local url="https://go.dev/dl/${tarball}"
    local install_dir="/usr/local"

    echo "Instalando Go ${version} para ${go_os}-${go_arch}..."

    # Eliminar versión anterior si existe
    if command -v go &>/dev/null; then
        echo "Eliminando versión anterior..."
        sudo rm -rf "${install_dir}/go"
    fi

    # Descargar en directorio temporal
    local tmp_dir
    tmp_dir="$(mktemp -d)"

    echo "Descargando ${url}..."
    if ! curl -LO --output-dir "$tmp_dir" "$url"; then
        echo "install_go: error al descargar Go ${version}. Verifica la versión en: https://go.dev/dl/" >&2
        rm -rf "$tmp_dir"
        return 1
    fi

    echo "Instalando en ${install_dir}..."
    sudo tar -C "$install_dir" -xzf "${tmp_dir}/${tarball}"
    rm -rf "$tmp_dir"

    # Configurar PATH en shell config
    local shell_config=""
    if [[ -f "$HOME/.bashrc" ]]; then
        shell_config="$HOME/.bashrc"
    elif [[ -f "$HOME/.zshrc" ]]; then
        shell_config="$HOME/.zshrc"
    fi

    if [[ -n "$shell_config" ]]; then
        if ! grep -q "export PATH=\$PATH:${install_dir}/go/bin" "$shell_config"; then
            {
                echo ""
                echo "# Go configuration"
                echo "export PATH=\$PATH:${install_dir}/go/bin"
                echo "export GOPATH=\$HOME/go"
                echo "export PATH=\$PATH:\$GOPATH/bin"
            } >> "$shell_config"
            echo "Variables de PATH añadidas a ${shell_config}"
        else
            echo "Variables de entorno ya configuradas en ${shell_config}"
        fi
    fi

    # Crear estructura GOPATH
    mkdir -p "$HOME/go"/{bin,src,pkg}

    # Verificar instalación
    export PATH="$PATH:${install_dir}/go/bin"
    local installed_version
    installed_version="$("${install_dir}/go/bin/go" version)"
    echo ""
    echo "Go instalado correctamente: ${installed_version}"
    echo "Reinicia tu terminal o ejecuta: source ${shell_config:-~/.bashrc}"
}

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