#!/bin/bash
set -e

INSTALL_DIR="/usr/local/cpanel/whostmgr/docroot/cgi/fs_reseller_migrator"
CONF_FILE="/usr/local/cpanel/whostmgr/addon_plugins/fsmigrator.appconfig"
PLUGIN_NAME="FS Reseller Migrator"
LOG_FILE="/tmp/${PLUGIN_NAME// /_}_install.log"

# Base URL for downloading the full package when running standalone
DOWNLOAD_BASE="${DOWNLOAD_BASE:-https://migrator.falexsystems.com}"

log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" | tee -a "$LOG_FILE"
}

error_exit() {
    log "ERROR: $*"
    exit 1
}

rollback() {
    log "Rolling back installation..."
    rm -rf "$INSTALL_DIR"
    rm -f "$CONF_FILE"
    rm -f "/usr/local/cpanel/whostmgr/addon_plugins/fsmigrator.conf"
    if command -v /usr/local/cpanel/bin/register_appconfig &>/dev/null; then
        /usr/local/cpanel/bin/register_appconfig --remove="$CONF_FILE" 2>/dev/null || true
        /usr/local/cpanel/bin/register_appconfig --remove="/usr/local/cpanel/whostmgr/addon_plugins/fsmigrator.conf" 2>/dev/null || true
    fi
    log "Rollback complete."
}

trap rollback ERR

log "=== Starting ${PLUGIN_NAME} installation ==="

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"

# If cgi/ is missing, download the full package
if [ ! -d "${SCRIPT_DIR}/cgi" ]; then
    log "Plugin files not found locally. Downloading from ${DOWNLOAD_BASE}..."
    ZIP_PATH="/tmp/fs_reseller_migrator_download.zip"
    curl -sL "${DOWNLOAD_BASE}/FS-Reseller-Migrator.zip" -o "$ZIP_PATH" || error_exit "Failed to download package from ${DOWNLOAD_BASE}/FS-Reseller-Migrator.zip"
    log "Downloaded package. Extracting..."
    TMP_EXTRACT="/tmp/fs_reseller_migrator_extract"
    rm -rf "$TMP_EXTRACT"
    mkdir -p "$TMP_EXTRACT"
    unzip -q "$ZIP_PATH" -d "$TMP_EXTRACT" || error_exit "Failed to extract package"
    rm -f "$ZIP_PATH"
    # Find the cgi directory inside the extracted folder
    EXTRACTED_CGI=$(find "$TMP_EXTRACT" -type d -name "cgi" | head -1)
    if [ -z "$EXTRACTED_CGI" ]; then
        rm -rf "$TMP_EXTRACT"
        error_exit "Could not find cgi/ directory in the downloaded package"
    fi
    SCRIPT_DIR="$(dirname "$EXTRACTED_CGI")"
    log "Extracted plugin files to ${SCRIPT_DIR}"
fi

log "Copying plugin files to ${INSTALL_DIR}..."
mkdir -p "$INSTALL_DIR"
cp -r "${SCRIPT_DIR}/cgi/"* "$INSTALL_DIR/" || error_exit "Failed to copy plugin files"
chmod -R 755 "$INSTALL_DIR"

log "Creating plugin configuration file..."
cat > "$CONF_FILE" <<EOF
name=fs_reseller_migrator
service=whostmgr
user=root
url=/cgi/fs_reseller_migrator/index.php
acls=any
displayname=FS Reseller Migrator
entryurl=fs_reseller_migrator/index.php
target=_self
EOF

if [ ! -f "$CONF_FILE" ]; then
    error_exit "Failed to create configuration file"
fi
log "Configuration file created: ${CONF_FILE}"

log "Registering plugin with WHM..."
if [ ! -f /usr/local/cpanel/bin/register_appconfig ]; then
    error_exit "register_appconfig not found at /usr/local/cpanel/bin/register_appconfig"
fi

REGISTER_OUTPUT=$(/usr/local/cpanel/bin/register_appconfig "$CONF_FILE" 2>&1) || error_exit "register_appconfig failed: ${REGISTER_OUTPUT}"
log "Registration output: ${REGISTER_OUTPUT}"

log "Restarting cpsrvd..."
if [ -x /scripts/restartsrv_cpsrvd ]; then
    /scripts/restartsrv_cpsrvd >> "$LOG_FILE" 2>&1 || error_exit "Failed to restart cpsrvd"
    log "cpsrvd restarted successfully"
else
    log "WARNING: /scripts/restartsrv_cpsrvd not found or not executable"
fi

log "=== Verifying installation ==="

if [ ! -d "$INSTALL_DIR" ]; then
    error_exit "Plugin directory not found: ${INSTALL_DIR}"
fi
log "Plugin directory verified: ${INSTALL_DIR}"

if [ ! -f "${INSTALL_DIR}/index.php" ]; then
    error_exit "Plugin entry point not found: ${INSTALL_DIR}/index.php"
fi
log "Plugin entry point verified: ${INSTALL_DIR}/index.php"

if [ ! -f "$CONF_FILE" ]; then
    error_exit "Configuration file not found: ${CONF_FILE}"
fi
log "Configuration file verified: ${CONF_FILE}"

HOSTNAME=$(hostname)
PLUGIN_URL="https://${HOSTNAME}:2087/cgi/fs_reseller_migrator/index.php"

# Clean up extracted temp files
if [ -n "$TMP_EXTRACT" ] && [ -d "$TMP_EXTRACT" ]; then
    rm -rf "$TMP_EXTRACT"
fi

log ""
log "=========================================="
log "INSTALLATION SUMMARY"
log "=========================================="
log "Plugin URL: ${PLUGIN_URL}"
log "Plugin registration status: Registered (${CONF_FILE})"
log "WHM visibility status: Plugin should now appear in WHM under Development category"
log "=========================================="
log "Log file: ${LOG_FILE}"
log "Installation completed successfully."
