#!/usr/bin/env bash
#
# Installation d'École Haïti sur un VPS Ubuntu 24.04 vierge.
#
# Usage (en root, sur le serveur) :
#   bash install.sh /root/ecole-haiti-<version>.zip ecole.example.ht [email-letsencrypt]
#
# Installe nginx, PHP 8.3-FPM, MySQL 8, déploie l'archive dans
# /var/www/ecole-haiti (structure releases/ + current → mise à jour sans
# coupure et retour arrière possible), crée la base, obtient un certificat
# Let's Encrypt si un e-mail est fourni, et lance school:install.
#
# Relançable : si l'application est déjà installée, renvoie vers deploy.sh.
set -euo pipefail

ZIP="${1:?Usage: install.sh <archive.zip> <domaine> [email-letsencrypt]}"
DOMAIN="${2:?Usage: install.sh <archive.zip> <domaine> [email-letsencrypt]}"
LE_EMAIL="${3:-}"

APP_ROOT=/var/www/ecole-haiti
DB_NAME=ecole_haiti
DB_USER=ecole
HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"

step() { printf '\n\033[36m[%s] %s\033[0m\n' "$1" "$2"; }

[[ $EUID -eq 0 ]] || { echo "À lancer en root (sudo)." >&2; exit 1; }
[[ -f "$ZIP" ]] || { echo "Archive introuvable : $ZIP" >&2; exit 1; }
if [[ -f "$APP_ROOT/shared/.env" ]]; then
    echo "École Haïti est déjà installée dans $APP_ROOT. Pour mettre à jour : deploy.sh $ZIP" >&2
    exit 1
fi

# --- 1. Paquets système -------------------------------------------------------
step 1 "Paquets système (nginx, PHP 8.3, MySQL 8)"
export DEBIAN_FRONTEND=noninteractive
apt-get update -qq
apt-get install -y -qq nginx mysql-server unzip curl \
    php8.3-fpm php8.3-cli php8.3-mysql php8.3-mbstring php8.3-xml php8.3-bcmath \
    php8.3-intl php8.3-zip php8.3-curl php8.3-gd

# PHP-FPM : valeurs raisonnables pour un petit VPS.
sed -i 's/^;\?memory_limit = .*/memory_limit = 256M/; s/^;\?upload_max_filesize = .*/upload_max_filesize = 20M/; s/^;\?post_max_size = .*/post_max_size = 20M/' /etc/php/8.3/fpm/php.ini
systemctl enable --now php8.3-fpm nginx mysql

