#!/bin/bash

# Script de instalación de Cloudflare Tunnel para Dashboard Keller
# Uso: ./instalar_cloudflare_tunnel.sh

set -e  # Salir si hay error

echo "================================================"
echo "  Instalación de Cloudflare Tunnel"
echo "  Dashboard Keller Auscultación"
echo "================================================"
echo ""

# Colores para output
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m' # No Color

# Función para imprimir en verde
print_success() {
    echo -e "${GREEN}✓ $1${NC}"
}

# Función para imprimir en amarillo
print_warning() {
    echo -e "${YELLOW}⚠ $1${NC}"
}

# Función para imprimir en rojo
print_error() {
    echo -e "${RED}✗ $1${NC}"
}

# Detectar arquitectura
ARCH=$(uname -m)
echo "Arquitectura detectada: $ARCH"

# Determinar URL de descarga
case $ARCH in
    x86_64)
        DOWNLOAD_URL="https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64"
        ;;
    aarch64|arm64)
        DOWNLOAD_URL="https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-arm64"
        ;;
    armv7l|armhf)
        DOWNLOAD_URL="https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-arm"
        ;;
    *)
        print_error "Arquitectura no soportada: $ARCH"
        exit 1
        ;;
esac

# Paso 1: Descargar cloudflared
echo ""
echo "Paso 1: Descargando cloudflared..."
if wget -q --show-progress "$DOWNLOAD_URL" -O cloudflared; then
    print_success "Descarga completada"
else
    print_error "Error al descargar cloudflared"
    exit 1
fi

# Paso 2: Instalar cloudflared
echo ""
echo "Paso 2: Instalando cloudflared..."
chmod +x cloudflared
if sudo mv cloudflared /usr/local/bin/cloudflared; then
    print_success "cloudflared instalado en /usr/local/bin/"
else
    print_error "Error al instalar cloudflared (¿necesitas permisos sudo?)"
    exit 1
fi

# Verificar instalación
VERSION=$(cloudflared --version)
print_success "Versión instalada: $VERSION"

# Paso 3: Autenticación
echo ""
echo "Paso 3: Autenticación con Cloudflare"
echo ""
print_warning "Se abrirá una URL en tu navegador para autenticar."
print_warning "Si estás en SSH, copia la URL y ábrela en tu navegador local."
echo ""
read -p "Presiona ENTER para continuar..."

if cloudflared tunnel login; then
    print_success "Autenticación completada"
else
    print_error "Error en la autenticación"
    exit 1
fi

# Verificar que se creó el certificado
if [ -f ~/.cloudflared/cert.pem ]; then
    print_success "Certificado guardado en ~/.cloudflared/cert.pem"
else
    print_error "No se encontró el certificado. ¿Completaste la autenticación?"
    exit 1
fi

# Paso 4: Crear túnel
echo ""
echo "Paso 4: Creando túnel..."
TUNNEL_NAME="dashboard-keller"

if cloudflared tunnel create "$TUNNEL_NAME"; then
    print_success "Túnel '$TUNNEL_NAME' creado"
else
    print_error "Error al crear el túnel (puede que ya exista)"
    print_warning "Intentando continuar con el túnel existente..."
fi

# Obtener UUID del túnel
TUNNEL_UUID=$(cloudflared tunnel list | grep "$TUNNEL_NAME" | awk '{print $1}')

if [ -z "$TUNNEL_UUID" ]; then
    print_error "No se pudo obtener el UUID del túnel"
    exit 1
fi

print_success "UUID del túnel: $TUNNEL_UUID"

# Paso 5: Crear configuración
echo ""
echo "Paso 5: Creando archivo de configuración..."

mkdir -p ~/.cloudflared

# Detectar ruta del home
HOME_DIR=$(eval echo ~$USER)

cat > ~/.cloudflared/config.yml <<EOF
tunnel: $TUNNEL_UUID
credentials-file: $HOME_DIR/.cloudflared/$TUNNEL_UUID.json

ingress:
  # Dashboard Keller (sin hostname = subdominio automático)
  # Si tienes dominio propio, cambia la siguiente línea a:
  # - hostname: dashboard.tudominio.com
  #   service: http://localhost:8001
  - service: http://localhost:8001
EOF

print_success "Configuración creada en ~/.cloudflared/config.yml"

