#!/bin/bash

set -a
source /var/www/html/wordpress-manager-v2/.env
set +a

LOG_FILE="/var/www/html/wordpress-manager-v2/logs/wordpress_duplicate.log"
exec > >(tee -a ${LOG_FILE}) 2>&1
set -e

echo "Ejecutando duplicación de template."

template="$1"
project="$2"
mysqlhost=$WEB_HOST
mysqldb="$3"
mysqluser="$3"
mysqlpassword=$(openssl rand -base64 16 | tr -d '/+=' | head -c 12)$(date +%s | sha256sum | head -c 4 | tr '0-9' 'A-Z')$(echo $RANDOM | tr -dc '0-9' | head -c 4)\!
template_url="$4"

mysqlroothost=$MYSQL_ROOT_HOST
mysqlrootusername=$MYSQL_ROOT_USERNAME
mysqlrootpassword=$MYSQL_ROOT_PASSWORD

if [ -z "$template" ]; then
    echo "Error: El parámetro 'template' no fue proporcionado."
    exit 1
elif [ -z "$project" ]; then
    echo "Error: El parámetro 'project' no fue proporcionado."
    exit 1
elif [ -z "$mysqldb" ]; then
    echo "Error: El parámetro 'mysqldb' no fue proporcionado."
    exit 1
elif [ -z "$mysqluser" ]; then
    echo "Error: El parámetro 'mysqluser' no fue proporcionado."
    exit 1
elif [ -z "$mysqlpassword" ]; then
    echo "Error: El parámetro 'mysqlpassword' no fue proporcionado."
    exit 1
elif [ -z "$template_url" ]; then
    echo "Error: El parámetro 'template_url' no fue proporcionado."
    exit 1
fi

echo "Continuando proceso."

echo "Copiando el template $template a $project..."
cp -r /var/www/html/"$template" /var/www/html/"$project"

echo "Cambiando permisos..."
sudo chown -R www-data:www-data /var/www/html/"$project"
sudo find /var/www/html/"$project" -type d -exec chmod 750 {} \;
sudo find /var/www/html/"$project" -type f -exec chmod 640 {} \;

echo "Cambiando al directorio del proyecto..."
cd /var/www/html/"$project"

echo "Diagnóstico rápido de instancia MySQL..."
MYSQL_PWD="$mysqlrootpassword" mysql -h "$mysqlroothost" -u "$mysqlrootusername" -e \
"SELECT @@hostname AS host, @@port AS port, @@version AS version;
 SHOW DATABASES LIKE '$mysqldb';" || { echo "No puedo conectar a MySQL con root"; exit 1; }

echo "Creando la base de datos $mysqldb (si no existe)..."
MYSQL_PWD="$mysqlrootpassword" mysql -h "$mysqlroothost" -u "$mysqlrootusername" -e \
"CREATE DATABASE IF NOT EXISTS \`$mysqldb\` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"

echo "Creando/actualizando usuario '$mysqluser'@'%'..."
MYSQL_PWD="$mysqlrootpassword" mysql -h "$mysqlroothost" -u "$mysqlrootusername" -e \
"CREATE USER IF NOT EXISTS '$mysqluser'@'%' IDENTIFIED BY '$mysqlpassword';
 ALTER USER '$mysqluser'@'%' IDENTIFIED BY '$mysqlpassword';"

echo "Creando/actualizando usuario '$mysqluser'@'localhost'..."
MYSQL_PWD="$mysqlrootpassword" mysql -h "$mysqlroothost" -u "$mysqlrootusername" -e \
"CREATE USER IF NOT EXISTS '$mysqluser'@'localhost' IDENTIFIED BY '$mysqlpassword';
 ALTER USER '$mysqluser'@'localhost' IDENTIFIED BY '$mysqlpassword';"

