#!/bin/bash

# 🚀 Script d'installation automatisé - E-Gestion Bar/Maquis
# Usage: sudo bash install.sh

set -e

# Couleurs pour l'affichage
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# Fonction pour afficher les messages
print_status() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

print_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

print_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

print_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# Vérification des privilèges root
if [[ $EUID -ne 0 ]]; then
   print_error "Ce script doit être exécuté en tant que root (sudo)"
   exit 1
fi

print_status "🚀 Début de l'installation d'E-Gestion Bar/Maquis..."

# Variables de configuration
DOMAIN=""
DB_PASSWORD=""
APP_DIR="/var/www/egestion"
BACKUP_DIR="/var/backups/egestion"

# Demander les informations de configuration
echo ""
print_status "Configuration de l'installation..."
read -p "Entrez votre nom de domaine (ex: monbar.com): " DOMAIN
read -s -p "Entrez un mot de passe pour la base de données: " DB_PASSWORD
echo ""

if [[ -z "$DOMAIN" || -z "$DB_PASSWORD" ]]; then
    print_error "Le nom de domaine et le mot de passe sont requis"
    exit 1
fi

print_status "Configuration validée :"
echo "  - Domaine : $DOMAIN"
echo "  - Répertoire : $APP_DIR"
echo "  - Sauvegarde : $BACKUP_DIR"

# 1. Mise à jour du système
print_status "📦 Mise à jour du système..."
apt update && apt upgrade -y

# 2. Installation des paquets nécessaires
print_status "📦 Installation des paquets requis..."
apt install -y nginx mysql-server php8.1-fpm php8.1-mysql php8.1-xml php8.1-curl php8.1-gd php8.1-mbstring php8.1-zip php8.1-bcmath php8.1-opcache unzip git curl

# 3. Installation de Composer
print_status "📦 Installation de Composer..."
if ! command -v composer &> /dev/null; then
    curl -sS https://getcomposer.org/installer | php
    mv composer.phar /usr/local/bin/composer
    chmod +x /usr/local/bin/composer
fi

# 4. Configuration de MySQL
print_status "🗄️ Configuration de MySQL..."
mysql -e "CREATE DATABASE IF NOT EXISTS egestion CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
mysql -e "CREATE USER IF NOT EXISTS 'egestion_user'@'localhost' IDENTIFIED BY '$DB_PASSWORD';"
mysql -e "GRANT ALL PRIVILEGES ON egestion.* TO 'egestion_user'@'localhost';"
mysql -e "FLUSH PRIVILEGES;"

# 5. Déploiement de l'application
print_status "📁 Déploiement de l'application..."
if [ -d "$APP_DIR" ]; then
    print_warning "Le répertoire $APP_DIR existe déjà. Sauvegarde..."
    mv "$APP_DIR" "${APP_DIR}_backup_$(date +%Y%m%d_%H%M%S)"
fi

# Créer le répertoire et cloner (simulation pour ce script)
mkdir -p "$APP_DIR"
cd "$APP_DIR"

# Copier les fichiers du projet (dans un vrai déploiement, on clonerait depuis Git)
print_status "📁 Copie des fichiers de l'application..."
# git clone https://github.com/votre-repo/egestion.git .

# 6. Installation des dépendances
print_status "📦 Installation des dépendances Composer..."
composer install --optimize-autoloader --no-dev

# 7. Configuration de l'environnement
print_status "⚙️ Configuration de l'environnement..."
cp .env.example .env

# Générer la clé d'application
php artisan key:generate

# Mettre à jour le fichier .env
sed -i "s/APP_URL=.*/APP_URL=https:\/\/$DOMAIN/" .env
sed -i "s/DB_DATABASE=.*/DB_DATABASE=egestion/" .env
sed -i "s/DB_USERNAME=.*/DB_USERNAME=egestion_user/" .env
sed -i "s/DB_PASSWORD=.*/DB_PASSWORD=$DB_PASSWORD/" .env
sed -i "s/APP_DEBUG=.*/APP_DEBUG=false/" .env
sed -i "s/APP_ENV=.*/APP_ENV=production/" .env

# 8. Configuration des permissions
print_status "🔐 Configuration des permissions..."
chown -R www-data:www-data "$APP_DIR"
chmod -R 755 "$APP_DIR"
chmod -R 775 "$APP_DIR/storage" "$APP_DIR/bootstrap/cache"

# 9. Migration et seeding de la base de données
print_status "🗄️ Migration de la base de données..."
php artisan migrate --force
php artisan db:seed --force

# 10. Optimisation pour la production
print_status "⚡ Optimisation pour la production..."
php artisan config:cache
php artisan route:cache
php artisan view:cache

