#!/usr/bin/env bash
#
# Prepara un dominio de Virtualmin para el portal de reportes.
#
#   bash preparar-dominio.sh /home/incide
#
# Se corre como USUARIO del dominio (no root). Virtualmin ya se encarga de
# nginx, PHP-FPM, el certificado SSL y el aislamiento entre sitios; lo que
# falta es la parte de Laravel: estructura de carpetas, dependencias,
# permisos y la base local.
#
# Lo que este script NO hace, porque lo hace Virtualmin:
#   - instalar nginx o PHP
#   - emitir el certificado SSL
#   - configurar los limites de tiempo (ver abajo, son los criticos)
#
# ---------------------------------------------------------------------------
# TIEMPO DE EJECUCION: dos limites hay que subirlos y estan en sitios distintos
#
#   1. max_execution_time = 300   (PHP, en el panel de Virtualmin)
#   2. fastcgi_read_timeout 300s  (nginx)
#
# Un reporte recien generado tarda unos 70 s porque descarga las imagenes de
# Sihos. Con los valores por defecto (30 s y 60 s) la peticion se corta y el
# paciente ve un error aunque el PDF si se haya generado. El sintoma es
# confuso: el PDF existe pero el navegador dice que fallo.
#
# ---------------------------------------------------------------------------

set -euo pipefail

RAIZ="${1:-$HOME}"

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"; }

[[ -f "$RAIZ/artisan" ]] || {
    echo "No parece un proyecto de Laravel: $RAIZ/artisan no existe."
    echo "Uso: bash preparar-dominio.sh /home/USUARIO"
    exit 1
}

cd "$RAIZ"

# ---------------------------------------------------------------------------
log "1/6  Estructura de carpetas"
# Laravel ni siquiera arranca sin estas. El paquete de subida las deja vacias
# a proposito: los PDF y las imagenes en cache son datos del servidor.
mkdir -p storage/app/Admision \
         storage/app/sihos-cache \
         storage/app/public \
         storage/framework/cache/data \
         storage/framework/sessions \
         storage/framework/views \
         storage/logs \
         bootstrap/cache \
         database/sqlite
ok "carpetas listas"

# ---------------------------------------------------------------------------
log "2/6  Proteccion de carpetas"
# Los .htaccess solo funcionan con Apache. Con nginx no se miran, pero se
# dejan puestos: si algun dia el sitio se mueve a Apache, los PDF con datos
# clinicos y la base de enlaces siguen protegidos.
for archivo in storage/.htaccess database/.htaccess bootstrap/cache/.htaccess; do
    [[ -f "$archivo" ]] && ok "$archivo" || aviso "falta $archivo"
done

# ---------------------------------------------------------------------------
log "3/6  Dependencias"
# El paquete de subida no lleva vendor (son 29 MB). Con red del servidor es
# mucho mas rapido bajarlo aqui.
if [[ -f composer.json ]]; then
    if command -v composer >/dev/null 2>&1; then
        composer install --no-dev --no-interaction --prefer-dist \
                         --optimize-autoloader --no-progress 2>&1 | tail -3
        ok "vendor instalado"
    else
        aviso "No hay composer en el PATH. Instala Composer o copia vendor/ desde tu PC"
    fi
else
    aviso "No hay composer.json"
fi

# ---------------------------------------------------------------------------
log "4/6  Permisos"
# Virtualmin corre PHP-FPM como este mismo usuario, asi que basta con que las
# carpetas sean escribibles por quien las creo.
find storage bootstrap/cache database/sqlite -type d -exec chmod 775 {} \; 2>/dev/null || true
find storage bootstrap/cache database/sqlite -type f -exec chmod 664 {} \; 2>/dev/null || true
ok "storage, bootstrap/cache y database/sqlite"

# ---------------------------------------------------------------------------
log "5/6  Configuracion"
if [[ -f .env ]]; then
    ok ".env existe (no se toca)"
    php artisan key:generate --show 2>/dev/null | grep '^base64:' \
        && aviso "  ^ copialo a APP_KEY en el .env si la llave esta vacia" \
        || aviso "  no se pudo leer APP_KEY"
else
    cp .env.example .env
    chmod 600 .env
    aviso ".env creado desde .env.example: abrilo y pon las credenciales"
    aviso "  credenciales SIHOS_*, DB_*, APP_URL y APP_KEY"
fi

# ---------------------------------------------------------------------------
log "6/6  Comprobacion"
php artisan instalacion:verificar --fix || aviso "quedaron problemas (arriba esta el detalle)"

printf '\n\033[1;32m========================================\033[0m\n'
printf '\033[1;32m  Dominio preparado\033[0m\n'
printf '\033[1;32m========================================\033[0m\n\n'

echo "  FALTA HACER EN EL PANEL DE VIRTUALMIN (Webmin):"
echo
echo "  1. Limits de PHP del sitio. En el menu del dominio:"
echo "       Web Configuration -> PHP Configuration -> Edit"
echo "     Pon:"
echo "       max_execution_time = 300"
echo "       max_input_time     = 300"
echo "       memory_limit       = 512M"
echo "       post_max_size      = 16M"
echo "       upload_max_filesize= 16M"
echo "     O por consola:"
echo "       virtualmin modify-php-ini --domain TU_DOMINIO \\"
echo "         --ini-name max_execution_time --ini-value 300"
echo "       virtualmin modify-php-ini --domain TU_DOMINIO \\"
echo "         --ini-name memory_limit --ini-value 512M"
echo
echo "  2. Limite de nginx (este es el que se olvida). En:"
echo "       System Settings -> Server Templates -> Default settings"
echo "     campo 'Nginx config directives', pon:"
echo "       fastcgi_read_timeout 300s; fastcgi_send_timeout 300s;"
echo "     Aplica a todos los sitios que crees despues. Para este sitio"
echo "     especifico, revisa /etc/nginx/conf.d/TU_DOMINIO.conf"
echo
echo "  3. Que la raiz del documento sea la carpeta public:"
echo "       Web Configuration -> Document root"
echo "     /home/USUARIO/public  <- NO /home/USUARIO"
echo
echo "  4. Comprobar que los limites quedaron:"
echo "       cd $RAIZ"
echo "       php -r 'var_dump(ini_get(\"max_execution_time\"));'"
echo "     (desde la web, se ve en phpinfo())"
echo
echo "  5. Prueba de extremo a extremo:"
echo "       php artisan instalacion:verificar"
echo "     La linea 'PDF de prueba' confirma que Sihos responde."
echo
echo "  6. Si el navegador da error al abrir un reporte y el PDF si se"
echo "     genero, casi seguro es el limite de nginx del punto 2."
echo