#!/usr/bin/env bash
#
# Actualiza el portal en el VPS: baja el codigo, instala dependencias, limpia
# cache y reinicia lo necesario.
#
#   bash desplegar.sh [usuario@servidor] [/ruta/del/proyecto]
#
# Se ejecuta en el SERVIDOR. Para subir el codigo desde tu maquina, usa
# deploy/local/subir.ps1, que llama a este script por ssh al final.
#
# Lo que este script NO toca, a proposito:
#   - .env                        credenciales reales de Sihos
#   - database/sqlite/*.sqlite    enlaces de un solo uso ya emitidos
#   - storage/app/**              PDF generados e imagenes en cache
#
# Borra cualquiera de esos tres y el portal deja de servir reportes.

set -euo pipefail

RAIZ="${2:-/var/www/incide}"
USUARIO_SERVIDOR="${1:-incide}"

log()  { printf '\n\033[1;36m==> %s\033[0m\n' "$1"; }
ok()   { printf '    \033[32mOK\033[0m  %s\n' "$1"; }
aviso(){ printf '    \033[33m!!\033[0m  %s\n' "$1"; }

cd "$RAIZ"

log "Limpieza de compilados anteriores"
# La cache de configuracion y las vistas compiladas se rehacen. Sin esto, un
# cambio en config/ o en las rutas no tendria efecto.
php artisan optimize:clear 2>/dev/null || {
    rm -f bootstrap/cache/*.php
    ok "cache limpiada a mano (artisan todavia no arrancaba)"
}

# Solo si el manifiesto de dependencias cambio: en un despliegue normal de
# unos pocos archivos, Composer no tiene nada que hacer y se salta.
if [[ -f composer.json && -f composer.lock ]]; then
    if [[ ! -d vendor ]] || [[ composer.json -nt vendor/composer/installed.json ]]; then
        log "Composer"
        COMPOSER_ALLOW_SUPERUSER=1 composer install \
            --no-dev --no-interaction --prefer-dist --optimize-autoloader --no-progress
        ok "dependencias al dia"
    fi
fi

log "Permisos de escritura"
# storage/ y bootstrap/cache los necesita PHP-FPM, que corre como www-data.
chown -R "$USUARIO_SERVIDOR:www-data" storage bootstrap/cache 2>/dev/null || true
find storage bootstrap/cache -type d -exec chmod 775 {} \; 2>/dev/null || true
find storage bootstrap/cache -type f -exec chmod 664 {} \; 2>/dev/null || true
ok "storage y bootstrap/cache"

log "Base de datos local (SQLite)"
# El hosting es de solo lectura sobre MySQL y esta base local no tiene
# migraciones, asi que las tablas se crean aqui. Es idempotente: si ya estan,
# no hace nada.
php artisan instalacion:verificar --fix >/dev/null 2>&1 || {
    aviso "instalacion:verificar --fix no termino bien; revisa con el comando sin --fix"
}
ok "tablas listas"

log "Recarga de PHP"
# opcache con validate_timestamps=1 ya recoge los cambios, pero recargar
# descarga los workers y libera memoria: conviene tras desplegar.
systemctl reload "php$(php -r 'echo PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;')-fpm" 2>/dev/null || true
ok "PHP-FPM recargado"

log "Estado"
php artisan instalacion:verificar || aviso "instalacion:verificar reporta problemas (arriba esta el detalle)"

printf '\n\033[1;32m  Despliegue terminado\033[0m\n\n'