#!/bin/bash

################################################################################
# Script d'installation SPC-Last SANS SUDO sur CentOS 7
# Déploiement dans ~/public_html/app/connect/interface
# Python 3.6.8 déjà installé accessible via python3
################################################################################

# Note: Pas de set -e, on gère les erreurs manuellement pour plus de contrôle

echo "============================================================================"
echo "Installation SPC-Last (sans sudo) sur CentOS 7"
echo "Installation dans le répertoire courant"
echo "============================================================================"
echo ""

# Couleurs pour les messages
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

# Variables
APP_DIR="$(pwd)"
DOWNLOADS_DIR="$(pwd)/spc-downloads"
PYTHON_CMD="python3"

################################################################################
# 1. Vérification de l'environnement
################################################################################
echo -e "${GREEN}[1/5] Vérification de l'environnement...${NC}"

# Vérifier Python
if ! command -v ${PYTHON_CMD} &> /dev/null; then
    echo -e "${RED}Erreur: python3 n'est pas disponible${NC}"
    echo "Demandez à votre administrateur d'installer python3"
    exit 1
fi

PYTHON_VERSION=$(${PYTHON_CMD} --version 2>&1 | grep -oP '\d+\.\d+\.\d+')
echo "Python détecté: ${PYTHON_VERSION}"

if [[ ! "${PYTHON_VERSION}" =~ ^3\.[6-9]\. ]] && [[ ! "${PYTHON_VERSION}" =~ ^3\.1[0-9]\. ]]; then
    echo -e "${RED}Erreur: Python 3.6+ requis, version détectée: ${PYTHON_VERSION}${NC}"
    exit 1
fi

echo -e "${GREEN}✓ Python ${PYTHON_VERSION} est compatible${NC}"

# Vérifier Chrome ou Chromium
CHROME_BINARY=""
CHROME_VERSION=""

echo "Recherche de Chrome ou Chromium..."

if command -v google-chrome-stable &> /dev/null; then
    CHROME_BINARY="google-chrome-stable"
    CHROME_VERSION=$(google-chrome-stable --version 2>/dev/null || echo "unknown")
    echo -e "${GREEN}✓ Chrome installé: ${CHROME_VERSION}${NC}"
elif command -v google-chrome &> /dev/null; then
    CHROME_BINARY="google-chrome"
    CHROME_VERSION=$(google-chrome --version 2>/dev/null || echo "unknown")
    echo -e "${GREEN}✓ Chrome installé: ${CHROME_VERSION}${NC}"
elif command -v chromium-browser &> /dev/null; then
    CHROME_BINARY="chromium-browser"
    CHROME_VERSION=$(chromium-browser --version 2>/dev/null || echo "unknown")
    echo -e "${GREEN}✓ Chromium installé: ${CHROME_VERSION}${NC}"
elif command -v chromium &> /dev/null; then
    CHROME_BINARY="chromium"
    CHROME_VERSION=$(chromium --version 2>/dev/null || echo "unknown")
    echo -e "${GREEN}✓ Chromium installé: ${CHROME_VERSION}${NC}"
else
    echo -e "${RED}✗ Ni Chrome ni Chromium n'est installé${NC}"
    echo -e "${YELLOW}Demandez à votre administrateur d'installer:${NC}"
    echo "   sudo yum install -y chromium chromium-headless"
    echo "   OU"
    echo "   sudo yum install -y google-chrome-stable"
    echo ""
    echo -e "${YELLOW}Le script ne peut pas continuer sans Chrome/Chromium${NC}"
    exit 1
fi

# Vérifier ChromeDriver
CHROMEDRIVER_PATH=""
if command -v chromedriver &> /dev/null; then
    CHROMEDRIVER_PATH=$(which chromedriver)
    CHROMEDRIVER_VERSION=$(chromedriver --version 2>/dev/null)
    echo -e "${GREEN}✓ ChromeDriver installé: ${CHROMEDRIVER_VERSION}${NC}"

    # Vérifier la compatibilité des versions
    CHROME_MAJOR=$(echo "$CHROME_VERSION" | grep -oP '\d+' | head -1)
    DRIVER_MAJOR=$(echo "$CHROMEDRIVER_VERSION" | grep -oP '\d+' | head -1)

    if [ "$CHROME_MAJOR" != "$DRIVER_MAJOR" ]; then
        echo -e "${YELLOW}⚠ Attention: Version mismatch détecté${NC}"
        echo "  Chrome/Chromium: version ${CHROME_MAJOR}.x"
        echo "  ChromeDriver: version ${DRIVER_MAJOR}.x"
        echo ""
        echo -e "${YELLOW}Pour installer ChromeDriver ${CHROME_MAJOR} compatible:${NC}"
        echo "  cd /tmp"
        echo "  wget https://storage.googleapis.com/chrome-for-testing-public/${CHROME_MAJOR}.0.6478.114/linux64/chromedriver-linux64.zip"
        echo "  unzip chromedriver-linux64.zip"
        echo "  sudo mv chromedriver-linux64/chromedriver /usr/local/bin/"
        echo "  sudo chmod +x /usr/local/bin/chromedriver"
        echo ""
        read -p "Continuer quand même ? (y/n) " -n 1 -r
        echo
        if [[ ! $REPLY =~ ^[Yy]$ ]]; then
            exit 1
        fi
    fi
