#!/bin/bash

###############################################################################
# FORFIRM WebLinks deployment
# Downloads and installs FORFIRM-Weblinks-1.3.pkg

# Changelog 1.3: - updated Copilot Studio link
# Changelog 1.2: - updated link, updated version, updated detection function, updated post-install action
###############################################################################

SCRIPT_VERSION="1.3"

PKG_URL="https://repo.forfirm.com/intune/macfiles/FORFIRM-Weblinks-1.3.pkg"
PKG_FILE="/private/var/tmp/FORFIRM-Weblinks-1.3.pkg"

WEBLINK_DIR="/Users/Shared/FORFIRM/Weblinks"

PKG_ID="com.forfirm.weblinks"
DESIRED_VERSION="1.3"

LOG_DIR="/Users/Shared/FORFIRM/Logs"
LOG_FILE="${LOG_DIR}/weblinks-install.log"

###############################################################################
# Functions
###############################################################################

mkdir -p "$LOG_DIR"
touch "$LOG_FILE"
chmod 755 "$LOG_DIR"
chmod 644 "$LOG_FILE"

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

cleanup() {
    if [[ -f "$PKG_FILE" ]]; then
        /bin/rm -f "$PKG_FILE"
    fi
}

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

trap cleanup EXIT

###############################################################################
# Start
###############################################################################

log "============================================================"
log "FORFIRM WebLinks installation"
log "Script version: ${SCRIPT_VERSION}"
log "Execution user: $(/usr/bin/id -un)"
log "Execution UID: $(/usr/bin/id -u)"
log "Package URL: ${PKG_URL}"
log "Package path: ${PKG_FILE}"
log "============================================================"

###############################################################################
# Require root
###############################################################################

if [[ "$(/usr/bin/id -u)" -ne 0 ]]; then
    fail "This script must run as root. Configure Intune to run it as the signed-in user: No."
fi

###############################################################################
# Detection
###############################################################################

CURRENT_VERSION=""

if /usr/sbin/pkgutil --pkg-info "$PKG_ID" >/dev/null 2>&1; then
    CURRENT_VERSION=$(/usr/sbin/pkgutil --pkg-info "$PKG_ID" | awk '/version:/ {print $2}')
    log "Installed package version: ${CURRENT_VERSION}"
else
    log "Package receipt not found."
fi

if [[ "$CURRENT_VERSION" == "$DESIRED_VERSION" ]]; then
    log "Latest WebLinks version already installed."
    exit 0
fi

log "Updating WebLinks from version '${CURRENT_VERSION:-None}' to '${DESIRED_VERSION}'."

###############################################################################
# Prepare download location
###############################################################################

/bin/mkdir -p "$(/usr/bin/dirname "$PKG_FILE")"
/bin/rm -f "$PKG_FILE"

###############################################################################
# Download package
###############################################################################

log "Downloading package."

/usr/bin/curl \
    --location \
    --fail \
    --silent \
    --show-error \
    --connect-timeout 30 \
    --retry 3 \
    --retry-delay 5 \
    --output "$PKG_FILE" \
    "$PKG_URL" >>"$LOG_FILE" 2>&1

CURL_EXIT_CODE=$?

if [[ $CURL_EXIT_CODE -ne 0 ]]; then
    fail "Package download failed. curl exit code: ${CURL_EXIT_CODE}"
fi

###############################################################################
# Validate downloaded file
###############################################################################

if [[ ! -e "$PKG_FILE" ]]; then
    fail "Downloaded package does not exist at ${PKG_FILE}"
fi

if [[ ! -f "$PKG_FILE" ]]; then
    fail "Downloaded package path is not a regular file: ${PKG_FILE}"
fi

if [[ ! -r "$PKG_FILE" ]]; then
    fail "Downloaded package is not readable: ${PKG_FILE}"
fi

PKG_SIZE=$(/usr/bin/stat -f%z "$PKG_FILE" 2>/dev/null)

if [[ -z "$PKG_SIZE" || "$PKG_SIZE" -lt 1024 ]]; then
    fail "Downloaded package is unexpectedly small: ${PKG_SIZE:-unknown} bytes"
fi

/bin/chown root:wheel "$PKG_FILE"
/bin/chmod 644 "$PKG_FILE"

log "Package downloaded successfully."
log "Package size: ${PKG_SIZE} bytes"
log "Package type: $(/usr/bin/file -b "$PKG_FILE")"
log "Package details: $(/bin/ls -l "$PKG_FILE")"

###############################################################################
# Validate package structure
###############################################################################

if ! /usr/bin/xar -tf "$PKG_FILE" >>"$LOG_FILE" 2>&1; then
    fail "The downloaded file is not a readable XAR package."
fi

VALIDATION_DIR=$(/usr/bin/mktemp -d "/private/var/tmp/FORFIRM-Weblinks-validation.XXXXXX")

if [[ -z "$VALIDATION_DIR" || ! -d "$VALIDATION_DIR" ]]; then
    fail "Unable to create package validation directory."
fi

if ! /usr/sbin/pkgutil --expand "$PKG_FILE" "$VALIDATION_DIR/Expanded.pkg" \
    >>"$LOG_FILE" 2>&1; then

    /bin/rm -rf "$VALIDATION_DIR"
    fail "pkgutil could not expand the package. The PKG structure is invalid."
fi

/bin/rm -rf "$VALIDATION_DIR"

log "Package structure validation completed successfully."

###############################################################################
# Install package
###############################################################################

log "Installing package from: ${PKG_FILE}"

/usr/sbin/installer \
    -verboseR \
    -pkg "$PKG_FILE" \
    -target / >>"$LOG_FILE" 2>&1

INSTALL_EXIT_CODE=$?

if [[ $INSTALL_EXIT_CODE -ne 0 ]]; then
    fail "Package installation failed. installer exit code: ${INSTALL_EXIT_CODE}"
fi

log "Installer completed successfully."

###############################################################################
# Post-install validation
###############################################################################

INSTALLED_VERSION=$(/usr/sbin/pkgutil --pkg-info "$PKG_ID" 2>/dev/null | awk '/version:/ {print $2}')

if [[ "$INSTALLED_VERSION" != "$DESIRED_VERSION" ]]; then
    fail "Expected package version ${DESIRED_VERSION}, but found '${INSTALLED_VERSION:-None}'."
fi

log "Package version ${INSTALLED_VERSION} successfully installed."

###############################################################################
# Refresh Dock for logged-in user
###############################################################################

CONSOLE_USER=$(/usr/bin/stat -f "%Su" /dev/console 2>/dev/null)

if [[ -n "$CONSOLE_USER" && "$CONSOLE_USER" != "root" && "$CONSOLE_USER" != "loginwindow" ]]; then
    log "Refreshing Dock for logged-in user: ${CONSOLE_USER}"
    /usr/bin/killall -u "$CONSOLE_USER" Dock >>"$LOG_FILE" 2>&1 || true
else
    log "No interactive user detected. Dock refresh skipped."
fi

log "FORFIRM WebLinks installation completed successfully."

exit 0