#!/bin/bash


set -e

# Conversion CRLF -> LF si nécessaire (Windows vs WSL)
for file in init-project.sh prepare-init-archive.sh docker/docker-entrypoint.sh; do
    if [ -f "$file" ]; then
        dos2unix "$file" 2>/dev/null || echo "ℹ️ dos2unix non installé, pensez à convertir $file manuellement si nécessaire."
    fi
done

# Vérification que Docker fonctionne dans cette distribution WSL
if grep -qi microsoft /proc/version; then
    echo "💡 Environnement WSL détecté."

    if ! docker info >/dev/null 2>&1; then
        echo ""
        echo "❌ Docker n'est pas accessible dans cette distribution WSL."
        echo ""
        echo "👉 Ouvre Docker Desktop, va dans :"
        echo "   Settings > Resources > WSL Integration"
        echo "   ✅ Active 'Enable integration with my default WSL distro'"
        echo "   ✅ Coche aussi manuellement ta distribution (Ubuntu, Debian...)"
        echo ""
        echo "⛔ Abandon du script."
        exit 1
    fi
fi

# Installation automatique de NVM et zip si absents
if ! command -v nvm >/dev/null 2>&1; then
    echo "📦 Installation de NVM (Node Version Manager)..."
    PROFILE=/dev/null curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash
    export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")"
    [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
fi

if ! command -v zip >/dev/null 2>&1; then
    echo "❌ 'zip' n'est pas installé. Veuillez l'installer pour continuer."
    echo ""
    echo "👉 Exemple d'installation selon votre système :"
    echo "   - Ubuntu / Debian / WSL : sudo apt install zip"
    echo "   - MacOS avec Homebrew :   brew install zip"
    echo "   - Windows (WSL recommandé) : sudo apt install zip"
    echo ""
    echo "⛔ Abandon du script."
    exit 1
fi

# Vérification de la présence de make
if ! command -v make >/dev/null 2>&1; then
    echo "❌ 'make' n'est pas installé. Veuillez l'installer pour continuer."
    echo ""
    echo "👉 Exemple d'installation selon votre système :"
    echo "   - Ubuntu / Debian / WSL : sudo apt install make"
    echo "   - MacOS avec Homebrew :   brew install make"
    echo "   - Windows (WSL recommandé) : sudo apt install make"
    echo ""
    echo "⛔ Abandon du script."
    exit 1
fi

# Vérification des commandes essentielles
for cmd in id whoami docker zip make; do
    if ! command -v $cmd >/dev/null 2>&1; then
        echo "❌ '$cmd' est requis mais non trouvé. Veuillez l'installer."
        exit 1
    fi
done

# Définition des variables Docker UID
USER_ID=$(id -u)
GROUP_ID=$(id -g)
UNAME=$(whoami)
DOCKER_UID="$USER_ID:$GROUP_ID"

# Export des variables
export USER_ID
export GROUP_ID
export UNAME
export DOCKER_UID

# Affichage info utilisateur
echo "ℹ️ Utilisateur Docker dynamique détecté : UID=$USER_ID, GID=$GROUP_ID, UNAME=$UNAME"

# Variables
DB_CONTAINER_NAME="db"
DB_NAME="media_manager"
DUMP_PATH="dev-init-archive/dump.sql"
ENV_PATH="dev-init-archive/.env"
FLAG_FILE=".dev_project_initialized"

# Vérification de la présence du dossier archive/
if [ -d "dev-init-archive" ]; then
    echo "🧹 Suppression du dossier 'dev-init-archive/' existant..."
    echo "🧹 Suppression du dossier 'dev-init-archive/' existant..."
    rm -rf dev-init-archive
fi

if [ -f "dev-init-archive.zip" ]; then
    echo "📦 Archive dev-init-archive.zip détectée, extraction en cours..."
    unzip -o dev-init-archive.zip -d dev-init-archive

    if [ $? -eq 0 ]; then
      echo "✅  Archive extraite avec succès."
      cp "$ENV_PATH" .

      # Mise à jour des variables Docker dans le .env après copie depuis l'archive
      if [ -f ".env" ]; then
        echo "🔧 Mise à jour des variables UID/GID/DOCKER_UID/UNAME dans le .env..."

        sed -i.bak -E "s/^UID=.*/UID=\"$USER_ID\"/" .env
        sed -i.bak -E "s/^GID=.*/GID=\"$GROUP_ID\"/" .env
        sed -i.bak -E "s/^DOCKER_UID=.*/DOCKER_UID=\"$DOCKER_UID\"/" .env
        sed -i.bak -E "s/^UNAME=.*/UNAME=\"$UNAME\"/" .env

        rm -f .env.bak
        echo "✅ Variables Docker mises à jour dans le .env."
      else
        echo "❌ Fichier .env introuvable à la racine du projet après extraction."
        exit 1
      fi
    else
      echo "❌ Erreur lors de l'extraction de l'archive."
      exit 1
    fi
else
    echo "❌ Aucun fichier 'dev-init-archive.zip' trouvé. Veuillez demander au techlead du projet de le fournir et le placer à la racine du projet."
    exit 1
fi

if [ -f "$FLAG_FILE" ]; then
    echo "⚡ Projet déjà initialisé (à partir de $FLAG_FILE)."
    echo "🔧 make détecté, exécution de 'make build'..."
    make build
    if [ $? -eq 0 ]; then
      echo "✅  'make build' exécuté avec succès."
    else
      echo "❌ Erreur lors de l'exécution de 'make build'."
      exit 1
    fi
else
    echo "🚀 Première initialisation du projet..."

    # Create docker network
    echo "🔨 Build des conteneurs Docker... (prend un peu de temps)"
    if ! docker network ls | grep -q 'shared'; then
      docker network create shared
    fi

    # Build Docker
    echo "🔨 Build des conteneurs Docker... (prend un peu de temps)"
    DOCKER_UID=$DOCKER_UID docker compose build --no-cache
    if [ $? -eq 0 ]; then
      echo "✅  Build des conteneurs réussi."
    else
      echo "❌ Erreur lors du build des conteneurs."
      exit 1
    fi

    # Docker Up
    echo "🛠️ Démarrage des conteneurs Docker..."
    DOCKER_UID=$DOCKER_UID docker compose up -d
    if [ $? -eq 0 ]; then
      echo "✅  Démarrage des conteneurs réussi."
    else
      echo "❌ Erreur au démarrage des conteneurs."
      exit 1
    fi

    # Attente pour que la base de données soit prête
    echo "⏳ Attente que MySQL soit disponible..."
    until DOCKER_UID=$DOCKER_UID docker compose exec $DB_CONTAINER_NAME mysqladmin ping -h "127.0.0.1" --silent; do
      sleep 1
    done

    # Vérification présence du dump.sql et du .env
    echo "🔍 Vérification du contenu de dev-init-archive/..."
    if [ ! -f "$DUMP_PATH" ]; then
        echo "❌ dump.sql introuvable après extraction. Abandon."
        exit 1
    fi

    if [ ! -f "$ENV_PATH" ]; then
        echo "❌ .env introuvable après extraction. Abandon."
        exit 1
    fi

    echo "✅  Fichiers dump.sql et .env présents."

    # Import du dump de base de données
    echo "🛢️ Import du dump SQL dans la base $DB_NAME..."
    DOCKER_UID=$DOCKER_UID docker compose cp "$DUMP_PATH" $DB_CONTAINER_NAME:/tmp/dump.sql
    if [ $? -ne 0 ]; then
      echo "❌ Erreur lors de la copie du dump dans le conteneur."
      exit 1
    fi
    DOCKER_UID=$DOCKER_UID docker compose exec $DB_CONTAINER_NAME sh -c "mysql -u root -proot < /tmp/dump.sql"
    if [ $? -eq 0 ]; then
      echo "✅  Dump SQL importé avec succès."
    else
      echo "❌ Erreur lors de l'import du dump SQL."
      exit 1
    fi

    # Création du flag file
    touch "$FLAG_FILE"
    echo "✅   Fichier de flag '$FLAG_FILE' créé."

    echo "🔧 Exécution de 'make up'..."
    make up
    if [ $? -eq 0 ]; then
      echo "✅  'make up' exécuté avec succès."
    else
      echo "❌ Erreur lors de l'exécution de 'make up'."
      exit 1
    fi

     # Rappel modification fichier hosts
        echo ""
        echo "🖋 Pensez à modifier votre fichier hosts :"
        echo "  - Sous Linux/WSL : /etc/hosts"
        echo "  - Sous Windows : C:\\Windows\\System32\\drivers\\etc\\hosts"
        echo ""
cat << EOF
    127.0.0.1       api.prod.stream-up.local
    127.0.0.1       root.stream-up.local
    127.0.0.1       default.prod.stream-up.local
    127.0.0.1       jsbeta.stream-up.local
    127.0.0.1       imgbeta.stream-up.local
    127.0.0.1       cdnfiles.stream-up.local
    127.0.0.1       files.stream-up.local
    127.0.0.1       cdncache.stream-up.local
    127.0.0.1       io.stream-up.local
    127.0.0.1       wslivebeta.stream-up.local
    127.0.0.1       wschatbeta.stream-up.local
    127.0.0.1       mykey4-ers.prod.stream-up.local
EOF
        echo ""

        # Rappel certificat SSL
        echo "🔒 Pensez aussi à générer les certificats SSL (voir docs/technical/selfSignCertficates.md)"
fi

# Vérification de la présence du dossier archive et on clean
if [ -d "dev-init-archive" ]; then
    echo "🧹 Suppression du dossier 'dev-init-archive/' existant..."
    rm -rf dev-init-archive
fi

# Fin
echo ""
echo "🎉 Projet Media Manager prêt !"
echo "🔗 Accédez au projet : https://mykey4-ers.prod.stream-up.local/"
echo ""