else
    echo -e "${RED}✗ ChromeDriver n'est pas installé${NC}"
    echo -e "${YELLOW}Pour installer ChromeDriver compatible avec ${CHROME_BINARY}:${NC}"

    # Obtenir la version majeure de Chrome/Chromium
    CHROME_MAJOR=$(echo "$CHROME_VERSION" | grep -oP '\d+' | head -1)

    echo "  cd /tmp"
    echo "  wget https://storage.googleapis.com/chrome-for-testing-public/${CHROME_MAJOR}.0.6478.114/linux64/chromedriver-linux64.zip"
    echo "  unzip chromedriver-linux64.zip"
    echo "  sudo mv chromedriver-linux64/chromedriver /usr/local/bin/"
    echo "  sudo chmod +x /usr/local/bin/chromedriver"
    exit 1
fi

################################################################################
# 2. Vérification du répertoire et création des sous-dossiers
################################################################################
echo -e "${GREEN}[2/4] Vérification et création des répertoires...${NC}"

# Vérifier si on est dans le bon répertoire
if [ ! -f "v2/api/flask_server.py" ]; then
    echo -e "${RED}Erreur: Ce script doit être exécuté depuis le répertoire racine du projet${NC}"
    echo "Le fichier v2/api/flask_server.py n'a pas été trouvé"
    echo "Assurez-vous d'être dans ~/public_html/app/connect/interface"
    exit 1
fi

echo "Répertoire courant: ${APP_DIR}"

# Créer les sous-répertoires nécessaires
mkdir -p ${DOWNLOADS_DIR}
mkdir -p ${APP_DIR}/logs
mkdir -p ${APP_DIR}/credentials
mkdir -p ${APP_DIR}/data
mkdir -p ${APP_DIR}/selling

echo -e "${GREEN}✓ Répertoires vérifiés et créés${NC}"

################################################################################
# 3. Configuration de l'environnement Python
################################################################################
echo -e "${GREEN}[3/4] Configuration de l'environnement Python...${NC}"

# Créer l'environnement virtuel
echo "Création de l'environnement virtuel..."
${PYTHON_CMD} -m venv ${APP_DIR}/venv

# Activer et installer les dépendances
echo "Installation des dépendances Python..."
source ${APP_DIR}/venv/bin/activate

pip install --upgrade pip

# Pour Python 3.6, installer pydantic v1
pip install \
    selenium \
    flask \
    'pydantic<2.0' \
    python-dotenv \
    requests \
    xlrd \
    openpyxl \
    pyyaml \
    gunicorn \
    pyotp

deactivate

echo -e "${GREEN}✓ Environnement Python configuré${NC}"

################################################################################
# 4. Configuration de l'environnement
################################################################################
echo -e "${GREEN}[4/4] Configuration de l'environnement...${NC}"

# Copier et adapter .env
if [ -f "${APP_DIR}/v2/.env.production.centos7" ]; then
    cp ${APP_DIR}/v2/.env.production.centos7 ${APP_DIR}/v2/.env

    # Adapter les chemins dans .env
    sed -i "s|ROOT_PATH=.*|ROOT_PATH=${APP_DIR}|g" ${APP_DIR}/v2/.env
    sed -i "s|CSV_ROOT_PATH=.*|CSV_ROOT_PATH=${DOWNLOADS_DIR}|g" ${APP_DIR}/v2/.env

    echo -e "${GREEN}✓ Fichier .env créé et configuré${NC}"
else
    echo -e "${YELLOW}⚠ Fichier .env.production.centos7 non trouvé${NC}"
    echo "Vous devrez créer ${APP_DIR}/v2/.env manuellement"
fi

# Créer un script de démarrage (développement)
cat > ${APP_DIR}/start.sh << 'EOF'
#!/bin/bash
cd "$(dirname "$0")"
source venv/bin/activate
python v2/api/flask_server.py
EOF

chmod +x ${APP_DIR}/start.sh

# Créer un script de démarrage PRODUCTION avec Gunicorn
cat > ${APP_DIR}/start_production.sh << 'EOF'
#!/bin/bash
cd "$(dirname "$0")"

# Vérifier si le serveur tourne déjà
if [ -f gunicorn.pid ] && kill -0 $(cat gunicorn.pid) 2>/dev/null; then
    echo "❌ Erreur: Serveur déjà en cours d'exécution (PID: $(cat gunicorn.pid))"
    echo "Utilisez ./stop.sh pour l'arrêter d'abord"
    exit 1
