#!/bin/bash

# Abort if anything fails
set -e

# Parse command line arguments
NO_CACHE=""
while [[ $# -gt 0 ]]; do
  case $1 in
  --no-cache)
    NO_CACHE=1
    shift
    ;;
  --no-boot-offer)
    NO_BOOT_OFFER=1
    shift
    ;;
  --local-source)
    LOCAL_SOURCE=1
    shift
    ;;
  --dev)
    OMARCHY_INSTALLER_REF=dev
    shift
    ;;
  *)
    echo "Unknown option: $1"
    echo "Usage: $0 [--no-cache] [--no-boot-offer] [--local-source] [--dev]"
    exit 1
    ;;
  esac
done

# Ensure we have the submodule checked out
git submodule update --init --recursive --jobs=8

# Prepare build repo
BUILD_SCRIPT="builder/build-iso.sh"
BUILD_ROOT=$(realpath "${BASH_SOURCE[0]%/*}/..")
BUILD_RELEASE_PATH="$BUILD_ROOT/release"
mkdir -p "$BUILD_RELEASE_PATH"

OMARCHY_INSTALLER_REPO="${OMARCHY_INSTALLER_REPO:-basecamp/omarchy}"
OMARCHY_INSTALLER_REF="${OMARCHY_INSTALLER_REF:-master}"

DOCKER_ARGS=(
  --rm
  --privileged
  -e "OMARCHY_INSTALLER_REPO=$OMARCHY_INSTALLER_REPO"
  -e "OMARCHY_INSTALLER_REF=$OMARCHY_INSTALLER_REF"
  -e "HOST_UID=$(id -u)"
  -e "HOST_GID=$(id -g)"
  -v "$BUILD_RELEASE_PATH/:/out/"
  -v "$BUILD_ROOT/$BUILD_SCRIPT:/$BUILD_SCRIPT:ro"
  -v "$BUILD_ROOT/archiso:/archiso:ro"
  -v "$BUILD_ROOT/builder:/builder:ro"
  -v "$BUILD_ROOT/configs:/configs:ro"
)

# Mount omarchy-pkgs if it exists (for local package building)
# Can be overridden with OMARCHY_PKGS_PATH environment variable
if [ -z "$OMARCHY_PKGS_PATH" ]; then
  OMARCHY_PKGS_PATH="$BUILD_ROOT/../omarchy-pkgs"
fi

if [ -d "$OMARCHY_PKGS_PATH" ]; then
  echo "Mounting omarchy-pkgs from: $OMARCHY_PKGS_PATH"
  OMARCHY_PKGS_PATH=$(realpath "$OMARCHY_PKGS_PATH")
  DOCKER_ARGS+=(-v "$OMARCHY_PKGS_PATH:/omarchy-pkgs:ro")
else
  echo "Note: omarchy-pkgs not found at $OMARCHY_PKGS_PATH (build will fail)"
fi

# Mount omarchy-installer for dev builds (optional)
# Can be overridden with OMARCHY_INSTALLER_PATH environment variable
# If not set, will auto-detect ../omarchy-installer for dev builds
if [ -n "$LOCAL_SOURCE" ]; then
  if [ -z "$OMARCHY_INSTALLER_PATH" ]; then
    OMARCHY_INSTALLER_PATH="$BUILD_ROOT/../omarchy-installer"
  fi
  
  if [ -d "$OMARCHY_INSTALLER_PATH" ]; then
    echo "Mounting omarchy-installer from: $OMARCHY_INSTALLER_PATH (dev mode)"
    OMARCHY_INSTALLER_PATH=$(realpath "$OMARCHY_INSTALLER_PATH")
    DOCKER_ARGS+=(-v "$OMARCHY_INSTALLER_PATH:/omarchy-installer:ro")
    DOCKER_ARGS+=(-e "OMARCHY_DEV_BUILD=1")
  else
    echo "Note: omarchy-installer not found at $OMARCHY_INSTALLER_PATH"
    echo "      Will use git clone from PKGBUILD"
  fi
fi

# Use local pacman cache if you already have one on host to speed up repeat runs
if [ -d "/var/cache/pacman/pkg" ]; then
  DOCKER_ARGS+=(-v "/var/cache/pacman/pkg:/var/cache/pacman/pkg")
fi

# Mount the build cache directory where packages are downloaded
if [[ -z "$NO_CACHE" ]]; then
  # using a dated dir on the host to refresh daily if building multiple times
  BUILD_DATE=$(date +%Y-%m-%d)
  OFFLINE_REPO_BUILD_CACHE_DIR="$HOME/.cache/omarchy/iso_${BUILD_DATE}/airootfs/var/cache/omarchy"
  mkdir -p "$OFFLINE_REPO_BUILD_CACHE_DIR"
  # Mount to /var/cache/airootfs/var/cache/omarchy since that's where repo packages go in the ISO
  DOCKER_ARGS+=(-v "$OFFLINE_REPO_BUILD_CACHE_DIR:/var/cache/airootfs/var/cache/omarchy")
fi

# Run the builder with assembled args
docker run "${DOCKER_ARGS[@]}" archlinux/archlinux:latest /$BUILD_SCRIPT

# Move as install ref
latest_iso=$(\ls -t "$BUILD_RELEASE_PATH"/*.iso | head -n1)
iso_ref="${latest_iso%.*}-$OMARCHY_INSTALLER_REF.iso"
mv -f "$latest_iso" "$iso_ref"

# Offer to boot the new build
if [[ -z "$NO_BOOT_OFFER" ]]; then
  echo
  gum confirm "Boot $iso_ref?" && omarchy-iso-boot "$iso_ref"
fi
