#!/usr/bin/env bash
#
# install-docker.sh — установка актуальных Docker + Docker Compose (Ubuntu/Debian)
# Повторяет инструкцию RUVDS: https://ruvds.com/ru/helpcenter/kak-ustanovit-docker-i-docker-compose/
# Использование: sudo ./install-docker.sh
#

set -euo pipefail

# Цвета (только для терминала)
if [ -t 1 ]; then
    BOLD=$'\e[1m'; GREEN=$'\e[32m'; RED=$'\e[31m'; CYAN=$'\e[36m'; RESET=$'\e[0m'
else
    BOLD=''; GREEN=''; RED=''; CYAN=''; RESET=''
fi

info() { printf '%s[+]%s %s\n' "$GREEN" "$RESET" "$*"; }
step() { printf '\n%s===== %s =====%s\n' "$BOLD$CYAN" "$*" "$RESET"; }
die() { printf '%s[!]%s %s\n' "$RED" "$RESET" "$*" >&2; exit 1; }

# --- Проверки ---
if [ "$(id -u)" -ne 0 ] && ! sudo -n true 2>/dev/null; then
    die "Запустите через sudo: sudo $0"
fi

if [ ! -r /etc/os-release ]; then
    die "Не удалось определить ОС (/etc/os-release отсутствует)."
fi
. /etc/os-release

case "${ID:-}" in
    ubuntu) DOCKER_URL="https://download.docker.com/linux/ubuntu" ;;
    debian) DOCKER_URL="https://download.docker.com/linux/debian" ;;
    *)      die "Скрипт поддерживает только Ubuntu и Debian (обнаружено: ${ID:-неизвестно})." ;;
esac

# Кодовое имя дистрибутива (как в статье — lsb_release -cs, с запасным вариантом)
CODENAME=$(lsb_release -cs 2>/dev/null || echo "${VERSION_CODENAME:-}")
if [ -z "$CODENAME" ]; then
    die "Не удалось определить кодовое имя дистрибутива."
fi

step "Установка Docker и Docker Compose на $PRETTY_NAME ($CODENAME)"

# --- 1. Обновление и зависимости ---
step "1/7 — Обновление пакетов и установка зависимостей"
sudo apt update
sudo apt install -y ca-certificates gnupg curl lsb-release

# --- 2. GPG-ключ Docker ---
step "2/7 — Добавление GPG-ключа Docker"
curl -fsSL "${DOCKER_URL}/gpg" | sudo gpg --dearmor -o /usr/share/keyrings/docker.gpg

# --- 3. APT-репозиторий Docker ---
step "3/7 — Добавление репозитория Docker"
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker.gpg] ${DOCKER_URL} ${CODENAME} stable" \
    | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# --- 4. Обновление списка пакетов ---
step "4/7 — Обновление списка пакетов"
sudo apt update

# --- 5. Установка Docker Engine ---
step "5/7 — Установка Docker Engine"
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin

# --- 6. Установка Docker Compose (как плагин CLI) ---
step "6/7 — Установка Docker Compose"
sudo mkdir -p /usr/local/lib/docker/cli-plugins/
sudo curl -SL "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" \
    -o /usr/local/lib/docker/cli-plugins/docker-compose
sudo chmod +x /usr/local/lib/docker/cli-plugins/docker-compose

# --- 7. Проверка версий ---
step "7/7 — Проверка версий"
docker --version
docker compose version

printf '\n%sГотово! Docker и Docker Compose установлены.%s\n' "$GREEN" "$RESET"