#!/usr/bin/env bash

# Setup script for Multipass on Mac (Ubuntu 24.04 guest)
# Counterpart of setup_v6.sh (WSL version)

set -euo pipefail
umask 022

LOGFILE="/var/log/setup.log"
TINET_SOURCE="/mnt/c/tinet/tinet"
TINET_DEST="/usr/bin/tinet"

RESOLVED_CONF="/etc/systemd/resolved.conf"

RESOLVED_LINE="DNS=8.8.8.8 1.1.1.1"

###############################################################################
# Logging
###############################################################################

log() {
    printf '%s\n' "$1" | tee -a "$LOGFILE"
}

section() {
    printf '\n========================================================\n' | tee -a "$LOGFILE"
    printf '%s\n' "$1" | tee -a "$LOGFILE"
    printf '========================================================\n\n' | tee -a "$LOGFILE"
}

run() {
    local desc="$1"
    shift

    log ">> $desc"
    "$@" >> "$LOGFILE" 2>&1
}

###############################################################################
# Utility Functions
###############################################################################

is_multipass() {
    systemd-detect-virt 2>/dev/null | grep -qi qemu
}

###############################################################################
# Step 1: DNS (systemd-resolved)
###############################################################################

configure_dns() {
    section "[1/4] Configuring DNS via systemd-resolved"

    if [ ! -f "$RESOLVED_CONF" ]; then
        log "WARNING: $RESOLVED_CONF not found. Skipping DNS configuration."
        return
    fi

    if grep -q "^${RESOLVED_LINE}$" "$RESOLVED_CONF" 2>/dev/null; then
        log "DNS is already configured. Skipping."
        return
    fi

    # Remove any existing DNS= line and append the expected one.
    log ">> Updating $RESOLVED_CONF"
    sed -i '/^DNS=/d' "$RESOLVED_CONF"
    printf '%s\n' "$RESOLVED_LINE" >> "$RESOLVED_CONF"

    run "Restarting systemd-resolved" systemctl restart systemd-resolved

    log "DNS configured."
}

###############################################################################
# Step 2: System Update
###############################################################################

update_system() {
    section "[2/4] Updating system (this may take some time)"

    run "Syncing time" systemctl restart systemd-timesyncd
    run "Checking connectivity" ping -c 2 8.8.8.8

    run "apt-get update" apt-get update

    run "apt-get upgrade" \
        env DEBIAN_FRONTEND=noninteractive apt-get upgrade -y

    log "System update completed."
}

###############################################################################
# Step 3: Docker
###############################################################################

install_docker() {
    section "[3/4] Installing Docker (this may take some time)"

    if dpkg -s docker.io >/dev/null 2>&1; then
        log "docker.io already installed."
    else
        run "Installing docker.io" \
            env DEBIAN_FRONTEND=noninteractive apt-get install -y docker.io
    fi

    if ! systemctl is-enabled docker >/dev/null 2>&1; then
        run "Enabling docker" systemctl enable docker
    fi

    if ! systemctl is-active docker >/dev/null 2>&1; then
        run "Starting docker" systemctl start docker
    fi

    log "Docker ready."
}

###############################################################################
# Step 4: tinet
###############################################################################

install_tinet() {
    section "[4/4] Installing tinet"

    if [ ! -f "$TINET_SOURCE" ]; then
        echo "ERROR: $TINET_SOURCE not found." >&2
        echo "Ensure the host directory is mounted to /mnt/c/tinet in the VM." >&2
        exit 1
    fi

    run "Copying tinet" cp "$TINET_SOURCE" "$TINET_DEST"
    run "Setting executable" chmod +x "$TINET_DEST"

    log "tinet installed."
}

###############################################################################
# Main
###############################################################################

main() {
    if [ "$(id -u)" -ne 0 ]; then
        echo "ERROR: This script must be run as root." >&2
        exit 1
    fi

    : > "$LOGFILE"

    section "Starting setup (Multipass)"

    if ! is_multipass; then
        log "WARNING: This environment does not appear to be Multipass (QEMU)."
    fi

    configure_dns
    update_system
    install_docker
    install_tinet

    section "Setup completed"
}

main "$@"
