#!/usr/bin/env bash
#
# install.sh — Instalación completa de Metafoliador v2 en un servidor nuevo
#
# Uso:
#   sudo ./scripts/install.sh
#
# Requisitos del SO:
#   - Ubuntu 22.04+ / Debian 12+ (o derivados con apt)
#   - Ejecutar como root o con sudo
#
# Este script:
#   1. Instala dependencias del sistema (Python, PostgreSQL, RabbitMQ, Redis)
#   2. Crea la base de datos y usuario PostgreSQL
#   3. Clona/configura el proyecto en /var/www/html/metafoliadorv2
#   4. Crea venv e instala dependencias Python
#   5. Configura .env
#   6. Ejecuta migraciones
#   7. Instala y activa servicios systemd
#   8. Inicia los servicios
#

set -euo pipefail

# ─── Configuración ────────────────────────────────────────────────────────────
PROJECT_DIR="/var/www/html/metafoliadorv2"
VENV_DIR="$PROJECT_DIR/venv"
LOG_DIR="$PROJECT_DIR/logs"
GIT_REPO="https://gitlab.metabiblioteca.com/metabiblioteca/development/metafoliador.git"
GIT_BRANCH="v2"

# PostgreSQL
DB_NAME="metafoliadorv2"
DB_USER="metafoliador"
DB_PASS="v2_password_here"
DB_HOST="localhost"
DB_PORT="5433"

# ─── Colores ──────────────────────────────────────────────────────────────────
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'

log()  { echo -e "${GREEN}[INSTALL]${NC} $1"; }
warn() { echo -e "${YELLOW}[AVISO]${NC} $1"; }
err()  { echo -e "${RED}[ERROR]${NC} $1"; exit 1; }
info() { echo -e "${BLUE}[INFO]${NC} $1"; }

# ─── Verificar que se ejecuta como root ───────────────────────────────────────
if [ "$EUID" -ne 0 ]; then
    err "Este script debe ejecutarse como root (sudo ./scripts/install.sh)"
fi

echo ""
echo "═══════════════════════════════════════════════════════════════"
echo "  Metafoliador v2 — Instalación completa"
echo "═══════════════════════════════════════════════════════════════"
echo "  Directorio:     $PROJECT_DIR"
echo "  Base de datos:  $DB_NAME (usuario: $DB_USER)"
echo "  PostgreSQL:     $DB_HOST:$DB_PORT"
echo "═══════════════════════════════════════════════════════════════"
echo ""

# ─── Paso 1: Dependencias del sistema ────────────────────────────────────────
log "Paso 1/8: Instalando dependencias del sistema ..."

apt-get update -qq

apt-get install -y -qq \
    python3 \
    python3-pip \
    python3-venv \
    python3-dev \
    build-essential \
    postgresql \
    postgresql-client \
    rabbitmq-server \
    redis-server \
    git \
    libpq-dev \
    libxml2-dev \
    libxslt1-dev \
    libjpeg-dev \
    zlib1g-dev \
    libfreetype6-dev \
    liblcms2-dev \
    libwebp-dev \
    libharfbuzz-dev \
    libfribidi-dev \
    libtiff5-dev \
    libopenjp2-7-dev \
    sshpass

log "Dependencias del sistema instaladas."

# ─── Paso 2: Base de datos ───────────────────────────────────────────────────
log "Paso 2/8: Configurando PostgreSQL ..."

# Asegurar que PostgreSQL está corriendo
systemctl enable postgresql
systemctl start postgresql

