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

# SSD Web Host Chat - cPanel auto installer
# Run from: /home/CPUSER/chat.ssdwebhost.com
# Required: PHP 8.2+, Composer, unzip, MySQL/MariaDB database already created.

APP_DIR="$(pwd)"
ZIP_FILE="${1:-ssdwebhost-chat-premium.zip}"
BACKUP_DIR="${APP_DIR}_backup_$(date +%Y%m%d_%H%M%S)"
TMP_DIR="$(mktemp -d)"

cleanup() { rm -rf "$TMP_DIR"; }
trap cleanup EXIT

echo "== SSD Web Host Chat Installer =="

if [[ ! -f "$ZIP_FILE" ]]; then
  echo "ERROR: ZIP file not found: $ZIP_FILE"
  exit 1
fi

command -v php >/dev/null || { echo "ERROR: PHP not found"; exit 1; }
command -v composer >/dev/null || { echo "ERROR: Composer not found"; exit 1; }
command -v unzip >/dev/null || { echo "ERROR: unzip not found"; exit 1; }

PHP_VERSION="$(php -r 'echo PHP_VERSION;')"
echo "PHP version: $PHP_VERSION"
php -r 'exit(version_compare(PHP_VERSION, "8.2.0", ">=") ? 0 : 1);' || {
  echo "ERROR: Laravel 12 requires PHP 8.2 or newer."
  exit 1
}

echo
read -rp "Database name (full cPanel name): " DB_DATABASE
read -rp "Database username (full cPanel name): " DB_USERNAME
read -rsp "Database password: " DB_PASSWORD
echo
read -rp "Database host [127.0.0.1]: " DB_HOST
DB_HOST="${DB_HOST:-127.0.0.1}"
read -rp "App URL [https://chat.ssdwebhost.com]: " APP_URL
APP_URL="${APP_URL:-https://chat.ssdwebhost.com}"
read -rp "Admin email: " ADMIN_EMAIL
read -rsp "Admin password: " ADMIN_PASSWORD
echo

if [[ -z "$DB_DATABASE" || -z "$DB_USERNAME" || -z "$DB_PASSWORD" || -z "$ADMIN_EMAIL" || -z "$ADMIN_PASSWORD" ]]; then
  echo "ERROR: Required values cannot be empty."
  exit 1
fi

echo
echo "Creating backup: $BACKUP_DIR"
mkdir -p "$BACKUP_DIR"
shopt -s dotglob
for item in "$APP_DIR"/*; do
  [[ "$item" == "$APP_DIR/$(basename "$ZIP_FILE")" ]] && continue
  [[ "$item" == "$BACKUP_DIR" ]] && continue
  cp -a "$item" "$BACKUP_DIR/" 2>/dev/null || true
done
shopt -u dotglob

echo "Extracting package..."
unzip -q "$ZIP_FILE" -d "$TMP_DIR/package"
PACKAGE_DIR="$TMP_DIR/package/ssd-chat-installable"

[[ -d "$PACKAGE_DIR" ]] || { echo "ERROR: Invalid package structure."; exit 1; }

echo "Installing fresh Laravel 12 application..."
rm -rf "$TMP_DIR/laravel"
composer create-project --prefer-dist laravel/laravel:^12.0 "$TMP_DIR/laravel"

echo "Copying package files..."
cp -a "$PACKAGE_DIR"/. "$TMP_DIR/laravel"/

echo "Deploying application files..."
# Keep the ZIP and backup outside the deployed Laravel app.
find "$APP_DIR" -mindepth 1 -maxdepth 1 \
  ! -name "$(basename "$ZIP_FILE")" \
  ! -name "$(basename "$BACKUP_DIR")" \
  -exec rm -rf {} +

cp -a "$TMP_DIR/laravel"/. "$APP_DIR"/

if [[ ! -f "$APP_DIR/artisan" ]]; then
  echo "ERROR: artisan file was not created."
  exit 1
fi

cp "$APP_DIR/.env.example" "$APP_DIR/.env" 2>/dev/null || touch "$APP_DIR/.env"

php -r '
$path = ".env";
$env = file_get_contents($path);
$updates = [
"APP_NAME" => "SSD Web Host Chat",
"APP_ENV" => "production",
"APP_DEBUG" => "false",
"APP_URL" => getenv("APP_URL_VALUE"),
"DB_CONNECTION" => "mysql",
"DB_HOST" => getenv("DB_HOST_VALUE"),
"DB_PORT" => "3306",
"DB_DATABASE" => getenv("DB_DATABASE_VALUE"),
"DB_USERNAME" => getenv("DB_USERNAME_VALUE"),
"DB_PASSWORD" => getenv("DB_PASSWORD_VALUE"),
"CHAT_ADMIN_EMAIL" => getenv("ADMIN_EMAIL_VALUE"),
"CHAT_ADMIN_PASSWORD" => getenv("ADMIN_PASSWORD_VALUE")
];
foreach ($updates as $key => $value) {
  $line = $key . "=" . (preg_match("/\\s/", $value) ? "\"".$value."\"" : $value);
  if (preg_match("/^".preg_quote($key, "/")."=.*/m", $env)) {
    $env = preg_replace("/^".preg_quote($key, "/")."=.*/m", $line, $env);
  } else {
    $env .= PHP_EOL.$line;
  }
}
file_put_contents($path, $env);
' APP_URL_VALUE="$APP_URL" DB_HOST_VALUE="$DB_HOST" DB_DATABASE_VALUE="$DB_DATABASE" DB_USERNAME_VALUE="$DB_USERNAME" DB_PASSWORD_VALUE="$DB_PASSWORD" ADMIN_EMAIL_VALUE="$ADMIN_EMAIL" ADMIN_PASSWORD_VALUE="$ADMIN_PASSWORD"

php artisan key:generate --force
php artisan migrate --force
php artisan chat:install
php artisan optimize:clear

chmod -R ug+rw storage bootstrap/cache
find storage bootstrap/cache -type d -exec chmod 775 {} \; 2>/dev/null || true

echo
echo "=============================================="
echo "Installation completed."
echo "Admin URL: $APP_URL/admin/login"
echo "Backup:    $BACKUP_DIR"
echo
echo "IMPORTANT: Set the subdomain document root to:"
echo "$APP_DIR/public"
echo "=============================================="