# Mostrar configuración
echo ""
print_warning "Contenido de config.yml:"
cat ~/.cloudflared/config.yml

# Paso 6: Configurar DNS (opcional)
echo ""
echo "Paso 6: Configuración de DNS"
echo ""
echo "¿Tienes un dominio propio en Cloudflare?"
echo "1) Sí, quiero usar mi dominio"
echo "2) No, usar subdominio gratuito de Cloudflare"
read -p "Selecciona una opción (1 o 2): " DNS_OPTION

if [ "$DNS_OPTION" = "1" ]; then
    read -p "Introduce tu dominio (ejemplo: tudominio.com): " DOMAIN
    read -p "Introduce el subdominio (ejemplo: dashboard): " SUBDOMAIN
    
    FULL_DOMAIN="$SUBDOMAIN.$DOMAIN"
    
    echo ""
    echo "Configurando DNS para $FULL_DOMAIN..."
    
    if cloudflared tunnel route dns "$TUNNEL_NAME" "$FULL_DOMAIN"; then
        print_success "DNS configurado para $FULL_DOMAIN"
        
        # Actualizar config.yml con el hostname
        cat > ~/.cloudflared/config.yml <<EOF
tunnel: $TUNNEL_UUID
credentials-file: $HOME_DIR/.cloudflared/$TUNNEL_UUID.json

ingress:
  - hostname: $FULL_DOMAIN
    service: http://localhost:8001
  - service: http_status:404
EOF
        print_success "config.yml actualizado con hostname"
        
        echo ""
        print_success "Tu dashboard estará disponible en: https://$FULL_DOMAIN"
    else
        print_error "Error al configurar DNS"
    fi
else
    print_warning "Usando subdominio gratuito de Cloudflare"
    print_warning "La URL se mostrará cuando inicies el túnel"
fi

# Paso 7: Instalar como servicio
echo ""
echo "Paso 7: ¿Quieres instalar cloudflared como servicio (auto-inicio)?"
read -p "Esto hará que el túnel se inicie automáticamente al arrancar (s/n): " INSTALL_SERVICE

if [ "$INSTALL_SERVICE" = "s" ] || [ "$INSTALL_SERVICE" = "S" ]; then
    echo ""
    echo "Instalando como servicio..."
    
    if sudo cloudflared service install; then
        print_success "Servicio instalado"
        
        if sudo systemctl start cloudflared; then
            print_success "Servicio iniciado"
        fi
        
        if sudo systemctl enable cloudflared; then
            print_success "Auto-inicio habilitado"
        fi
        
        echo ""
        print_success "Estado del servicio:"
        sudo systemctl status cloudflared --no-pager
    else
        print_error "Error al instalar el servicio"
    fi
else
    print_warning "Servicio no instalado. Puedes iniciarlo manualmente con:"
    echo "  cloudflared tunnel run $TUNNEL_NAME"
fi

# Resumen final
echo ""
echo "================================================"
echo "  ✓ Instalación Completada"
echo "================================================"
echo ""
print_success "Túnel creado: $TUNNEL_NAME"
print_success "UUID: $TUNNEL_UUID"

if [ "$DNS_OPTION" = "1" ]; then
    print_success "URL: https://$FULL_DOMAIN"
else
    print_warning "URL: Se mostrará al iniciar el túnel"
fi

echo ""
echo "Próximos pasos:"
echo ""
echo "1. Si NO instalaste el servicio, inicia el túnel manualmente:"
echo "   cloudflared tunnel run $TUNNEL_NAME"
echo ""
echo "2. Verifica que el dashboard esté corriendo:"
echo "   docker ps"
echo ""
echo "3. Accede a tu dashboard desde el navegador"
echo ""
echo "4. Para ver logs del túnel:"
if [ "$INSTALL_SERVICE" = "s" ] || [ "$INSTALL_SERVICE" = "S" ]; then
    echo "   sudo journalctl -u cloudflared -f"
else
    echo "   (se mostrarán en la terminal al ejecutar el túnel)"
fi
echo ""
echo "5. Para detener el túnel:"
if [ "$INSTALL_SERVICE" = "s" ] || [ "$INSTALL_SERVICE" = "S" ]; then
    echo "   sudo systemctl stop cloudflared"
else
    echo "   Ctrl+C"
fi
echo ""
print_success "¡Listo! Consulta la guía completa en docs/guia_cloudflare_tunnel.md"
echo ""
