#!/bin/bash
#set -x

set_global_variables()
{
    param_registration_token="62bca547-46e8-37f8-0082-814ad538e2cb"
    param_server="nable.greenbeanit.com"
    param_protocol="https"
    param_port=10443
    param_customer_id="282"
    param_customer_name="800e31a1b23fa7edf7f091bf26527175e1c4b0898963cb1d2d1d724f12bf5bd9"
    param_using_urls_list=true
    param_urls_list="https://nable.greenbeanit.com:10443,https://nable1.greenbeanit.com:10443"
    param_proxy=""
    param_backup_download_url="https://sis.n-able.com/GenericFiles/NcentralMacAgent/1.13.0.0/Install_N-central_Agent_v1.13.0.631.pkg"
}

validate_global_variables()
{
    if [ -z "$param_registration_token" ]; then
        echo "Error: Registration token is not set."
        exit ${EXIT_ERROR_INVALID_PARAMETERS}
    fi
    # ... (rest of validation logic remains the same)
    if [ -z "$param_server" ] || [ -z "$param_customer_id" ] || [ -z "$param_customer_name" ] || [ -z "$param_protocol" ] || [ -z "$param_port" ]; then
        echo "Error: Missing required parameters."
        exit ${EXIT_ERROR_INVALID_PARAMETERS}
    fi
}

set_constants() 
{
    readonly LOG_DIR="/Library/Logs/N-central Agent"
    readonly AGENT_DIR="/Library/N-central Agent"
    readonly LEGACY_AGENT_DIR="/Applications/Mac_Agent.app"
    readonly REGISTER_WITH_SERVER_PARAMS_FILEPATH="/tmp/ncentral_silent_install.params"
    readonly LOG_FILENAME="nagent.silent_install.log"
    readonly LOG_FILEPATH="${LOG_DIR}/${LOG_FILENAME}"
    readonly SILENT_INSTALL_OUTPUT_FILENAME="nagent.silent_install-output.log"
    readonly SILENT_INSTALL_OUTPUT_FILEPATH="${LOG_DIR}/${SILENT_INSTALL_OUTPUT_FILENAME}"

    readonly EXIT_ERROR_INVALID_PARAMETERS=1
    readonly EXIT_ERROR_NO_INSTALLER=2
    readonly EXIT_ERROR_NO_SUDO=3
}

# --- NEW REMOVAL LOGIC ---
remove_existing_agent()
{
    echo "Checking for existing N-central Agent..."
    
    # Check for the modern agent uninstaller
    if [ -f "${AGENT_DIR}/uninstall.sh" ]; then
        echo "Found existing agent. Running uninstaller..."
        sh "${AGENT_DIR}/uninstall.sh"
    fi

    # Check for legacy agent directory
    if [ -d "${LEGACY_AGENT_DIR}" ]; then
        echo "Found legacy agent. Removing..."
        rm -rf "${LEGACY_AGENT_DIR}"
    fi

    # Force cleanup of the Agent directory to ensure a clean slate
    if [ -d "${AGENT_DIR}" ]; then
        rm -rf "${AGENT_DIR}"
    fi
    
    echo "Cleanup complete. Proceeding with installation."
}
# -------------------------

make_log_directory()
{
    mkdir -p "${LOG_DIR}"
}

clean_output_logs()
{
    if [ -f "${SILENT_INSTALL_OUTPUT_FILEPATH}" ]; then
        rm "${SILENT_INSTALL_OUTPUT_FILEPATH}"
    fi
}

install_agent()
{
    echo "Installing agent..."
    installer -pkg "${PARAM_INSTALLER}" -target /
}

clean_install_logs()
{
    if [ -f "${SILENT_INSTALL_OUTPUT_FILEPATH}" ]; then
        cat "${SILENT_INSTALL_OUTPUT_FILEPATH}"
        rm "${SILENT_INSTALL_OUTPUT_FILEPATH}"
    fi
}

download_installer() {
    download_url="${param_protocol}://${param_server}/download/latest/macosx/N-central/Install_N-central_Agent.pkg"
    echo "Downloading installer..."
    curl -L -o /tmp/Install_N-central_Agent.pkg "${download_url}" || {
        echo "Failed to download from server, trying backup..."
        curl -L -o /tmp/Install_N-central_Agent.pkg "${param_backup_download_url}" || {
            echo "Failed to download installer, exiting."
            exit ${EXIT_ERROR_NO_INSTALLER}
        }
    }
    PARAM_INSTALLER="/tmp/Install_N-central_Agent.pkg"
}

check_if_running_as_sudo() 
{
    if [ "$(id -u)" -ne 0 ]; then
        echo "Please run as root (sudo)."
        exit ${EXIT_ERROR_NO_SUDO}
    fi
}

configure_installer()
{
    rm -f "${REGISTER_WITH_SERVER_PARAMS_FILEPATH}"
    cat <<EOF >> "${REGISTER_WITH_SERVER_PARAMS_FILEPATH}"
NC_IVPRM_TOKEN="${param_registration_token}"
NC_IVPRM_PROXY="${param_proxy}"
EOF
    if $param_using_urls_list; then
        echo "NC_IVPRM_SERVERS_URLS=\"${param_urls_list}\"" >> "${REGISTER_WITH_SERVER_PARAMS_FILEPATH}"
    else
        cat <<EOF >> "${REGISTER_WITH_SERVER_PARAMS_FILEPATH}"
NC_IVPRM_SERVER="${param_server}"
NC_IVPRM_PORT="${param_port}"
NC_IVPRM_PROTOCOL="${param_protocol}"
EOF
    fi
    cat <<EOF >> "${REGISTER_WITH_SERVER_PARAMS_FILEPATH}"
NC_IVPRM_ID="${param_customer_id}"
NC_IVPRM_NAME="${param_customer_name}"
EOF
    echo "Configured!"
}

log_message() # message, is_warning
(
    if [ -d "${LOG_DIR}" ]; then
        prefix="I"
        ${2} && prefix="W"
        echo "[$(date '+%Y-%m-%d %T')] [${prefix}] $1" >> "${LOG_FILEPATH}"
    fi
)

main()
{
    set_constants
    set_global_variables
    validate_global_variables
    check_if_running_as_sudo
    make_log_directory
    
    # Calling the new removal function instead of the validation/exit function
    remove_existing_agent
    
    download_installer
    configure_installer
    clean_output_logs
    install_agent
    clean_install_logs
}

main "$@"