#!/bin/bash
set -e

# ── LCC — Script de Instalação ─────────────────────────────
#
# Este script prepara o servidor e instala o manager-cli.
#
# O que ele faz:
#   1. Detecta a distribuição (Debian/Ubuntu ou RHEL/AlmaLinux/Rocky)
#   2. Instala o Docker CE (se não estiver instalado)
#   3. Baixa e instala o manager-cli
#   4. Executa o wizard de instalação interativo
#
# Uso:
#   curl -fsSL https://downloads.7dev.net.br/install.sh | sudo bash
#
# Ou baixe e execute:
#   curl -fsSL https://downloads.7dev.net.br/install.sh -o install.sh
#   chmod +x install.sh
#   sudo ./install.sh
#
# Requisitos:
#   - Linux (Debian 11+, Ubuntu 20.04+, RHEL 8+, AlmaLinux 8+, Rocky 8+)
#   - Acesso root (sudo)
#   - Conexão com a internet
# ─────────────────────────────────────────────────────────────

# ── Cores ──
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
CYAN='\033[0;36m'
BOLD='\033[1m'
NC='\033[0m'

DOWNLOAD_URL="https://downloads.7dev.net.br"
CLI_BINARY="manager-cli-linux-amd64"
CLI_INSTALL_PATH="/usr/local/bin/manager-cli"

info()    { echo -e "${GREEN}[INFO]${NC} $*"; }
warn()    { echo -e "${YELLOW}[WARN]${NC} $*"; }
error()   { echo -e "${RED}[ERRO]${NC} $*" >&2; }
fatal()   { error "$*"; exit 1; }
header()  { echo -e "\n${CYAN}${BOLD}── $* ──${NC}\n"; }

# ── Verificações iniciais ──

check_root() {
    if [ "$(id -u)" -ne 0 ]; then
        fatal "Este script precisa ser executado como root. Use: sudo $0"
    fi
}

detect_arch() {
    ARCH=$(uname -m)
    case "$ARCH" in
        x86_64)  CLI_BINARY="manager-cli-linux-amd64" ;;
        aarch64) CLI_BINARY="manager-cli-linux-arm64" ;;
        *)       fatal "Arquitetura '$ARCH' nao suportada. Use x86_64 ou arm64." ;;
    esac
}

detect_distro() {
    if [ -f /etc/os-release ]; then
        . /etc/os-release
        DISTRO_ID="$ID"
        DISTRO_VERSION="$VERSION_ID"
        DISTRO_NAME="$PRETTY_NAME"
    else
        fatal "Nao foi possivel detectar a distribuicao. Arquivo /etc/os-release nao encontrado."
    fi

    case "$DISTRO_ID" in
        debian|ubuntu)
            DISTRO_FAMILY="debian"
            ;;
        rhel|centos|almalinux|rocky|ol|fedora)
            DISTRO_FAMILY="rhel"
            ;;
        *)
            fatal "Distribuicao '$DISTRO_ID' ($DISTRO_NAME) nao suportada. Use Debian, Ubuntu, RHEL, AlmaLinux ou Rocky Linux."
            ;;
    esac

    info "Distribuicao detectada: $DISTRO_NAME ($DISTRO_FAMILY)"
}

# ── Docker CE ──

is_docker_installed() {
    command -v docker &>/dev/null && docker info &>/dev/null
}

install_docker_debian() {
    header "Instalando Docker CE (Debian/Ubuntu)"

    # Dependências
    apt-get update -qq
    apt-get install -y -qq ca-certificates curl gnupg lsb-release

    # Chave GPG do Docker
    install -m 0755 -d /etc/apt/keyrings
    if [ ! -f /etc/apt/keyrings/docker.gpg ]; then
        curl -fsSL "https://download.docker.com/linux/$DISTRO_ID/gpg" | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
        chmod a+r /etc/apt/keyrings/docker.gpg
    fi

    # Repositório
    CODENAME=$(. /etc/os-release && echo "$VERSION_CODENAME")
    # Debian trixie/sid pode não ter release no Docker, fallback para bookworm
    if ! curl -fsSL "https://download.docker.com/linux/$DISTRO_ID/dists/$CODENAME/Release" &>/dev/null; then
        warn "Codename '$CODENAME' nao encontrado no repositorio Docker. Usando 'bookworm' como fallback."
        CODENAME="bookworm"
    fi

    echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/$DISTRO_ID $CODENAME stable" \
        > /etc/apt/sources.list.d/docker.list

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

    info "Docker CE instalado com sucesso."
}

