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

TARGET="/home/axomogroup/mail.axomogroup.com"
ROOT_DOMAIN="axomogroup.com"
SUBDOMAIN="mail"
DOMAIN="mail.axomogroup.com"
CPANEL_USER="axomogroup"
HERE="$(cd "$(dirname "$0")" && pwd)"
STAMP="$(date +%Y%m%d-%H%M%S)"
BACKUP="/home/axomogroup/mailpanel-backup-$STAMP"
TMP="/home/axomogroup/.mailpanel-build-$STAMP"

echo "============================================"
echo " AXOMO MAIL CONTROL PANEL INSTALLER v1.0.0"
echo " Target: $TARGET"
echo "============================================"

for cmd in php composer uapi; do
  command -v "$cmd" >/dev/null 2>&1 || { echo "ERROR: $cmd not found"; exit 1; }
done

mkdir -p "$TARGET" "$BACKUP"
if [ -n "$(find "$TARGET" -mindepth 1 -maxdepth 1 ! -name '.well-known' -print -quit 2>/dev/null)" ]; then
  echo "Backing up current document root -> $BACKUP"
  rsync -a --exclude='.well-known' "$TARGET/" "$BACKUP/"
fi

if [ ! -f "$TARGET/artisan" ]; then
  echo "Creating Laravel 11 application..."
  rm -rf "$TMP"
  composer create-project laravel/laravel:^11.0 "$TMP" --no-interaction
  rsync -a "$TMP/" "$TARGET/"
  rm -rf "$TMP"
else
  echo "Existing Laravel application detected; installing panel overlay."
fi

rsync -a "$HERE/overlay/" "$TARGET/"
cd "$TARGET"

# Route this app exclusively through the panel routes.
cp -a routes/web.php "$BACKUP/web.php.before-mailpanel" 2>/dev/null || true
cat > routes/web.php <<'PHP'
<?php
require __DIR__.'/mailpanel.php';
PHP

[ -f .env ] || cp .env.example .env
mkdir -p database
[ -f database/database.sqlite ] || touch database/database.sqlite

set_env() {
  php -r '
  $file=".env"; $key=$argv[1]; $value=$argv[2];
  $s=file_exists($file)?file_get_contents($file):"";
  $line=$key."=".json_encode($value, JSON_UNESCAPED_SLASHES).PHP_EOL;
  $pattern="/^".preg_quote($key,"/")."=.*$/m";
  if (preg_match($pattern,$s)) $s=preg_replace($pattern,rtrim($line),$s);
  else $s=rtrim($s).PHP_EOL.$line;
  file_put_contents($file,$s);
  ' "$1" "$2"
}

php artisan key:generate --force >/dev/null
set_env APP_NAME "AXOMO Mail Control"
set_env APP_ENV "production"
set_env APP_DEBUG "false"
set_env APP_URL "https://$DOMAIN"
set_env DB_CONNECTION "sqlite"
set_env MAIL_PANEL_DOMAIN "$DOMAIN"
set_env CPANEL_USERNAME "$CPANEL_USER"

SERVER_HOST="$(hostname -f 2>/dev/null || hostname)"
set_env CPANEL_HOST "https://${SERVER_HOST}:2083"
set_env CPANEL_VERIFY_TLS "true"
set_env MAIL_IMAP_HOST "$DOMAIN"
set_env MAIL_IMAP_PORT "993"
set_env MAIL_IMAP_TLS "ssl"
set_env MAIL_IMAP_NOVALIDATE_CERT "false"
set_env MAIL_SMTP_HOST "$DOMAIN"
set_env MAIL_SMTP_PORT "465"
set_env MAIL_SMTP_SCHEME "smtps"
set_env MAIL_WEBMAIL_URL "https://${DOMAIN}:2096/"
set_env MAILBOX_DEFAULT_QUOTA "500"

read -r -p "Admin login email [admin@axomogroup.com]: " ADMIN_EMAIL
ADMIN_EMAIL="${ADMIN_EMAIL:-admin@axomogroup.com}"
while true; do
  read -r -s -p "Admin panel password (min 12 chars): " ADMIN_PASS; echo
  [ "${#ADMIN_PASS}" -ge 12 ] && break
  echo "Password too short."
done
ADMIN_HASH="$(php -r 'echo password_hash($argv[1], PASSWORD_BCRYPT);' "$ADMIN_PASS")"
set_env MAIL_PANEL_ADMIN_EMAIL "$ADMIN_EMAIL"
ADMIN_HASH_B64="$(printf '%s' "$ADMIN_HASH" | base64 | tr -d '\n')"
set_env MAIL_PANEL_ADMIN_PASSWORD_HASH_B64 "$ADMIN_HASH_B64"

read -r -s -p "Current common mailbox password (for Inbox/Sent access; press Enter to skip): " MAIL_PASS; echo
if [ -n "$MAIL_PASS" ]; then
  set_env MAILBOX_DEFAULT_PASSWORD "$MAIL_PASS"
fi

TOKEN_JSON="$(uapi --output=json Tokens create_full_access name="AXOMO_MAIL_PANEL_${STAMP}" 2>/dev/null || true)"
TOKEN="$(printf '%s' "$TOKEN_JSON" | php -r '
$j=json_decode(stream_get_contents(STDIN),true);
function findToken($x){
 if(!is_array($x))return null;
 foreach($x as $k=>$v){if(strtolower((string)$k)==="token" && is_string($v) && $v!=="")return $v;}
 foreach($x as $v){$r=findToken($v); if($r)return $r;}
 return null;
}
echo findToken($j) ?? "";
')"
if [ -z "$TOKEN" ]; then
  echo "Could not auto-create cPanel API token."
  read -r -s -p "Paste a cPanel API token: " TOKEN; echo
fi
[ -n "$TOKEN" ] || { echo "ERROR: API token is required"; exit 1; }
set_env CPANEL_API_TOKEN "$TOKEN"

chmod 600 .env database/database.sqlite || true

php artisan migrate --force
php artisan optimize:clear

if command -v npm >/dev/null 2>&1; then
  echo "Building React frontend..."
  npm install --no-audit --no-fund
  npm run build
else
  echo "ERROR: npm is required to build the React frontend."
  exit 1
fi

php artisan config:cache
php artisan route:cache
php artisan view:cache

# Best-effort: point the subdomain at Laravel /public.
DOCROOT_RESULT="$(uapi --output=json SubDomain changedocroot subdomain="$SUBDOMAIN" rootdomain="$ROOT_DOMAIN" dir="mail.axomogroup.com/public" 2>/dev/null || true)"
if printf '%s' "$DOCROOT_RESULT" | grep -q '"status":1'; then
  echo "Document root changed to $TARGET/public"
else
  echo "NOTICE: Automatic document-root change was not confirmed."
  echo "Set cPanel Domains -> $DOMAIN document root to: $TARGET/public"
fi

echo
echo "===== VERIFY ====="
php artisan route:list | grep -E 'api/mail-panel|mail-panel' | head -30 || true
php artisan about | grep -E 'Environment|Debug|URL|Database' || true

echo
echo "INSTALL COMPLETE"
echo "Open: https://$DOMAIN"
echo "Admin: $ADMIN_EMAIL"
echo "Backup: $BACKUP"
echo "IMPORTANT: Keep .env private; it contains the cPanel API token and optional mailbox password."
