#!/bin/bash
# ============================================================================
# ODETOOL — Installation d'un serveur de production (Ubuntu 24.04 LTS)
# ============================================================================
# À exécuter EN ROOT sur un VPS vierge (cf. docs/DEPLOIEMENT.md).
# Installe : Apache + PHP 8.3 + MySQL 8, le compte MySQL applicatif, le vhost,
# le pare-feu, les mises à jour automatiques et la sauvegarde quotidienne.
# Le code d'ODETOOL est ensuite déployé dans /var/www/odetool (rsync/git).
# L'HTTPS (certbot) se configure après le pointage DNS du nom de domaine.
# ============================================================================
set -euo pipefail

WEBROOT="/var/www/odetool"
APP_DB_USER="odetool_app"
APP_DB_PASS="$(openssl rand -base64 24 | tr -d '/+=' | head -c 28)"
TZ="Europe/Paris"

echo "═══ 1/7 Système de base ═══"
timedatectl set-timezone "$TZ" 2>/dev/null || true
export DEBIAN_FRONTEND=noninteractive
apt-get update -qq
apt-get upgrade -y -qq
apt-get install -y -qq apache2 mysql-server php libapache2-mod-php \
  php-mysql php-mbstring php-xml php-curl php-zip openssl git \
  certbot python3-certbot-apache unattended-upgrades

echo "═══ 2/7 PHP (durcissement) ═══"
# php.ini du module Apache (indépendant de la version PHP : /etc/php/<v>/apache2/)
PHP_INI="$(ls /etc/php/*/apache2/php.ini 2>/dev/null | head -1)"
if [ -z "$PHP_INI" ]; then echo "ERREUR : php.ini apache2 introuvable"; exit 1; fi
echo "  php.ini : $PHP_INI"
php_ini_set() { # clé valeur
  if grep -q "^;\?$1 *=" "$PHP_INI" 2>/dev/null; then
    sed -i "s|^;\?$1 *=.*|$1 = $2|" "$PHP_INI"
  else
    echo "$1 = $2" >> "$PHP_INI"
  fi
}
php_ini_set display_errors Off
php_ini_set log_errors On
php_ini_set expose_php Off
php_ini_set session.cookie_httponly 1
php_ini_set session.cookie_samesite Lax
php_ini_set session.use_strict_mode 1

echo "═══ 3/7 MySQL : compte applicatif ═══"
mysql --execute "
CREATE USER IF NOT EXISTS '$APP_DB_USER'@'localhost' IDENTIFIED BY '$APP_DB_PASS';
ALTER USER '$APP_DB_USER'@'localhost' IDENTIFIED BY '$APP_DB_PASS';
CREATE DATABASE IF NOT EXISTS odetool_clipboard CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
GRANT ALL PRIVILEGES ON odetool_clipboard.* TO '$APP_DB_USER'@'localhost';
GRANT ALL PRIVILEGES ON \`workspace\\\_%\`.* TO '$APP_DB_USER'@'localhost';
FLUSH PRIVILEGES;"

echo "═══ 4/7 Vhost Apache ═══"
mkdir -p "$WEBROOT"
cat > /etc/apache2/sites-available/odetool.conf <<EOF
<VirtualHost *:80>
    ServerName _default_
    DocumentRoot $WEBROOT

    <Directory $WEBROOT>
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog \${APACHE_LOG_DIR}/odetool-error.log
    CustomLog \${APACHE_LOG_DIR}/odetool-access.log combined
</VirtualHost>
EOF
a2dissite 000-default
a2ensite odetool
a2enmod headers rewrite
systemctl reload apache2

echo "═══ 5/7 Pare-feu ═══"
if command -v ufw >/dev/null; then
  ufw --force enable
  ufw allow 22/tcp   # SSH
  ufw allow 80/tcp   # HTTP
  ufw allow 443/tcp  # HTTPS
fi

echo "═══ 6/7 Sauvegarde quotidienne (mysqldump, rétention 30 jours) ═══"
mkdir -p /var/backups/odetool
cat > /usr/local/bin/odetool-sauvegarde.sh <<'EOS'
#!/bin/bash
set -uo pipefail
DEST=/var/backups/odetool/$(date +%Y-%m-%d)
mkdir -p "$DEST"
for DB in $(mysql -N -u odetool_app -p"$(grep -oP "'password' => '\K[^']*" /var/www/odetool/api/Config/db_credentials.php)" -e "SHOW DATABASES" | grep -E '^(odetool_clipboard|workspace_.+)$'); do
  mysqldump --single-transaction --quick -u odetool_app -p"$(grep -oP "'password' => '\K[^']*" /var/www/odetool/api/Config/db_credentials.php)" --databases "$DB" | gzip > "$DEST/$DB.sql.gz"
done
find /var/backups/odetool -maxdepth 1 -type d -name "20*" -mtime +30 -exec rm -rf {} \;
EOS
chmod +x /usr/local/bin/odetool-sauvegarde.sh
( crontab -l 2>/dev/null; echo "30 3 * * * /usr/local/bin/odetool-sauvegarde.sh > /var/log/odetool-backup.log 2>&1" ) | crontab -

echo "═══ 7/7 Identifiants applicatifs ═══"
# Écrit db_credentials.php dès que le code est déployé (idempotent : on le crée
# au bon endroit si le squelette existe, sinon on le prépare ici pour le déploiement)
mkdir -p "$WEBROOT/api/Config"
cat > "$WEBROOT/api/Config/db_credentials.php" <<EOF
<?php
// Identifiants MySQL du serveur de production — FICHIER NON VERSIONNÉ
return [
    'host' => 'localhost',
    'user' => '$APP_DB_USER',
    'password' => '$APP_DB_PASS',
];
EOF
chmod 640 "$WEBROOT/api/Config/db_credentials.php"
chown -R www-data:www-data "$WEBROOT" 2>/dev/null || true

cat <<EOF

════════════════════════════════════════════════════════════════
  INSTALLATION TERMINÉE
  Compte MySQL applicatif : $APP_DB_USER
  Mot de passe            : $APP_DB_PASS
  (consigné uniquement dans $WEBROOT/api/Config/db_credentials.php)
  Prochaines étapes (depuis le poste de développement) :
  1. Déployer le code dans $WEBROOT (rsync ou git)
  2. Migrer les bases (odetool_clipboard + workspaces de démo)
  3. Pointer le DNS, puis : certbot --apache -d <domaine>
  4. Activer 'secure' dans api/Config/auth_guard.php (cookie HTTPS)
════════════════════════════════════════════════════════════════
EOF
