#!/usr/bin/env bash

set -e

# ============================================================
# Docker Installer - Debian / Ubuntu
# ============================================================

echo "=========================================="
echo " Docker Installer"
echo " Debian / Ubuntu"
echo "=========================================="
echo

# ------------------------------------------------------------
# Verificar root
# ------------------------------------------------------------

if [ "$EUID" -ne 0 ]; then
    echo "[ERRO] Execute este script como root."
    echo
    echo "Exemplo:"
    echo "  curl -fsSL https://scripts.phcore.com.br/docker-install.sh | sudo bash"
    exit 1
fi

# ------------------------------------------------------------
# Verificar sistema operacional
# ------------------------------------------------------------

if [ ! -f /etc/os-release ]; then
    echo "[ERRO] Não foi possível identificar o sistema operacional."
    exit 1
fi

. /etc/os-release

OS="$ID"
VERSION_CODENAME="${VERSION_CODENAME:-}"

echo "[INFO] Sistema detectado: $PRETTY_NAME"
echo "[INFO] Codename: ${VERSION_CODENAME:-desconhecido}"
echo

# ------------------------------------------------------------
# Detectar distribuição
# ------------------------------------------------------------

case "$OS" in
    debian)
        DOCKER_REPO="https://download.docker.com/linux/debian"
        DOCKER_GPG="$DOCKER_REPO/gpg"
        ;;

    ubuntu)
        DOCKER_REPO="https://download.docker.com/linux/ubuntu"
        DOCKER_GPG="$DOCKER_REPO/gpg"

        # Ubuntu pode utilizar UBUNTU_CODENAME
        VERSION_CODENAME="${UBUNTU_CODENAME:-$VERSION_CODENAME}"
        ;;

    *)
        echo "[ERRO] Sistema não suportado: $OS"
        echo
        echo "Este instalador suporta:"
        echo "  - Debian"
        echo "  - Ubuntu"
        exit 1
        ;;
esac

if [ -z "$VERSION_CODENAME" ]; then
    echo "[ERRO] Não foi possível determinar o codename da distribuição."
    exit 1
fi

# ------------------------------------------------------------
# Perguntas iniciais
# ------------------------------------------------------------

echo "=========================================="
echo " Configuração inicial"
echo "=========================================="
echo

# Atualização do sistema
read -r -p "Deseja atualizar o sistema inteiro? [S/n]: " UPDATE_SYSTEM
UPDATE_SYSTEM="${UPDATE_SYSTEM:-S}"

case "$UPDATE_SYSTEM" in
    S|s|SIM|sim|Sim)
        UPDATE_SYSTEM=true
        ;;

    N|n|NAO|nao|Não|não)
        UPDATE_SYSTEM=false
        ;;

    *)
        echo "[INFO] Opção inválida. Será utilizado o padrão: SIM"
        UPDATE_SYSTEM=true
        ;;
esac

echo

# Timezone
read -r -p "Deseja configurar o timezone? [S/n]: " CONFIGURE_TIMEZONE
CONFIGURE_TIMEZONE="${CONFIGURE_TIMEZONE:-S}"

case "$CONFIGURE_TIMEZONE" in
    S|s|SIM|sim|Sim)
        CONFIGURE_TIMEZONE=true
        ;;

    N|n|NAO|nao|Não|não)
        CONFIGURE_TIMEZONE=false
        ;;

    *)
        echo "[INFO] Opção inválida. Será utilizado o padrão: SIM"
        CONFIGURE_TIMEZONE=true
        ;;
esac

echo
echo "------------------------------------------"
echo " Configuração selecionada:"
echo "------------------------------------------"

if [ "$UPDATE_SYSTEM" = true ]; then
    echo " Atualizar sistema : SIM"
else
    echo " Atualizar sistema : NÃO"
fi

if [ "$CONFIGURE_TIMEZONE" = true ]; then
    echo " Configurar timezone: SIM"
else
    echo " Configurar timezone: NÃO"
fi

echo "------------------------------------------"
echo

# ------------------------------------------------------------
# Atualizar sistema
# ------------------------------------------------------------

if [ "$UPDATE_SYSTEM" = true ]; then

    echo
    echo "[1/6] Atualizando sistema..."
    echo

    export DEBIAN_FRONTEND=noninteractive

    apt-get update
    apt-get upgrade -y

else

    echo
    echo "[1/6] Atualização do sistema ignorada."
    echo

fi

# ------------------------------------------------------------
# Dependências
# ------------------------------------------------------------

echo
echo "[2/6] Instalando dependências..."
echo

export DEBIAN_FRONTEND=noninteractive

apt-get install -y \
    ca-certificates \
    curl \
    sudo

# ------------------------------------------------------------
# Configurar timezone
# ------------------------------------------------------------

if [ "$CONFIGURE_TIMEZONE" = true ]; then

    echo
    echo "[3/6] Configuração de timezone..."
    echo

    # Remover modo não interativo para permitir
    # que o dpkg-reconfigure apresente a interface.
    unset DEBIAN_FRONTEND

    dpkg-reconfigure tzdata

else

    echo
    echo "[3/6] Configuração de timezone ignorada."
    echo

fi

# ------------------------------------------------------------
# Configurar repositório Docker
# ------------------------------------------------------------

echo
echo "[4/6] Configurando repositório oficial do Docker..."
echo

install -m 0755 -d /etc/apt/keyrings

curl -fsSL "$DOCKER_GPG" \
    -o /etc/apt/keyrings/docker.asc

chmod a+r /etc/apt/keyrings/docker.asc

cat > /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: $DOCKER_REPO
Suites: $VERSION_CODENAME
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF

echo "[INFO] Repositório configurado:"
echo "       $DOCKER_REPO"
echo "       Suite: $VERSION_CODENAME"

# ------------------------------------------------------------
# Instalar Docker
# ------------------------------------------------------------

echo
echo "[5/6] Instalando Docker..."
echo

export DEBIAN_FRONTEND=noninteractive

apt-get update

apt-get install -y \
    docker-ce \
    docker-ce-cli \
    containerd.io \
    docker-buildx-plugin \
    docker-compose-plugin

# ------------------------------------------------------------
# Habilitar Docker
# ------------------------------------------------------------

echo
echo "[INFO] Habilitando serviço Docker..."

systemctl enable docker
systemctl enable containerd

systemctl start docker

# ------------------------------------------------------------
# Verificação
# ------------------------------------------------------------

echo
echo "[6/6] Verificando instalação..."
echo

echo "------------------------------------------"
echo " Docker"
echo "------------------------------------------"

docker --version

echo
echo "------------------------------------------"
echo " Docker Compose"
echo "------------------------------------------"

docker compose version

echo
echo "------------------------------------------"
echo " Serviço"
echo "------------------------------------------"

systemctl is-active docker
systemctl is-enabled docker

echo
echo "=========================================="
echo " Docker instalado com sucesso!"
echo "=========================================="
echo

echo "Docker:"
docker --version

echo
echo "Docker Compose:"
docker compose version

echo
echo "Para testar:"
echo "  docker run --rm hello-world"

echo
