#!/usr/bin/env bash
set -euo pipefail

# --- CONFIG FILE --------------------------------------------------------------
CONTAINER_NAME="media_manager-db"
MYSQL_CONF_PATH="docker/mysql/conf.d"
MYSQL_CONF_FILE="$MYSQL_CONF_PATH/mysqld.cnf"
VOLUME_NAME="poc_mysql"
MYSQL_IMAGE="mysql:8.0"



# --- CREATION D'UN NOUVEAU VOLUME SUR DOCKER -----------------------------------
#echo
#echo "=== [3] Creation du volume Docker ==="

if docker volume ls --format '{{.Name}}' | grep -q "^${VOLUME_NAME}$"; then
  echo "(i) Le volume '$VOLUME_NAME' existe deja, aucune craation necessaire."
else
echo "(+) Creation du volume '$VOLUME_NAME'..."
  docker volume create "$VOLUME_NAME" >/dev/null
  echo "(+) Volume '$VOLUME_NAME' cree avec succes."
fi


# --- ON INSPECTE SI LE VOLUME C'EST BIEN CREE  -----------------------------------
echo
echo "=== [4] Verification du volume Docker ==="

if docker volume inspect "$VOLUME_NAME" >/dev/null 2>&1; then
  echo "(+) Le volume '$VOLUME_NAME' existe et a ete correctement cree."
else
  echo "(-) Erreur : le volume '$VOLUME_NAME' n'existe pas ou n'a pas pu etre inspecte."
  exit 1
fi

# --- PULL L'IMAGE MYSQL8  -----------------------------------
echo
echo "=== [5] Pull de l'image Docker MySQL 8 ==="

if docker images --format '{{.Repository}}:{{.Tag}}' | grep -q "^${MYSQL_IMAGE}$"; then
  echo "(i) L'image '$MYSQL_IMAGE' est deja presente localement."
else
  echo "(+) Telechargement de l'image '$MYSQL_IMAGE'..."
  if docker pull "$MYSQL_IMAGE"; then
    echo "(+) Image MySQL recuperee avec succes."
  else
    echo "(-) Echec du telechargement de l'image '$MYSQL_IMAGE'."
    exit 1
  fi
fi

# --- VERIFICATION SI IL A ETE BIEN PULL  -----------------------------------
echo
echo "=== [6] V?rification de l'image Docker MySQL 8 ==="

if docker images --format '{{.Repository}}:{{.Tag}}' | grep -q "^${MYSQL_IMAGE}$"; then
  echo "(+) L'image '$MYSQL_IMAGE' est bien pr?sente localement."
else
  echo "(-) Erreur : l'image '$MYSQL_IMAGE' est introuvable apr?s le pull."
  exit 1
fi

# --- MODIFIER LE FICHIER DOCKER-COMPOSE A LA MAIN  -----------------------------------
echo
echo "=== [7] Modification manuelle du fichier docker-compose ==="
echo "Ajouter cette partie ? la main :"
echo """
db:
    container_name: media_manager-db
    image: mysql:8.0
    ports:
      - '3309:3306'
    volumes:
      - poc_mysql:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: 'root'
    networks:
      - shared
"""

# Attendre confirmation utilisateur
while true; do
  read -rp "Avez-vous ajout? cette section au docker-compose ? (y pour continuer) : " answer
  case "$answer" in
    y|Y )
      echo "(+) Confirmation re?ue, on continue."
      break
      ;;
    * )
      echo "(i) En attente? Tapez y pour continuer."
      ;;
  esac
done

# --- TESTER SI CA DEMARRE BIEN -----------------------------------
echo
echo "=== [9] D?marrage du container ==="

echo "(i) Lancement de 'docker compose up -d' ..."
if docker compose up -d; then
  echo "(+) docker compose d?marr?."
else
  echo "(-) Erreur : ?chec de docker compose up -d."
  exit 1
fi

echo "(i) V?rification du d?marrage du container '$CONTAINER_NAME'..."
MAX_WAIT=20
WAIT_INTERVAL=2
TIME_PASSED=0
READY=0

while [[ $TIME_PASSED -lt $MAX_WAIT ]]; do
  if docker logs "$CONTAINER_NAME" 2>&1 | grep -q "Ready for start up"; then
    READY=1
    break
  fi

  echo "(i) Le container n?est pas encore pr?t... Attente..."
  sleep $WAIT_INTERVAL
  TIME_PASSED=$((TIME_PASSED + WAIT_INTERVAL))
done

if [[ $READY -eq 1 ]]; then
  echo "(+) MySQL est pr?t : 'ready for connections' d?tect?."
else
  echo "(-) MySQL n?a pas signal? 'ready for connections' apr?s $MAX_WAIT secondes."
  echo "(i) V?rifiez les logs avec : docker logs $CONTAINER_NAME"

  # Demander confirmation pour continuer
  while true; do
    read -rp "Voulez-vous continuer malgr? tout ? (y pour continuer) : " answer
    case "$answer" in
      y|Y )
        echo "(+) Confirmation re?ue. Suite de l?ex?cution."
        break
        ;;
      * )
        echo "(i) En attente... Tapez y pour continuer."
        ;;
    esac
  done
