#!/bin/bash
# Genera un paquete de instalacion "todo incluido" para hosting SIN acceso
# por SSH/Terminal (ej. cPanel de hosting compartido): a diferencia de
# empaquetar.sh, este incluye vendor/ y los assets ya compilados, y trae la
# clave de la aplicacion (APP_KEY) y el token de instalacion YA generados
# adentro del .env / storage/install.token, para que en el servidor destino
# no haga falta correr composer, npm ni ningun comando artisan: todo el
# resto (migrar, crear el admin) ya lo hace el asistente web /instalar.
set -euo pipefail
cd "$(dirname "$0")/.."

command -v composer >/dev/null || { echo "Falta composer en esta máquina." >&2; exit 1; }
command -v npm >/dev/null || { echo "Falta npm en esta máquina." >&2; exit 1; }

VERSION=$(git rev-parse --short HEAD)
FECHA=$(date +%Y%m%d)
NOMBRE="facturacion-cpanel-${FECHA}-${VERSION}"
STAGE=$(mktemp -d)
DESTINO="${1:-/tmp/${NOMBRE}.zip}"

cleanup() { rm -rf "$STAGE"; }
trap cleanup EXIT

echo "Preparando copia limpia del código..."
git archive HEAD | tar -x -C "$STAGE"
cd "$STAGE"

echo "Instalando dependencias PHP (composer install --no-dev)..."
composer install --no-dev --optimize-autoloader --no-interaction --quiet

echo "Instalando dependencias JS y compilando assets (npm run build)..."
npm install --no-audit --no-fund --silent
npm run build --silent
rm -rf node_modules

echo "Generando .env con APP_KEY y token de instalación..."
cp .env.example .env

APP_KEY="base64:$(openssl rand -base64 32)"
TOKEN=$(php -r "echo bin2hex(random_bytes(24));")

NEW_APP_KEY="$APP_KEY" php -r '
$env = file_get_contents(".env");
$key = getenv("NEW_APP_KEY");
$env = preg_replace_callback("/^APP_KEY=.*$/m", fn () => "APP_KEY=" . $key, $env);
file_put_contents(".env", $env);
'

echo -n "$TOKEN" > storage/install.token
chmod 600 storage/install.token

rm -rf tests phpunit.xml

echo "Comprimiendo paquete (puede tardar, incluye vendor/ y assets compilados)..."
php -r '
$origen = getcwd();
$destino = $argv[1];
$zip = new ZipArchive();
$zip->open($destino, ZipArchive::CREATE | ZipArchive::OVERWRITE);
$iterator = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator($origen, FilesystemIterator::SKIP_DOTS),
    RecursiveIteratorIterator::SELF_FIRST
);
foreach ($iterator as $archivo) {
    $rutaLocal = substr($archivo->getPathname(), strlen($origen) + 1);
    if (str_starts_with($rutaLocal, ".git/")) {
        continue;
    }
    if ($archivo->isDir()) {
        $zip->addEmptyDir($rutaLocal);
    } else {
        $zip->addFile($archivo->getPathname(), $rutaLocal);
    }
}
$zip->close();
' "$DESTINO"

echo ""
echo "Paquete generado: ${DESTINO}"
echo ""
echo "Token de instalación (lo vas a necesitar para /instalar?token=...):"
echo "  ${TOKEN}"
echo ""
echo "Pasos para instalar en cPanel/WHM sin SSH:"
echo "  1. Subir el ZIP por el Administrador de Archivos y extraerlo FUERA de"
echo "     public_html, por ejemplo en ~/facturacion (nunca dentro de una carpeta"
echo "     que quede accesible por el navegador tal cual)."
echo "  2. En WHM: crear el subdominio del cliente y configurar su 'Document Root'"
echo "     apuntando directo a ~/facturacion/public (no a ~/facturacion)."
echo "  3. En 'Bases de datos MySQL' de cPanel: crear la base de datos y el usuario"
echo "     para este cliente (los vas a necesitar en el paso 6)."
echo "  4. En el Administrador de Archivos, dar permiso de escritura (755, o 775 si"
echo "     755 no alcanza) a: storage/, storage/framework/*, storage/logs/,"
echo "     bootstrap/cache/."
echo "  5. En 'MultiPHP Manager' (o 'Select PHP Version'): elegir PHP 8.3 para ese dominio."
echo "  6. Visitar https://SUBDOMINIO-DEL-CLIENTE/instalar?token=${TOKEN} y completar"
echo "     el asistente (base de datos del paso 3, y el primer usuario administrador)."
echo "     No hace falta correr composer, npm ni ningún comando: ya está todo armado."
