#!/bin/bash

# ==========================================
# MANUAL CONFIGURATION VARIABLES
# ==========================================
CONF_FILE_NAME=""              # Enter the conf file name exactly

SOURCE_VM_MYSQL_ROOT_PASS="Outrigth@321#" # MySQL root password on the SOURCE (Old) VM

NEW_VM_IP=""                   # Enter New vm IP
NEW_VM_USER="root"                                 # SSH user for the new VM
NEW_VM_MYSQL_ROOT_PASS="Outrigth@321#"       # MySQL root password on the NEW VM

# ==========================================
# PREREQUISITE CHECK
# ==========================================
if ! command -v pv &> /dev/null; then
    echo "--> 'pv' (Pipe Viewer) not found. Installing..."
    apt-get update && apt-get install -y pv
fi

# ==========================================
# DYNAMIC EXTRACTION FROM APACHE CONF
# ==========================================
APACHE_CONF="/etc/apache2/sites-available/${CONF_FILE_NAME}"
if [ ! -f "$APACHE_CONF" ]; then
    echo "Error: Apache conf not found at $APACHE_CONF."
    exit 1
fi

echo "--> Parsing domain and directory path from $APACHE_CONF..."
DOMAIN=$(awk '/^[[:space:]]*ServerName/ {print $2; exit}' "$APACHE_CONF" | tr -d '"'\''')
APP_DIR=$(awk '/^[[:space:]]*DocumentRoot/ {print $2; exit}' "$APACHE_CONF" | tr -d '"'\''')
APP_DIR="${APP_DIR%/}"

if [ -z "$DOMAIN" ] || [ -z "$APP_DIR" ]; then
    echo "Error: Could not extract ServerName or DocumentRoot from $APACHE_CONF"
    exit 1
fi

echo "    Found Domain: $DOMAIN"
echo "    Found Directory: $APP_DIR"

if [ ! -f "$APP_DIR/config.php" ]; then
    echo "Error: config.php not found in $APP_DIR. Cannot extract database credentials."
    exit 1
fi

APP_PARENT_DIR=$(dirname "$APP_DIR")
APP_BASE_NAME=$(basename "$APP_DIR")
APACHE_CONF_DIR=$(dirname "$APACHE_CONF")

# ==========================================
# STEP 1: CODEBASE MIGRATION
# ==========================================
echo ""
echo "=========================================="
echo "STEP 1: Migrating Codebase Directory..."
echo "=========================================="

# Ensure target parent directory exists on new VM
ssh "${NEW_VM_USER}@${NEW_VM_IP}" "mkdir -p $APP_PARENT_DIR"

echo "--> Streaming codebase archive to $NEW_VM_IP..."
tar -czf - -C "$APP_PARENT_DIR" "$APP_BASE_NAME" | pv | ssh "${NEW_VM_USER}@${NEW_VM_IP}" "tar -xzf - -C $APP_PARENT_DIR"

echo "--> Setting file permissions on new VM..."
ssh "${NEW_VM_USER}@${NEW_VM_IP}" << EOF
    chown -R www-data:www-data "$APP_DIR"
    find "$APP_DIR" -type d -exec chmod 755 {} \;
    find "$APP_DIR" -type f -exec chmod 644 {} \;
EOF
echo "--> Codebase migration completed."

# ==========================================
# STEP 2: DATABASE MIGRATION
# ==========================================
echo ""
echo "=========================================="
echo "STEP 2: Migrating Database..."
echo "=========================================="

echo "--> Parsing database name from config.php..."
DB_NAME=$(grep -i "'db_name'" "$APP_DIR/config.php" | head -n 1 | awk -F"'" '{print $4}')

echo "--> Dumping Database: $DB_NAME..."
MYSQL_PWD="${SOURCE_VM_MYSQL_ROOT_PASS}" mysqldump -u root "$DB_NAME" > "/tmp/${DB_NAME}_backup.sql"

echo "--> Streaming database backup to $NEW_VM_IP..."
tar -czf - -C "/tmp" "${DB_NAME}_backup.sql" | pv | ssh "${NEW_VM_USER}@${NEW_VM_IP}" "tar -xzf - -C /tmp"

echo "--> Importing database on new VM..."
# Pass the local DB_NAME safely into the remote SSH session using environment declaration
ssh "${NEW_VM_USER}@${NEW_VM_IP}" DB_NAME="$DB_NAME" NEW_VM_MYSQL_ROOT_PASS="$NEW_VM_MYSQL_ROOT_PASS" 'bash -s' << 'EOF'
    set -e
    echo "  -> Creating database if not exists..."
    MYSQL_PWD="${NEW_VM_MYSQL_ROOT_PASS}" mysql -u root -e "CREATE DATABASE IF NOT EXISTS \`${DB_NAME}\`;"

    echo "  -> Importing SQL backup..."
    MYSQL_PWD="${NEW_VM_MYSQL_ROOT_PASS}" mysql -u root "$DB_NAME" < "/tmp/${DB_NAME}_backup.sql"

    echo "  -> Cleaning up SQL backup on new VM..."
    rm "/tmp/${DB_NAME}_backup.sql"
EOF

echo "--> Cleaning up local SQL backup..."
rm "/tmp/${DB_NAME}_backup.sql"
echo "--> Database migration completed."

# ==========================================
# STEP 3: APACHE CONFIG MIGRATION
# ==========================================
echo ""
echo "=========================================="
echo "STEP 3: Migrating Apache Configuration..."
echo "=========================================="

echo "--> Streaming Apache conf file to $NEW_VM_IP..."
tar -czf - -C "$APACHE_CONF_DIR" "$CONF_FILE_NAME" | pv | ssh "${NEW_VM_USER}@${NEW_VM_IP}" "tar -xzf - -C /tmp"

echo "--> Enabling site and reloading Apache on new VM..."
ssh "${NEW_VM_USER}@${NEW_VM_IP}" << EOF
    set -e
    mv "/tmp/${CONF_FILE_NAME}" "/etc/apache2/sites-available/"
    a2ensite "${CONF_FILE_NAME}"
    a2enmod rewrite
    systemctl reload apache2
    echo "  -> Apache configuration applied successfully (HTTP only)."
EOF

echo ""
echo "=========================================="
echo "--> Full step-by-step migration finished successfully!"
echo "=========================================="
