#!/bin/bash

# Script de déploiement optimisé de Cleo
# Version: 2.1 - Supporte déploiement DEV et PROD
# Usage: ./deploy-cleo.sh [pra]
#   Sans argument : Déploie depuis local vers IN3/dva-front (DEV)
#   Avec 'pra'   : Déploie depuis IN3/dva-front vers IN4/pra-front (PROD)

cd /home/pierre/dev/cleo

# Détecter le mode de déploiement
DEPLOY_MODE=${1:-dev}

if [ "$DEPLOY_MODE" = "pra" ]; then
  # Configuration PROD : IN3/dva-front → IN4/pra-front
  SOURCE_HOST=11.1.2.1
  SOURCE_SSH_USER=root
  SOURCE_SSH_PORT=22
  SOURCE_SSH_KEY=/home/pierre/.ssh/id_rsa_mbpi
  SOURCE_CT_PROJECT=default
  SOURCE_CT_NAME=dva-front
  SOURCE_DEPLOY_DIR=/var/www/cleo

  TARGET_HOST=11.1.2.14
  TARGET_SSH_USER=root
  TARGET_SSH_PORT=22
  TARGET_SSH_KEY=/home/pierre/.ssh/id_rsa_mbpi
  TARGET_CT_PROJECT=default
  TARGET_CT_NAME=pra-front
  TARGET_DEPLOY_DIR=/var/www/cleo

  APP_NAME=cleo
  SKIP_ENV=true
else
  # Configuration DEV : local → IN3/dva-front
  HOST_SSH_HOST=195.154.80.116
  HOST_SSH_USER=root
  HOST_SSH_PORT=22
  HOST_SSH_KEY=/home/pierre/.ssh/id_rsa_mbpi

  CT_PROJECT_NAME=default
  CT_NAME=dva-front
  CT_IP=13.23.33.42
  DEPLOY_DIR=/var/www
  APP_NAME=cleo
  SKIP_ENV=false
fi

# Propriétaire et groupe pour les fichiers et dossiers de destination
OWNER=nobody
GROUP=nginx

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

# Définir les options SSH
SSH_OPTS="-p $HOST_SSH_PORT"
if [ ! -z "$HOST_SSH_KEY" ]; then
  SSH_OPTS="$SSH_OPTS -i $HOST_SSH_KEY"
fi

# Afficher les paramètres
echo -e "${GREEN}=== Déploiement optimisé CLEO ===${NC}"
if [ "$DEPLOY_MODE" = "pra" ]; then
  echo "Mode: PRODUCTION (DEV → PROD)"
  echo "Source: $SOURCE_CT_NAME ($SOURCE_DEPLOY_DIR)"
  echo "Destination: $TARGET_CT_NAME ($TARGET_DEPLOY_DIR)"
  echo "Note: Le fichier .env ne sera PAS écrasé"
else
  echo "Mode: DÉVELOPPEMENT (Local → DEV)"
  echo "Serveur hôte: $HOST_SSH_USER@$HOST_SSH_HOST:$HOST_SSH_PORT"
  echo "Conteneur: $CT_NAME"
  echo "Déploiement: $DEPLOY_DIR/$APP_NAME"
fi
echo "=================================="

if [ "$DEPLOY_MODE" = "pra" ]; then
  # ===== MODE PROD: Déploiement IN3/dva-front → IN4/pra-front =====

  echo -e "${YELLOW}1. Création de l'archive depuis IN3/dva-front...${NC}"

  # Définir les options SSH pour source et target
  SOURCE_SSH_OPTS="-p $SOURCE_SSH_PORT -i $SOURCE_SSH_KEY"
  TARGET_SSH_OPTS="-p $TARGET_SSH_PORT -i $TARGET_SSH_KEY"

  # Définir les options SCP (port avec -P majuscule)
  SOURCE_SCP_OPTS="-P $SOURCE_SSH_PORT -i $SOURCE_SSH_KEY"
  TARGET_SCP_OPTS="-P $TARGET_SSH_PORT -i $TARGET_SSH_KEY"

  # Script sur IN3 pour créer l'archive
  SOURCE_SCRIPT="
set -e
incus project switch $SOURCE_CT_PROJECT
echo 'Création de l archive depuis dva-front...'
incus exec $SOURCE_CT_NAME -- sh -c '
  cd $SOURCE_DEPLOY_DIR && \
  tar -czf /tmp/cleo-prod.tar.gz \
    --exclude=\".git\" \
    --exclude=\"log/*.log\" \
    --exclude=\"pub/files/upload/*\" \
    --exclude=\"docs\" \
    --exclude=\"migration\" \
    --exclude=\".claude\" \
    --exclude=\".vscode\" \
    --exclude=\"vendor\" \
    --exclude=\"backup_*\" \
    --exclude=\"*.tar.gz\" \
    --exclude=\".env\" \
    --exclude=\".env.swp\" \
    .