fi

# --- DUMP LES DONNEES -----------------------------------
echo
echo "=== [10] Import du dump SQL dans MySQL ==="

SQL_FILE_LOCAL="backup_dump_innoDB.sql"
SQL_FILE_IN_CONTAINER="/tmp/backup_dump_innoDB.sql"

if [[ ! -f "$SQL_FILE_LOCAL" ]]; then
  echo "(-) Le fichier SQL '$SQL_FILE_LOCAL' est introuvable."
  exit 1
fi

echo "(i) Copie du fichier SQL vers le conteneur..."
if docker cp "$SQL_FILE_LOCAL" "$CONTAINER_NAME:$SQL_FILE_IN_CONTAINER"; then
  echo "(+) Dump copi? dans le container : $SQL_FILE_IN_CONTAINER"
else
  echo "(-) Impossible de copier le fichier SQL dans le container."
  exit 1
fi

echo "(i) Import du dump SQL dans MySQL..."

if docker exec "$CONTAINER_NAME" sh -c \
  "mysql -u root -p\"\$MYSQL_ROOT_PASSWORD\" < $SQL_FILE_IN_CONTAINER"
then
  echo "(+) Import du fichier SQL r?ussi."
else
  echo "(-) Erreur durant l'import SQL."
  exit 1
fi


# --- MISE A JOUR DE LA CONFIGURATION MYSQL --------------------------------------
echo
echo "=== [11] Mise a jour de la configuration MySQL ==="
echo

if [[ ! -d "$MYSQL_CONF_PATH" ]]; then
    mkdir -p "$MYSQL_CONF_PATH"
fi

cat > "$MYSQL_CONF_FILE" <<'EOF'
# test
[mysqld]
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
log-error       = /var/log/mysql/error.log
symbolic-links  = 0

# Desactivation des modes SQL stricts pour compatibilite application
sql_mode = NO_ENGINE_SUBSTITUTION

# Optimisation memoire et connexions
max_connections = 5000
max_connect_errors = 500
connect_timeout = 20
wait_timeout = 28800
interactive_timeout = 28800
max_allowed_packet = 64M
thread_cache_size = 128

# Buffers (a ajuster selon RAM)
sort_buffer_size = 4M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
join_buffer_size = 2M

# Tables temporaires
tmp_table_size = 128M
max_heap_table_size = 128M

# InnoDB (le moteur par defaut)
innodb_buffer_pool_size = 1G
innodb_log_file_size = 256M
innodb_flush_log_at_trx_commit = 1
innodb_file_per_table = 1
innodb_flush_method = O_DIRECT

# MyISAM (si encore utilise)
key_buffer_size = 128M
myisam_sort_buffer_size = 64M
myisam_recover_options = BACKUP

# Journalisation requetes lentes
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 8

# Replication (desactive le demarrage automatique du slave)
skip-slave-start

# Reduit les resolutions DNS inutiles
skip-name-resolve

# Emp?che le demarrage si fichiers corrompus
innodb_strict_mode = 1
EOF

echo "(+) Fichier de configuration mis a jour : $MYSQL_CONF_FILE"

# --- MODIFICATION DU DOCKER-COMPOSE  --------------------------------------
echo
echo "=== [12] Bloc docker-compose.yml pour MySQL 8 adapt? pour le projet ==="
echo

cat <<'EOF'
  db:
    container_name: media_manager-db
#    platform: linux/amd64 #Mac M1 compatibility
    image: mysql:8.0
    ports:
      - '3306:3306'
    volumes:
      - poc_mysql:/var/lib/mysql
      - ./docker/mysql/conf.d:/etc/mysql/conf.d
      - ./docker/mysql/script:/tmp/mysql/script
      - ./docker/mysql/import:/tmp/mysql/import
    command: >
      bash -c "
      chmod 644 /etc/mysql/conf.d/*.cnf
      && /entrypoint.sh mysqld
      "
    environment:
      TZ: "Europe/Paris"
      MYSQL_ROOT_PASSWORD: 'root'
      MYSQL_USER: 'user'
      MYSQL_PASSWORD: 'password'
    networks:
      - shared



    n'oublie pas :
    change le nom du volume si tu as changé !!!!
EOF

echo
read -p "As-tu copie ce bloc dans ton docker-compose.yml ? (y/n) : " confirm
if [[ "$confirm" != "y" && "$confirm" != "Y" ]]; then
    echo "(-) Merci de copier le bloc dans docker-compose.yml avant de continuer."
    exit 1
fi
echo "(+) Confirmation recue"

# --- REDDEMARRAGE DU CONTAINER --------------------------------------
echo
echo "=== [13] Redemarrage du container ==="
echo

if make build ; then
    docker logs -f "$CONTAINER_NAME"
    echo "(+) Migration MySQL 8 terminee avec succes"
    echo "Verifie maintenant que toutes les donnees et connexions fonctionnent"
else
    echo "(-) Echec lors du redemarrage du container"
    exit 1
fi