install_docker_rhel() {
    header "Instalando Docker CE (RHEL/AlmaLinux/Rocky)"

    # Remover podman/buildah se existirem (conflito com Docker)
    if rpm -q podman &>/dev/null; then
        warn "Removendo podman (conflito com Docker CE)..."
        yum remove -y -q podman buildah 2>/dev/null || true
    fi

    # Dependências
    yum install -y -q yum-utils

    # Repositório Docker
    yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

    # Instalar
    yum install -y -q docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

    # Habilitar e iniciar
    systemctl enable --now docker

    info "Docker CE instalado com sucesso."
}

install_docker() {
    if is_docker_installed; then
        DOCKER_VERSION=$(docker version --format '{{.Server.Version}}' 2>/dev/null || echo "desconhecida")
        info "Docker ja esta instalado (versao: $DOCKER_VERSION). Pulando instalacao."
        return 0
    fi

    case "$DISTRO_FAMILY" in
        debian) install_docker_debian ;;
        rhel)   install_docker_rhel ;;
    esac

    # Verificar instalação
    if ! is_docker_installed; then
        fatal "Falha ao instalar o Docker. Verifique os logs acima."
    fi

    # Garantir que o serviço está rodando
    systemctl enable --now docker

    DOCKER_VERSION=$(docker version --format '{{.Server.Version}}' 2>/dev/null || echo "desconhecida")
    info "Docker $DOCKER_VERSION instalado e rodando."
}

# ── Manager CLI ──

install_cli() {
    header "Instalando manager-cli"

    local TMP_FILE
    TMP_FILE=$(mktemp)

    info "Baixando $CLI_BINARY..."
    if ! curl -fsSL "$DOWNLOAD_URL/$CLI_BINARY" -o "$TMP_FILE"; then
        rm -f "$TMP_FILE"
        fatal "Falha ao baixar o manager-cli de $DOWNLOAD_URL/$CLI_BINARY"
    fi

    # Verificar se é um binário ELF válido
    if ! file "$TMP_FILE" | grep -q "ELF"; then
        rm -f "$TMP_FILE"
        fatal "Arquivo baixado nao e um binario valido. Verifique a URL."
    fi

    chmod +x "$TMP_FILE"
    mv "$TMP_FILE" "$CLI_INSTALL_PATH"

    info "manager-cli instalado em $CLI_INSTALL_PATH"

    # Verificar se o binário executa
    if ! "$CLI_INSTALL_PATH" version &>/dev/null; then
        # Tentar sem subcomando — alguns builds retornam erro sem config
        if ! "$CLI_INSTALL_PATH" --help >/dev/null 2>&1; then
            fatal "manager-cli instalado mas nao executa corretamente."
        fi
    fi

    info "manager-cli pronto."
}

# ── Main ──

main() {
    echo ""
    echo -e "${CYAN}${BOLD}╔══════════════════════════════════════════════════╗${NC}"
    echo -e "${CYAN}${BOLD}║     LCC — Linux Control Center — Instalacao     ║${NC}"
    echo -e "${CYAN}${BOLD}╚══════════════════════════════════════════════════╝${NC}"
    echo ""

    check_root
    detect_arch
    detect_distro

    # Passo 1: Docker
    install_docker

    # Passo 2: CLI
    install_cli

    # Passo 3: Wizard
    header "Iniciando wizard de instalacao"
    echo -e "O wizard vai guiar voce pela configuracao completa da plataforma."
    echo -e "Voce precisara de:"
    echo -e "  ${BOLD}- UUID e chave de API da licenca${NC}"
    echo -e "  ${BOLD}- IP ou hostname deste servidor${NC}"
    echo ""
    echo -e "Para pular o wizard agora e executar depois, pressione Ctrl+C."
    echo -e "Depois execute: ${BOLD}sudo manager-cli install${NC}"
    echo ""

    read -rp "Pressione ENTER para iniciar o wizard ou Ctrl+C para sair... "

    manager-cli install
}

main "$@"