'
incus file pull $SOURCE_CT_NAME/tmp/cleo-prod.tar.gz /tmp/
incus exec $SOURCE_CT_NAME -- rm -f /tmp/cleo-prod.tar.gz
"

  ssh $SOURCE_SSH_OPTS $SOURCE_SSH_USER@$SOURCE_HOST "$SOURCE_SCRIPT"

  if [ $? -ne 0 ]; then
    echo -e "${RED}Erreur lors de la création de l'archive${NC}"
    exit 1
  fi
  echo -e "${GREEN}✓ Archive créée sur IN3${NC}"

  # Transférer l'archive de IN3 vers IN4
  echo -e "${YELLOW}2. Transfert de l'archive IN3 → IN4...${NC}"
  scp $SOURCE_SCP_OPTS $SOURCE_SSH_USER@$SOURCE_HOST:/tmp/cleo-prod.tar.gz /tmp/
  scp $TARGET_SCP_OPTS /tmp/cleo-prod.tar.gz $TARGET_SSH_USER@$TARGET_HOST:/tmp/

  if [ $? -ne 0 ]; then
    echo -e "${RED}Erreur lors du transfert de l'archive${NC}"
    rm -f /tmp/cleo-prod.tar.gz
    exit 1
  fi
  echo -e "${GREEN}✓ Archive transférée vers IN4${NC}"

  # Déployer sur IN4/pra-front
  echo -e "${YELLOW}3. Déploiement dans IN4/pra-front...${NC}"

  TARGET_SCRIPT="
set -e
incus project switch $TARGET_CT_PROJECT
echo 'Transfert de l archive dans pra-front...'
incus file push /tmp/cleo-prod.tar.gz $TARGET_CT_NAME/tmp/

echo 'Déploiement dans pra-front (backup .env)...'
incus exec $TARGET_CT_NAME -- sh -c '
  cp $TARGET_DEPLOY_DIR/.env /tmp/.env.backup && \
  cd $TARGET_DEPLOY_DIR && \
  tar -xzf /tmp/cleo-prod.tar.gz && \
  mv /tmp/.env.backup $TARGET_DEPLOY_DIR/.env && \
  rm -f /tmp/cleo-prod.tar.gz
'