# 11. Configuration Nginx
print_status "🌐 Configuration de Nginx..."
cat > /etc/nginx/sites-available/egestion << EOF
server {
    listen 80;
    server_name $DOMAIN www.$DOMAIN;
    root $APP_DIR/public;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-Content-Type-Options "nosniff";

    index index.php;

    charset utf-8;

    location / {
        try_files \$uri \$uri/ /index.php?\$query_string;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    error_page 404 /index.php;

    location ~ \.php\$ {
        fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
        fastcgi_param SCRIPT_FILENAME \$realpath_root\$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}
EOF

# Activer le site
ln -sf /etc/nginx/sites-available/egestion /etc/nginx/sites-enabled/
rm -f /etc/nginx/sites-enabled/default
nginx -t
systemctl reload nginx

# 12. Configuration SSL
print_status "🔒 Installation du certificat SSL..."
apt install -y certbot python3-certbot-nginx
certbot --nginx -d "$DOMAIN" -d "www.$DOMAIN" --non-interactive --agree-tos --email admin@$DOMAIN

# 13. Configuration du pare-feu
print_status "🛡️ Configuration du pare-feu..."
ufw allow 'Nginx Full'
ufw allow OpenSSH
ufw --force enable

# 14. Configuration des tâches cron
print_status "⏰ Configuration des tâches cron..."
(crontab -l 2>/dev/null; echo "* * * * * cd $APP_DIR && php artisan schedule:run >> /dev/null 2>&1") | crontab -

# 15. Script de sauvegarde
print_status "💾 Configuration de la sauvegarde automatique..."
mkdir -p "$BACKUP_DIR"

cat > "$APP_DIR/backup.sh" << EOF
#!/bin/bash
DATE=\$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="$BACKUP_DIR"
DB_NAME="egestion"
DB_USER="egestion_user"
DB_PASS="$DB_PASSWORD"

# Créer le répertoire de sauvegarde
mkdir -p \$BACKUP_DIR

# Sauvegarde de la base de données
mysqldump -u \$DB_USER -p\$DB_PASS \$DB_NAME > \$BACKUP_DIR/database_\$DATE.sql

# Sauvegarde des fichiers uploadés
if [ -d "$APP_DIR/storage/app/public" ]; then
    tar -czf \$BACKUP_DIR/uploads_\$DATE.tar.gz -C $APP_DIR storage/app/public
fi

# Supprimer les sauvegardes de plus de 30 jours
find \$BACKUP_DIR -name "*.sql" -mtime +30 -delete
find \$BACKUP_DIR -name "*.tar.gz" -mtime +30 -delete

echo "Sauvegarde terminée : \$DATE"
EOF

chmod +x "$APP_DIR/backup.sh"

# Ajouter la sauvegarde quotidienne au crontab
(crontab -l 2>/dev/null; echo "0 2 * * * $APP_DIR/backup.sh >> /var/log/backup.log 2>&1") | crontab -

# 16. Changement des mots de passe par défaut
print_status "🔐 Changement des mots de passe par défaut..."
php artisan tinker --execute="
\$admin = \App\Models\Employee::where('email', 'admin@egestion.com')->first();
if (\$admin) {
    \$admin->update(['password' => bcrypt('AdminSecure123!')]);
}

\$manager = \App\Models\Employee::where('email', 'manager@egestion.com')->first();
if (\$manager) {
    \$manager->update(['password' => bcrypt('ManagerSecure123!')]);
}

\$vendeur = \App\Models\Employee::where('email', 'vendeur@egestion.com')->first();
if (\$vendeur) {
    \$vendeur->update(['password' => bcrypt('VendeurSecure123!')]);
}
"

# 17. Configuration des logs
print_status "📝 Configuration des logs..."
chown -R www-data:www-data "$APP_DIR/storage/logs"
chmod -R 775 "$APP_DIR/storage/logs"

# 18. Test final
print_status "🧪 Test de l'installation..."
if curl -s -o /dev/null -w "%{http_code}" "https://$DOMAIN" | grep -q "200\|302"; then
    print_success "✅ L'application est accessible !"
else
    print_warning "⚠️ L'application pourrait ne pas être encore accessible. Vérifiez la configuration."
fi

# 19. Affichage des informations finales
echo ""
print_success "🎉 Installation terminée avec succès !"
echo ""
echo "📋 Informations importantes :"
echo "  🌐 URL de l'application : https://$DOMAIN"
echo "  📁 Répertoire : $APP_DIR"
echo "  💾 Sauvegardes : $BACKUP_DIR"
echo ""
echo "🔐 Comptes par défaut :"
echo "  👑 Admin : admin@egestion.com / AdminSecure123!"
echo "  👨‍💼 Manager : manager@egestion.com / ManagerSecure123!"
echo "  👤 Vendeur : vendeur@egestion.com / VendeurSecure123!"
echo ""
echo "⚠️ IMPORTANT : Changez ces mots de passe immédiatement !"
echo ""
echo "📞 Support :"
echo "  - Logs : $APP_DIR/storage/logs/laravel.log"
echo "  - Configuration : $APP_DIR/.env"
echo "  - Sauvegarde : $APP_DIR/backup.sh"
echo ""
print_success "🚀 Votre système de gestion bar/maquis est maintenant opérationnel !" 