#!/usr/bin/env bash
set -euo pipefail

# Usage:
#   sudo ./mirror-wave-split.sh <new-wave-name> [previous-wave-name]
#
# Examples:
#   sudo ./mirror-wave-split.sh wave-001-2026-02-24
#   sudo ./mirror-wave-split.sh wave-002-2026-03-15 wave-001-2026-02-24
#
# Notes:
# - If previous wave is provided, this script seeds the new wave with hard links
#   using cp -al (same filesystem required).
# - Designed for separate archive/security trees to avoid debmirror cleanup collisions.
# - Uses debmirror default cleanup behavior (no --nocleanup).
#
# Requirements:
#   sudo apt install -y debmirror gnupg xz-utils

NEW_WAVE="${1:-}"
PREV_WAVE="${2:-}"

if [[ -z "$NEW_WAVE" ]]; then
  echo "Usage: $0 <new-wave-name> [previous-wave-name]"
  exit 1
fi

# ---- CONFIG ----
MIRROR_ROOT="/srv/ubuntu-mirror"
WAVES_ROOT="$MIRROR_ROOT/waves"

NEW_WAVE_DIR="$WAVES_ROOT/$NEW_WAVE"
ARCHIVE_DIR="$NEW_WAVE_DIR/archive"
SECURITY_DIR="$NEW_WAVE_DIR/security"

COMPONENTS="main,restricted,universe"
ARCH="amd64"

# Upstream split
ARCHIVE_HOST="archive.ubuntu.com"
ARCHIVE_ROOT="ubuntu"
ARCHIVE_DISTS="jammy,jammy-updates,noble,noble-updates"

SECURITY_HOST="security.ubuntu.com"
SECURITY_ROOT="ubuntu"
SECURITY_DISTS="jammy-security,noble-security"
# ---------------

echo "== Ubuntu wave mirror build =="
echo "New wave:   $NEW_WAVE"
echo "Wave dir:   $NEW_WAVE_DIR"
if [[ -n "$PREV_WAVE" ]]; then
  echo "Seed from:  $PREV_WAVE"
fi
echo "Components: $COMPONENTS"
echo "Arch:       $ARCH"
echo

# Basic checks
command -v debmirror >/dev/null || { echo "ERROR: debmirror not found"; exit 1; }
command -v cp >/dev/null || { echo "ERROR: cp not found"; exit 1; }

mkdir -p "$WAVES_ROOT"

if [[ -e "$NEW_WAVE_DIR" ]]; then
  echo "Wave already exists, reusing: $NEW_WAVE_DIR"

  # If rerunning, do NOT allow seeding again
  if [[ -n "$PREV_WAVE" ]]; then
    echo "ERROR: target wave already exists, so you cannot seed it again from a previous wave."
    echo "Re-run without the previous-wave argument:"
    echo "  $0 $NEW_WAVE"
    exit 1
  fi

  [[ -d "$ARCHIVE_DIR" ]]  || { echo "ERROR: missing archive dir: $ARCHIVE_DIR"; exit 1; }
  [[ -d "$SECURITY_DIR" ]] || { echo "ERROR: missing security dir: $SECURITY_DIR"; exit 1; }

else
  # Optional hardlink seed from prior wave
  if [[ -n "$PREV_WAVE" ]]; then
    PREV_WAVE_DIR="$WAVES_ROOT/$PREV_WAVE"
    PREV_ARCHIVE_DIR="$PREV_WAVE_DIR/archive"
    PREV_SECURITY_DIR="$PREV_WAVE_DIR/security"

    [[ -d "$PREV_ARCHIVE_DIR" ]]  || { echo "ERROR: missing previous archive dir: $PREV_ARCHIVE_DIR"; exit 1; }
    [[ -d "$PREV_SECURITY_DIR" ]] || { echo "ERROR: missing previous security dir: $PREV_SECURITY_DIR"; exit 1; }

    echo "Seeding new wave with hard links (cp -al)..."
    mkdir -p "$NEW_WAVE_DIR"
    cp -al "$PREV_ARCHIVE_DIR"  "$ARCHIVE_DIR"
    cp -al "$PREV_SECURITY_DIR" "$SECURITY_DIR"
  else
    echo "Creating empty wave directories..."
    mkdir -p "$ARCHIVE_DIR" "$SECURITY_DIR"
  fi
fi



# Optional hardlink seed from prior wave
if [[ -n "$PREV_WAVE" ]]; then
  PREV_WAVE_DIR="$WAVES_ROOT/$PREV_WAVE"
  PREV_ARCHIVE_DIR="$PREV_WAVE_DIR/archive"
  PREV_SECURITY_DIR="$PREV_WAVE_DIR/security"

  [[ -d "$PREV_ARCHIVE_DIR" ]] || { echo "ERROR: missing previous archive dir: $PREV_ARCHIVE_DIR"; exit 1; }
  [[ -d "$PREV_SECURITY_DIR" ]] || { echo "ERROR: missing previous security dir: $PREV_SECURITY_DIR"; exit 1; }

  echo "Seeding new wave with hard links (cp -al)..."
  mkdir -p "$NEW_WAVE_DIR"
  cp -al "$PREV_ARCHIVE_DIR" "$ARCHIVE_DIR"
  cp -al "$PREV_SECURITY_DIR" "$SECURITY_DIR"
else
  echo "Creating empty wave directories..."
  mkdir -p "$ARCHIVE_DIR" "$SECURITY_DIR"
fi

echo
echo "Mirroring ARCHIVE tree (archive.ubuntu.com)..."
debmirror "$ARCHIVE_DIR" \
  --host="$ARCHIVE_HOST" \
  --root="$ARCHIVE_ROOT" \
  --method=http \
  --dist="$ARCHIVE_DISTS" \
  --section="$COMPONENTS" \
  --arch="$ARCH" \
  --nosource \
  --progress \
  --verbose

echo
echo "Mirroring SECURITY tree (security.ubuntu.com)..."
debmirror "$SECURITY_DIR" \
  --host="$SECURITY_HOST" \
  --root="$SECURITY_ROOT" \
  --method=http \
  --dist="$SECURITY_DISTS" \
  --section="$COMPONENTS" \
  --arch="$ARCH" \
  --nosource \
  --progress \
  --verbose

echo
echo "Validating expected Release files..."

# Archive checks
for f in \
  "$ARCHIVE_DIR/dists/jammy/Release" \
  "$ARCHIVE_DIR/dists/jammy-updates/Release" \
  "$ARCHIVE_DIR/dists/noble/Release" \
  "$ARCHIVE_DIR/dists/noble-updates/Release"
do
  [[ -f "$f" ]] || { echo "MISSING: $f"; exit 1; }
  echo "OK: $f"
done

# Security checks
for f in \
  "$SECURITY_DIR/dists/jammy-security/Release" \
  "$SECURITY_DIR/dists/noble-security/Release"
do
  [[ -f "$f" ]] || { echo "MISSING: $f"; exit 1; }
  echo "OK: $f"
done

echo
echo "Wave build complete:"
echo "  Archive : $ARCHIVE_DIR"
echo "  Security: $SECURITY_DIR"
echo
echo "Next recommended step:"
echo "  Re-run this same command once more (same wave) as a quick reconciliation pass,"