echo 'Configuration des permissions...'
incus exec $TARGET_CT_NAME -- sh -c '
  chown -R $OWNER:$GROUP $TARGET_DEPLOY_DIR && \
  find $TARGET_DEPLOY_DIR -type d -exec chmod 755 {} \; && \
  find $TARGET_DEPLOY_DIR -type f -exec chmod 644 {} \; && \
  mkdir -p $TARGET_DEPLOY_DIR/log && \
  chmod 775 $TARGET_DEPLOY_DIR/log && \
  touch $TARGET_DEPLOY_DIR/log/\$(date +%m%d).log && \
  chmod 664 $TARGET_DEPLOY_DIR/log/\$(date +%m%d).log && \
  chown $OWNER:$GROUP $TARGET_DEPLOY_DIR/log/*.log && \
  chmod 640 $TARGET_DEPLOY_DIR/.env && \
  if [ -d $TARGET_DEPLOY_DIR/pub/files/upload ]; then
    chmod 775 $TARGET_DEPLOY_DIR/pub/files/upload && \
    chown $OWNER:$GROUP $TARGET_DEPLOY_DIR/pub/files/upload
  fi
'

rm -f /tmp/cleo-prod.tar.gz
echo 'Déploiement PROD terminé!'
"

  ssh $TARGET_SSH_OPTS $TARGET_SSH_USER@$TARGET_HOST "$TARGET_SCRIPT"

  if [ $? -ne 0 ]; then
    echo -e "${RED}Erreur lors du déploiement PROD${NC}"
    rm -f /tmp/cleo-prod.tar.gz
    ssh $SOURCE_SSH_OPTS $SOURCE_SSH_USER@$SOURCE_HOST "rm -f /tmp/cleo-prod.tar.gz"
    exit 1
  fi

  # Nettoyer les archives locales et distantes
  echo -e "${YELLOW}4. Nettoyage...${NC}"
  rm -f /tmp/cleo-prod.tar.gz
  ssh $SOURCE_SSH_OPTS $SOURCE_SSH_USER@$SOURCE_HOST "rm -f /tmp/cleo-prod.tar.gz"
  echo -e "${GREEN}✓ Nettoyage terminé${NC}"

else
  # ===== MODE DEV: Déploiement local → IN3/dva-front =====

  # 1. Créer l'archive tar.gz localement
  echo -e "${YELLOW}1. Création de l'archive...${NC}"
  tar -czf /tmp/cleo.tar.gz \
    --exclude='.git' \
    --exclude='log/*.log' \
    --exclude='pub/files/upload/*' \
    --exclude='docs' \
    --exclude='migration' \
    --exclude='.claude' \
    --exclude='.vscode' \
    --exclude='vendor' \
    --exclude='backup_*' \
    --exclude='*.tar.gz' \
    --exclude='.env' \
    --exclude='.env.swp' \
    .

  if [ $? -ne 0 ]; then
    echo -e "${RED}Erreur lors de la création de l'archive${NC}"
    exit 1
  fi

  ARCHIVE_SIZE=$(du -h /tmp/cleo.tar.gz | cut -f1)
  echo -e "${GREEN}✓ Archive créée: /tmp/cleo.tar.gz ($ARCHIVE_SIZE)${NC}"

  # 2. Copier l'archive vers IN3
  echo -e "${YELLOW}2. Transfert de l'archive vers IN3...${NC}"
  scp -P $HOST_SSH_PORT -i $HOST_SSH_KEY /tmp/cleo.tar.gz $HOST_SSH_USER@$HOST_SSH_HOST:/tmp/

  if [ $? -ne 0 ]; then
    echo -e "${RED}Erreur lors du transfert de l'archive${NC}"
    rm -f /tmp/cleo.tar.gz
    exit 1
  fi
  echo -e "${GREEN}✓ Archive transférée sur IN3${NC}"

  # 3. Nettoyer l'ancien répertoire /tmp/cleo sur IN3 s'il existe
  echo -e "${YELLOW}3. Nettoyage des anciens fichiers temporaires sur IN3...${NC}"
  ssh $SSH_OPTS $HOST_SSH_USER@$HOST_SSH_HOST "rm -rf /tmp/cleo 2>/dev/null || true"
  echo -e "${GREEN}✓ Nettoyage effectué${NC}"

  # 4. Transférer et extraire dans le conteneur
  echo -e "${YELLOW}4. Déploiement dans le conteneur $CT_NAME...${NC}"

  # Script à exécuter sur IN3
  REMOTE_SCRIPT="
set -e

# Sélectionner le projet Incus
incus project switch $CT_PROJECT_NAME

# Transférer l'archive dans le conteneur
echo 'Transfert de l archive dans le conteneur...'
incus file push /tmp/cleo.tar.gz $CT_NAME/tmp/

# Créer le répertoire de destination et extraire
echo 'Extraction de l archive...'
incus exec $CT_NAME -- sh -c '
  mkdir -p $DEPLOY_DIR/$APP_NAME && \
  cd $DEPLOY_DIR/$APP_NAME && \
  tar -xzf /tmp/cleo.tar.gz && \
  rm -f /tmp/cleo.tar.gz
'

# Configurer les permissions
echo 'Configuration des permissions...'
incus exec $CT_NAME -- sh -c '
  chown -R $OWNER:$GROUP $DEPLOY_DIR/$APP_NAME && \
  find $DEPLOY_DIR/$APP_NAME -type d -exec chmod 755 {} \; && \
  find $DEPLOY_DIR/$APP_NAME -type f -exec chmod 644 {} \; && \
  mkdir -p $DEPLOY_DIR/$APP_NAME/log && \
  chmod 775 $DEPLOY_DIR/$APP_NAME/log && \
  touch $DEPLOY_DIR/$APP_NAME/log/\$(date +%m%d).log && \
  chmod 664 $DEPLOY_DIR/$APP_NAME/log/\$(date +%m%d).log && \
  chown $OWNER:$GROUP $DEPLOY_DIR/$APP_NAME/log/*.log && \
  chmod 640 $DEPLOY_DIR/$APP_NAME/.env && \
  rm -f $DEPLOY_DIR/$APP_NAME/.env.swp && \
  if [ -d $DEPLOY_DIR/$APP_NAME/pub/files/upload ]; then
    chmod 775 $DEPLOY_DIR/$APP_NAME/pub/files/upload && \
    chown $OWNER:$GROUP $DEPLOY_DIR/$APP_NAME/pub/files/upload
  fi
'

# Nettoyer l'archive sur IN3
rm -f /tmp/cleo.tar.gz

echo 'Déploiement terminé avec succès!'
"

  # Exécuter le script sur IN3
  ssh $SSH_OPTS $HOST_SSH_USER@$HOST_SSH_HOST "$REMOTE_SCRIPT"

  if [ $? -ne 0 ]; then
    echo -e "${RED}Erreur lors du déploiement${NC}"
    # Nettoyer l'archive locale et distante
    rm -f /tmp/cleo.tar.gz
    ssh $SSH_OPTS $HOST_SSH_USER@$HOST_SSH_HOST "rm -f /tmp/cleo.tar.gz 2>/dev/null || true"
    exit 1
  fi

  # 5. Nettoyer l'archive locale
  echo -e "${YELLOW}5. Nettoyage local...${NC}"
  rm -f /tmp/cleo.tar.gz
  echo -e "${GREEN}✓ Archive locale supprimée${NC}"

fi

echo ""
echo -e "${GREEN}===================================================${NC}"
echo -e "${GREEN}   Déploiement terminé avec succès !              ${NC}"
echo -e "${GREEN}===================================================${NC}"
if [ "$DEPLOY_MODE" = "pra" ]; then
  echo "Site: https://cleo.unikoffice.com"
  echo "Environnement: PRODUCTION (pra-front)"
else
  echo "Site: http://dcleo.unikoffice.com"
  echo "Environnement: DÉVELOPPEMENT (dva-front)"
  echo "Chemin: $DEPLOY_DIR/$APP_NAME sur $CT_NAME"
fi
echo ""