#!/bin/bash
# DeployAlly Installer
# Uso:
#   curl -fsSL https://get.deployally.com/init.sh | sudo bash
#   curl -fsSL https://get.deployally.com/init.sh | sudo bash -s -- --rc

set -e

# Cores
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
DIM='\033[2m'
NC='\033[0m'

# Configuracoes
INSTALL_DIR="/opt/deployally"
BINARY_NAME="deployally"
SYMLINK_PATH="/usr/local/bin/deployally"
BASE_URL="https://get.deployally.com"

# Parse args
CHANNEL=""
CHANNEL_LABEL="stable"

while [[ $# -gt 0 ]]; do
    case "$1" in
        --rc)
            CHANNEL="rc/"
            CHANNEL_LABEL="rc"
            shift
            ;;
        *)
            shift
            ;;
    esac
done

# Detectar arquitetura
ARCH=$(uname -m)
case "$ARCH" in
    x86_64|amd64) ARCH="x86_64" ;;
    aarch64|arm64) ARCH="aarch64" ;;
    *)
        echo -e "${RED}Arquitetura nao suportada: $ARCH${NC}"
        echo -e "   Suportadas: x86_64, aarch64"
        exit 1
        ;;
esac

DOWNLOAD_URL="${BASE_URL}/${ARCH}/${CHANNEL}${BINARY_NAME}"
VERSION_URL="${BASE_URL}/${ARCH}/${CHANNEL}version.txt"

echo -e "${BLUE}=================================================================${NC}"
echo -e "${BLUE}   DeployAlly - Instalador (${CHANNEL_LABEL}, ${ARCH})${NC}"
echo -e "${BLUE}=================================================================${NC}"
echo

# Verificar root
if [ "$EUID" -ne 0 ]; then
    echo -e "${RED}Execute como root: curl -fsSL ${BASE_URL}/init.sh | sudo bash${NC}"
    exit 1
fi

# Verificar dependencias
for cmd in curl; do
    if ! command -v $cmd &> /dev/null; then
        echo -e "${YELLOW}Instalando ${cmd}...${NC}"
        apt-get update -qq && apt-get install -y -qq $cmd
    fi
done

# Verificar versao disponivel
echo -e "${BLUE}▸${NC} Verificando versao disponivel..."
REMOTE_VERSION=$(curl -fsSL "$VERSION_URL" 2>/dev/null | grep "^version=" | cut -d= -f2 || echo "unknown")
echo -e "  Versao: ${GREEN}${REMOTE_VERSION}${NC}"
echo -e "  ${DIM}${DOWNLOAD_URL}${NC}"
echo

# Verificar instalacao existente
if [ -f "$INSTALL_DIR/$BINARY_NAME" ]; then
    CURRENT_VERSION=$("$INSTALL_DIR/$BINARY_NAME" -V 2>/dev/null | awk '{print $2}' || echo "unknown")
    echo -e "${YELLOW}▸${NC} Instalacao existente detectada: v${CURRENT_VERSION}"

    if [ "$CURRENT_VERSION" = "$REMOTE_VERSION" ]; then
        echo -e "  ${GREEN}Ja esta na versao mais recente.${NC}"
        echo -e "  Use ${YELLOW}deployally self-update --force${NC} para reinstalar."
        exit 0
    fi

    echo -e "  Atualizando ${CURRENT_VERSION} -> ${REMOTE_VERSION}"
    echo
fi

# Criar diretorios
echo -e "${BLUE}▸${NC} Criando diretorios..."
mkdir -p "$INSTALL_DIR"/{manifests,logs,backups}

# Backup se existir
if [ -f "$INSTALL_DIR/$BINARY_NAME" ]; then
    cp "$INSTALL_DIR/$BINARY_NAME" "$INSTALL_DIR/${BINARY_NAME}.backup"
fi

# Baixar binario
echo -e "${BLUE}▸${NC} Baixando deployally (${ARCH}, ${CHANNEL_LABEL})..."
curl -fsSL "$DOWNLOAD_URL" -o "$INSTALL_DIR/$BINARY_NAME.new"

# Verificar download
if [ ! -s "$INSTALL_DIR/$BINARY_NAME.new" ]; then
    echo -e "${RED}Download falhou ou arquivo vazio${NC}"
    rm -f "$INSTALL_DIR/$BINARY_NAME.new"
    exit 1
fi

# Verificar se eh ELF valido
if ! file "$INSTALL_DIR/$BINARY_NAME.new" | grep -q "ELF"; then
    echo -e "${RED}Arquivo baixado nao eh um binario valido${NC}"
    rm -f "$INSTALL_DIR/$BINARY_NAME.new"
    exit 1
fi

# Substituir binario (atomico via mv)
chmod 755 "$INSTALL_DIR/$BINARY_NAME.new"
chown root:root "$INSTALL_DIR/$BINARY_NAME.new"
mv -f "$INSTALL_DIR/$BINARY_NAME.new" "$INSTALL_DIR/$BINARY_NAME"

# Symlink
echo -e "${BLUE}▸${NC} Criando symlink ${SYMLINK_PATH}..."
ln -sf "$INSTALL_DIR/$BINARY_NAME" "$SYMLINK_PATH"

# Verificar instalacao
VERSION=$("$SYMLINK_PATH" -V 2>/dev/null | awk '{print $2}')
if [ -z "$VERSION" ]; then
    echo -e "${RED}Falha na verificacao pos-instalacao${NC}"
    if [ -f "$INSTALL_DIR/${BINARY_NAME}.backup" ]; then
        echo -e "${YELLOW}Restaurando backup...${NC}"
        mv "$INSTALL_DIR/${BINARY_NAME}.backup" "$INSTALL_DIR/$BINARY_NAME"
    fi
    exit 1
fi

echo
echo -e "${GREEN}✓ DeployAlly v${VERSION} instalado com sucesso!${NC}"
echo -e "  Binario:    ${INSTALL_DIR}/${BINARY_NAME}"
echo -e "  Symlink:    ${SYMLINK_PATH}"
echo -e "  Config:     ${INSTALL_DIR}/config.yaml"
echo -e "  Manifests:  ${INSTALL_DIR}/manifests/"
echo -e "  Logs:       ${INSTALL_DIR}/logs/"
echo

# Inicializar config se nao existe
if [ ! -f "$INSTALL_DIR/config.yaml" ]; then
    echo -e "${BLUE}▸${NC} Executando configuracao inicial..."
    "$SYMLINK_PATH" check 2>/dev/null || true
    echo
fi

echo -e "${GREEN}=================================================================${NC}"
echo -e "${GREEN}   Instalacao concluida!${NC}"
echo -e "${GREEN}=================================================================${NC}"
echo
echo -e "  Proximos passos:"
echo -e "    ${YELLOW}deployally --version${NC}                    # verificar instalacao"
echo -e "    ${YELLOW}nano /opt/deployally/config.yaml${NC}        # configurar API"
echo -e "    ${YELLOW}deployally deploy --species mysql --instance-uid mysql-01${NC}  # primeiro deploy"
echo -e "    ${YELLOW}deployally status${NC}                       # ver containers"
echo
echo -e "  Atualizacoes futuras:"
echo -e "    ${YELLOW}deployally self-update${NC}                  # atualizar para ultima versao"
echo -e "    ${YELLOW}deployally self-update --channel rc${NC}     # testar release candidate"
echo