fi

# Activer l'environnement virtuel
source venv/bin/activate

# Charger les variables d'environnement
if [ -f v2/.env ]; then
    export $(grep -v '^#' v2/.env | xargs)
else
    echo "⚠️  Avertissement: Fichier .env non trouvé"
fi

# Créer le répertoire logs s'il n'existe pas
mkdir -p logs

# Démarrer Gunicorn avec 4 workers
gunicorn --chdir v2 \
    --bind 127.0.0.1:5000 \
    --workers 4 \
    --timeout 120 \
    --access-logfile ../logs/access.log \
    --error-logfile ../logs/error.log \
    --log-level info \
    --daemon \
    --pid ../gunicorn.pid \
    api.flask_server:app

# Attendre que le PID soit créé
sleep 2

# Vérifier que le serveur a démarré
if [ -f gunicorn.pid ] && kill -0 $(cat gunicorn.pid) 2>/dev/null; then
    echo "✅ Serveur Gunicorn démarré avec succès (PID: $(cat gunicorn.pid))"
    echo "📊 Logs: tail -f logs/access.log logs/error.log"
    echo "🔍 Status: ps aux | grep gunicorn"
else
    echo "❌ Erreur: Le serveur n'a pas démarré correctement"
    echo "📋 Vérifiez les logs: cat logs/error.log"
    exit 1
fi
EOF

chmod +x ${APP_DIR}/start_production.sh

# Créer un script d'arrêt
cat > ${APP_DIR}/stop.sh << 'EOF'
#!/bin/bash
cd "$(dirname "$0")"

# Arrêter Gunicorn si pid existe
if [ -f gunicorn.pid ]; then
    kill $(cat gunicorn.pid) 2>/dev/null
    rm -f gunicorn.pid
    echo "Serveur Gunicorn arrêté"
fi

# Arrêter Flask dev si existe
pkill -f "python.*flask_server.py" 2>/dev/null
echo "Serveur arrêté"
EOF

chmod +x ${APP_DIR}/stop.sh

# Créer un script de redémarrage
cat > ${APP_DIR}/restart.sh << 'EOF'
#!/bin/bash
cd "$(dirname "$0")"
./stop.sh
sleep 2
nohup ./start.sh > logs/server.log 2>&1 &
echo "Serveur redémarré (PID: $!)"
echo "Logs: tail -f logs/server.log"
EOF

chmod +x ${APP_DIR}/restart.sh

echo -e "${GREEN}✓ Scripts de gestion créés${NC}"

################################################################################
# Résumé et instructions finales
################################################################################
echo ""
echo "============================================================================"
echo -e "${GREEN}Installation terminée avec succès !${NC}"
echo "============================================================================"
echo ""
echo "Emplacement de l'application:"
echo "  ${APP_DIR}"
echo ""
echo "Prochaines étapes :"
echo ""
echo "1. Configurer les credentials Amadeus :"
echo "   cd ${APP_DIR}"
echo "   source venv/bin/activate"
echo "   python v2/setup_credentials.py"
echo ""
echo "2. Vérifier la configuration (.env) :"
echo "   nano ${APP_DIR}/v2/.env"
echo "   # Adapter les tokens, URLs, etc."
echo ""
echo "3. Démarrer le serveur manuellement (pour tester) :"
echo "   cd ${APP_DIR}"
echo "   ./start.sh"
echo ""
echo "4. Démarrer en PRODUCTION avec Gunicorn (recommandé) :"
echo "   cd ${APP_DIR}"
echo "   ./start_production.sh"
echo ""
echo "5. Scripts de gestion disponibles :"
echo "   ${APP_DIR}/start.sh             - Démarrer le serveur (développement)"
echo "   ${APP_DIR}/start_production.sh  - Démarrer avec Gunicorn (production)"
echo "   ${APP_DIR}/stop.sh              - Arrêter le serveur"
echo "   ${APP_DIR}/restart.sh           - Redémarrer le serveur"
echo ""
echo "6. Voir les logs :"
echo "   tail -f ${APP_DIR}/logs/server.log"
echo "   tail -f ${APP_DIR}/v2/estair_connect.log"
echo ""
echo "7. Tester l'API :"
echo "   curl http://localhost:5000/api/v1/health"
echo ""
echo "============================================================================"
echo -e "${YELLOW}Notes importantes :${NC}"
echo "- Chrome s'exécutera en mode HEADLESS (configuré dans .env)"
echo "- L'application écoutera sur le port 5000 (modifiable dans .env)"
echo "- Les téléchargements seront dans: ${DOWNLOADS_DIR}"
echo "- Les logs sont dans: ${APP_DIR}/logs/"
echo ""
echo "Si Chrome ou ChromeDriver ne sont pas installés, demandez à votre"
echo "administrateur système d'exécuter le script: install_centos7.sh"
echo "============================================================================"