# Configurar puerto 5433 si es necesario
if ! grep -q "^port = 5433" /etc/postgresql/*/main/postgresql.conf 2>/dev/null; then
    PG_VERSION=$(pg_config --version | grep -oP '\d+' | head -1)
    PG_CONF="/etc/postgresql/$PG_VERSION/main/postgresql.conf"
    if [ -f "$PG_CONF" ]; then
        sed -i "s/^#port = 5432/port = 5433/" "$PG_CONF"
        sed -i "s/^port = 5432/port = 5433/" "$PG_CONF"
        systemctl restart postgresql
        info "PostgreSQL configurado en puerto 5433"
    fi
fi

# Ejecutar script SQL de setup
if [ -f "$(dirname "$0")/setup_database.sql" ]; then
    su - postgres -c "psql -f $(dirname "$0")/setup_database.sql" 2>/dev/null || {
        warn "El script SQL tuvo advertencias (posiblemente la BD ya existe). Continuando..."
    }
else
    # Fallback: crear manualmente
    su - postgres -c "psql -c \"CREATE USER $DB_USER WITH PASSWORD '$DB_PASS';\"" 2>/dev/null || true
    su - postgres -c "psql -c \"CREATE DATABASE $DB_NAME OWNER $DB_USER ENCODING 'UTF8';\"" 2>/dev/null || true
    su - postgres -c "psql -c \"GRANT ALL PRIVILEGES ON DATABASE $DB_NAME TO $DB_USER;\"" 2>/dev/null || true
fi

log "Base de datos configurada."

# ─── Paso 3: Clonar repositorio ──────────────────────────────────────────────
log "Paso 3/8: Clonando repositorio ..."

if [ -d "$PROJECT_DIR/.git" ]; then
    warn "El directorio $PROJECT_DIR ya existe con un repositorio git."
    info "Actualizando desde GitLab ..."
    cd "$PROJECT_DIR"
    git fetch origin
    git checkout "$GIT_BRANCH"
    git pull origin "$GIT_BRANCH"
else
    if [ -d "$PROJECT_DIR" ]; then
        warn "El directorio $PROJECT_DIR ya existe pero no es un repo git. Respaldando..."
        mv "$PROJECT_DIR" "${PROJECT_DIR}.bak.$(date +%Y%m%d%H%M%S)"
    fi
    mkdir -p "$(dirname "$PROJECT_DIR")"
    git clone --branch "$GIT_BRANCH" "$GIT_REPO" "$PROJECT_DIR"
fi

log "Repositorio listo en $PROJECT_DIR."

# ─── Paso 4: Entorno virtual y dependencias Python ────────────────────────────
log "Paso 4/8: Instalando dependencias Python ..."

cd "$PROJECT_DIR"

if [ -d "$VENV_DIR" ]; then
    warn "Entorno virtual existente. Recreando..."
    rm -rf "$VENV_DIR"
fi

python3 -m venv "$VENV_DIR"
source "$VENV_DIR/bin/activate"
pip install --upgrade pip
pip install -r requirements.txt

log "Dependencias Python instaladas."

# ─── Paso 5: Configurar .env ──────────────────────────────────────────────────
log "Paso 5/8: Configurando variables de entorno ..."

if [ ! -f "$PROJECT_DIR/.env" ]; then
    cp "$PROJECT_DIR/.env.example" "$PROJECT_DIR/.env"
    # Actualizar con los valores configurados
    sed -i "s|DATABASE_URL=.*|DATABASE_URL=postgresql://$DB_USER:$DB_PASS@$DB_HOST:$DB_PORT/$DB_NAME|" "$PROJECT_DIR/.env"
    log "Archivo .env creado desde .env.example."
else
    warn ".env ya existe. No se sobrescribe."
fi

# ─── Paso 6: Migraciones ─────────────────────────────────────────────────────
log "Paso 6/8: Ejecutando migraciones de base de datos ..."

source "$VENV_DIR/bin/activate"
cd "$PROJECT_DIR"
alembic upgrade head

log "Migraciones ejecutadas."

# ─── Paso 7: Crear directorio de logs ─────────────────────────────────────────
log "Paso 7/8: Configurando logs ..."

mkdir -p "$LOG_DIR"
touch "$LOG_DIR/api.log" "$LOG_DIR/worker.log" "$LOG_DIR/webhook-worker.log"
chmod -R 755 "$LOG_DIR"

log "Directorio de logs creado."

# ─── Paso 8: Servicios systemd ───────────────────────────────────────────────
log "Paso 8/8: Instalando servicios systemd ..."

if [ -d "$PROJECT_DIR/scripts" ]; then
    cp "$PROJECT_DIR/scripts/metafoliadorv2.service" /etc/systemd/system/
    cp "$PROJECT_DIR/scripts/metafoliadorv2-worker.service" /etc/systemd/system/
    cp "$PROJECT_DIR/scripts/metafoliadorv2-webhook-worker.service" /etc/systemd/system/
else
    err "No se encontraron los archivos .service en $PROJECT_DIR/scripts/"
fi

systemctl daemon-reload

systemctl enable metafoliadorv2.service
systemctl enable metafoliadorv2-worker.service
systemctl enable metafoliadorv2-webhook-worker.service

systemctl start metafoliadorv2.service
systemctl start metafoliadorv2-worker.service
systemctl start metafoliadorv2-webhook-worker.service

log "Servicios systemd instalados e iniciados."

# ─── Verificación final ───────────────────────────────────────────────────────
echo ""
echo "═══════════════════════════════════════════════════════════════"
echo "  INSTALACIÓN COMPLETADA"
echo "═══════════════════════════════════════════════════════════════"
echo ""
echo "  Servicios:"
echo "    API:              http://localhost:8000"
echo "    systemctl status metafoliadorv2.service"
echo "    systemctl status metafoliadorv2-worker.service"
echo "    systemctl status metafoliadorv2-webhook-worker.service"
echo ""
echo "  Logs:"
echo "    tail -f $LOG_DIR/api.log"
echo "    tail -f $LOG_DIR/worker.log"
echo ""
echo "  Base de datos:"
echo "    psql -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME"
echo ""
echo "  Para desplegar actualizaciones futuras:"
echo "    cd $PROJECT_DIR && ./deploy.sh"
echo ""
echo "═══════════════════════════════════════════════════════════════"