echo "Asignando privilegios SOLO sobre \`$mysqldb\`..."
MYSQL_PWD="$mysqlrootpassword" mysql -h "$mysqlroothost" -u "$mysqlrootusername" -e \
"GRANT ALL PRIVILEGES ON \`$mysqldb\`.* TO '$mysqluser'@'%';
 GRANT ALL PRIVILEGES ON \`$mysqldb\`.* TO '$mysqluser'@'localhost';
 FLUSH PRIVILEGES;"

echo "Verificando grants y presencia de la DB..."
MYSQL_PWD="$mysqlrootpassword" mysql -h "$mysqlroothost" -u "$mysqlrootusername" -e \
"SHOW GRANTS FOR '$mysqluser'@'%';
 SHOW GRANTS FOR '$mysqluser'@'localhost';
 SHOW DATABASES LIKE '$mysqldb';"

echo "Actualizando wp-config.php con DB, usuario y contraseña..."

db_host_effective="$mysqlroothost"
if [ "$db_host_effective" = "localhost" ] || [ -z "$db_host_effective" ]; then
  db_host_effective="127.0.0.1"
fi

sudo sed -i -E "s/define\(\s*'DB_NAME'\s*,\s*'[^']*'\s*\);/define( 'DB_NAME', '$mysqldb' );/g" wp-config.php
sudo sed -i -E "s/define\(\s*'DB_USER'\s*,\s*'[^']*'\s*\);/define( 'DB_USER', '$mysqluser' );/g" wp-config.php
sudo sed -i -E "s/define\(\s*'DB_PASSWORD'\s*,\s*'[^']*'\s*\);/define( 'DB_PASSWORD', '$mysqlpassword' );/g" wp-config.php
sudo sed -i -E "s/define\(\s*'DB_HOST'\s*,\s*'[^']*'\s*\);/define( 'DB_HOST', '$db_host_effective' );/g" wp-config.php

echo "Testeando conexión MySQL con las credenciales de wp-config.php..."

db_name=$(grep -E "define\(\s*'DB_NAME'" wp-config.php | sed -E "s/.*'DB_NAME',\s*'([^']+)'.*/\1/")
db_user=$(grep -E "define\(\s*'DB_USER'" wp-config.php | sed -E "s/.*'DB_USER',\s*'([^']+)'.*/\1/")
db_pass=$(grep -E "define\(\s*'DB_PASSWORD'" wp-config.php | sed -E "s/.*'DB_PASSWORD',\s*'([^']+)'.*/\1/")
db_host=$(grep -E "define\(\s*'DB_HOST'" wp-config.php | sed -E "s/.*'DB_HOST',\s*'([^']+)'.*/\1/")

MYSQL_PWD="$db_pass" mysql -h "$db_host" -u "$db_user" -e "USE \`$db_name\`; SELECT 1;" || exit 1

echo "Haciendo dump de la base de datos del template..."
MYSQL_PWD="$mysqlrootpassword" mysqldump -h "$mysqlroothost" -u "$mysqlrootusername" "$template" > "$template.sql"

echo "Importando el dump en la nueva base de datos..."
MYSQL_PWD="$mysqlrootpassword" mysql -h "$mysqlroothost" -u "$mysqlrootusername" "$mysqldb" < "$template.sql"

rm "$template.sql"

echo "Actualizando las URLs en la base de datos..."
MYSQL_PWD="$mysqlpassword" mysql -h "$mysqlroothost" -u "$mysqluser" "$mysqldb" -e "
UPDATE wp_options SET option_value = 'https://$project.devuocloud.com' WHERE option_name = 'home' OR option_name = 'siteurl';
UPDATE wp_posts SET guid = replace(guid, 'http://$template_url.devuocloud.com','https://$project.devuocloud.com');
UPDATE wp_posts SET guid = replace(guid, 'https://$template_url.devuocloud.com','https://$project.devuocloud.com');
UPDATE wp_posts SET post_content = replace(post_content, 'http://$template_url.devuocloud.com', 'https://$project.devuocloud.com');
UPDATE wp_posts SET post_content = replace(post_content, 'https://$template_url.devuocloud.com', 'https://$project.devuocloud.com');
UPDATE wp_postmeta SET meta_value = replace(meta_value,'http://$template_url.devuocloud.com','https://$project.devuocloud.com');
UPDATE wp_postmeta SET meta_value = replace(meta_value,'https://$template_url.devuocloud.com','https://$project.devuocloud.com');
"
if [ $? -ne 0 ]; then
    echo "Error actualizando las URLs en la base de datos."
    exit 1
fi

# Crear la configuración de Apache
echo "Creando la configuración de Apache para $project..."
sudo touch /etc/apache2/sites-available/"$project.conf"
if [ $? -ne 0 ]; then
    echo "Error creando el archivo de configuración de Apache."
    exit 1
fi

echo "
<VirtualHost *:80>
    ServerAdmin dev@uosolutions.com
    ServerName $project.devuocloud.com
    DocumentRoot /var/www/html/$project

    <Directory /var/www/html/$project>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    SSLCertificateFile    /etc/apache2/certs/devuocloud.com.crt
    SSLCertificateKeyFile /etc/apache2/certs/devuocloud.com.key

    ErrorLog /var/log/apache2/$project-error.log
    CustomLog /var/log/apache2/$project-access.log combined
</VirtualHost>" | sudo tee /etc/apache2/sites-available/"$project.conf" > /dev/null
if [ $? -ne 0 ]; then
    echo "Error escribiendo la configuración de Apache."
    exit 1
fi

# Habilitar el sitio en Apache y recargar el servicio
echo "Habilitando el sitio en Apache..."
sudo a2ensite "$project.conf"
if [ $? -ne 0 ]; then
    echo "Error habilitando el sitio en Apache."
    exit 1
fi

echo "Crea usuario:grupo y corrige permisos del direstorio"
/var/www/html/wordpress-manager-v2/scripts/user-new.sh $project

echo "Recargando Apache..."
sudo systemctl reload apache2
if [ $? -ne 0 ]; then
    echo "Error recargando Apache."
    exit 1
fi

echo "Verificando si ya existe un certificado SSL para $project.devuocloud.com..."

# Verifica si el certificado ya está emitido
if sudo certbot certificates | grep -q "$project.devuocloud.com"; then
    echo "✅ El certificado SSL para $project.devuocloud.com ya está instalado. No se realizará una nueva instalación."
else
    echo "⚙️  Instalando SSL para $project.devuocloud.com..."
    sudo certbot --apache -d $project.devuocloud.com

    if [ $? -ne 0 ]; then
        echo "❌ Error instalando SSL para $project.devuocloud.com."
        exit 1
    else
        echo "✅ SSL instalado correctamente para $project.devuocloud.com."
    fi
fi

echo "Instalación completada exitosamente."