# --- 2. Base de données ---------------------------------------------------------
step 2 "Base $DB_NAME et utilisateur $DB_USER"
DB_PASS="$(tr -dc 'A-Za-z0-9' </dev/urandom | head -c 24)"
mysql <<SQL
CREATE DATABASE IF NOT EXISTS \`$DB_NAME\` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER IF NOT EXISTS '$DB_USER'@'localhost' IDENTIFIED BY '$DB_PASS';
ALTER USER '$DB_USER'@'localhost' IDENTIFIED BY '$DB_PASS';
GRANT ALL PRIVILEGES ON \`$DB_NAME\`.* TO '$DB_USER'@'localhost';
FLUSH PRIVILEGES;
SQL

# --- 3. Arborescence ----------------------------------------------------------------
step 3 "Arborescence $APP_ROOT"
mkdir -p "$APP_ROOT"/{releases,shared/storage}
VERSION="$(unzip -p "$ZIP" VERSION 2>/dev/null | tr -d '[:space:]' || date +%Y.%m.%d)"
RELEASE="$APP_ROOT/releases/$VERSION"
rm -rf "$RELEASE"; mkdir -p "$RELEASE"
unzip -q "$ZIP" -d "$RELEASE"

# storage/ est partagé entre versions (journaux, fichiers, sessions) ; la
# première release fournit sa structure.
cp -rn "$RELEASE/storage/." "$APP_ROOT/shared/storage/"
rm -rf "$RELEASE/storage"; ln -s "$APP_ROOT/shared/storage" "$RELEASE/storage"

sed -e "s#^APP_URL=.*#APP_URL=https://$DOMAIN#" -e "s#^DB_PASSWORD=.*#DB_PASSWORD=$DB_PASS#" \
    "$RELEASE/deploy/serveur-linux/env.production.example" > "$APP_ROOT/shared/.env"
ln -s "$APP_ROOT/shared/.env" "$RELEASE/.env"

ln -sfn "$RELEASE" "$APP_ROOT/current"
chown -R www-data:www-data "$APP_ROOT"
chmod -R u+rwX,g+rwX "$APP_ROOT/shared/storage" "$RELEASE/bootstrap/cache"

# --- 4. Application ------------------------------------------------------------------
step 4 "Clé, migrations, caches"
cd "$APP_ROOT/current"
sudo -u www-data php artisan key:generate --force --no-interaction >/dev/null
sudo -u www-data php artisan migrate --force --no-interaction
sudo -u www-data php artisan storage:link --force >/dev/null
sudo -u www-data php artisan config:cache >/dev/null
sudo -u www-data php artisan route:cache >/dev/null
sudo -u www-data php artisan view:cache >/dev/null

# --- 5. nginx ----------------------------------------------------------------------
step 5 "nginx pour $DOMAIN"
sed -e "s#__DOMAIN__#$DOMAIN#g" -e "s#__ROOT__#$APP_ROOT#g" \
    "$HERE/nginx.conf.template" > /etc/nginx/sites-available/ecole-haiti
ln -sfn /etc/nginx/sites-available/ecole-haiti /etc/nginx/sites-enabled/ecole-haiti
rm -f /etc/nginx/sites-enabled/default
nginx -t && systemctl reload nginx

# --- 6. HTTPS ---------------------------------------------------------------------------
if [[ -n "$LE_EMAIL" ]]; then
    step 6 "Certificat Let's Encrypt"
    apt-get install -y -qq certbot python3-certbot-nginx
    if certbot --nginx -d "$DOMAIN" -m "$LE_EMAIL" --agree-tos --no-eff-email --redirect --non-interactive; then
        echo "    HTTPS actif, renouvellement automatique (timer certbot)."
    else
        echo "    Certificat non obtenu : le DNS de $DOMAIN pointe-t-il vers ce serveur ?" >&2
        echo "    Relancer plus tard : certbot --nginx -d $DOMAIN" >&2
    fi
else
    step 6 "HTTPS ignoré (aucun e-mail fourni) — certbot --nginx -d $DOMAIN quand le DNS sera prêt"
    sed -i "s#^APP_URL=.*#APP_URL=http://$DOMAIN#; s#^SESSION_SECURE_COOKIE=.*#SESSION_SECURE_COOKIE=false#" "$APP_ROOT/shared/.env"
    sudo -u www-data php artisan config:cache >/dev/null
fi

# --- 7. Pare-feu et sauvegardes ---------------------------------------------------------
step 7 "Pare-feu (ufw) et sauvegarde quotidienne"
if command -v ufw >/dev/null; then
    ufw allow OpenSSH >/dev/null; ufw allow 'Nginx Full' >/dev/null; ufw --force enable >/dev/null
fi
install -m 755 "$HERE/backup.sh" /usr/local/bin/ecole-haiti-backup
cat > /etc/cron.d/ecole-haiti <<CRON
# Sauvegarde de la base chaque nuit à 02:00 (heure du serveur).
0 2 * * * root /usr/local/bin/ecole-haiti-backup >> /var/log/ecole-haiti-backup.log 2>&1
CRON

# --- 8. Établissement ----------------------------------------------------------------------
step 8 "Création de l'établissement et du compte de direction"
sudo -u www-data php artisan school:install

cat <<EOF

================================================================
 École Haïti $VERSION est installée.
   Adresse       : $([[ -n "$LE_EMAIL" ]] && echo https || echo http)://$DOMAIN
   Application   : $APP_ROOT/current
   Configuration : $APP_ROOT/shared/.env  (SMTP à renseigner pour les e-mails)
   Sauvegardes   : /var/backups/ecole-haiti (quotidiennes, 30 conservées)
   Mise à jour   : bash $APP_ROOT/current/deploy/serveur-linux/deploy.sh <nouvelle archive.zip>
================================================================
EOF
