#!/bin/bash
#
# Generate os_list JSON for RPi Imager custom repository.
#
# Run this on the image archive server where the .img.xz files live.
# It scans the image directory, computes hashes and sizes, and writes
# the JSON file that RPi Imager expects via IMAGER_REPO_URL.
#
# Usage: gen-imager-repo.sh [image_dir] [base_url]
#
# Defaults:
#   image_dir: /srv/repo/images/apollo
#   base_url:  https://archive.watter.com/images/apollo
#
# Output: writes os_list.json to image_dir

set -euo pipefail

IMAGE_DIR="${1:-/srv/repo/images/apollo}"
BASE_URL="${2:-https://archive.watter.com/images/apollo}"
OUTPUT="${IMAGE_DIR}/os_list.json"

if [ ! -d "$IMAGE_DIR" ]; then
    echo "Error: image directory not found: $IMAGE_DIR" >&2
    exit 1
fi

if ! command -v jq &> /dev/null; then
    echo "Error: jq is required" >&2
    exit 1
fi

# Build the os_list entries
entries="[]"

for img in "$IMAGE_DIR"/*.img.xz; do
    [ -f "$img" ] || continue

    filename=$(basename "$img")
    download_size=$(stat -c %s "$img")

    # Get extract size from xz header
    extract_size=$(xz --robot --list "$img" 2>/dev/null \
        | awk '/^totals/ {print $5}')
    if [ -z "$extract_size" ]; then
        echo "Warning: cannot determine extract size for $filename, skipping" >&2
        continue
    fi

    echo "Processing: $filename" >&2

    # Compute SHA256 of the extracted image
    extract_sha256=$(xz -dc "$img" | sha256sum | awk '{print $1}')

    # Parse release date from filename (expects YYYY-MM-DD in the name)
    release_date=$(echo "$filename" | grep -oP '\d{4}-\d{2}-\d{2}' | head -1)
    if [ -z "$release_date" ]; then
        release_date=$(date -r "$img" +%Y-%m-%d)
    fi

    # Build a display name from the filename
    # e.g. 2026-03-01-apollo-arm64.img.xz -> Apollo arm64 2026-03-01
    name_part=$(echo "$filename" | sed -e 's/\.img\.xz$//' -e 's/^[0-9-]*//')
    name_part=$(echo "$name_part" | sed -e 's/-/ /g' -e 's/^ *//')
    display_name="WATTER ${name_part} (${release_date})"

    entry=$(jq -n \
        --arg name "$display_name" \
        --arg description "WATTER Apollo OS image" \
        --arg url "${BASE_URL}/${filename}" \
        --argjson extract_size "$extract_size" \
        --arg extract_sha256 "$extract_sha256" \
        --argjson image_download_size "$download_size" \
        --arg release_date "$release_date" \
        '{
            name: $name,
            description: $description,
            icon: "https://archive.watter.com/images/watter-icon.png",
            url: $url,
            extract_size: $extract_size,
            extract_sha256: $extract_sha256,
            image_download_size: $image_download_size,
            release_date: $release_date,
            init_format: "cloudinit-rpi",
            devices: ["pi5-64bit", "pi4-64bit"]
        }')

    entries=$(echo "$entries" | jq --argjson entry "$entry" '. + [$entry]')
done

# Sort entries by release_date descending (newest first)
entries=$(echo "$entries" | jq 'sort_by(.release_date) | reverse')

count=$(echo "$entries" | jq 'length')

if [ "$count" -eq 0 ]; then
    echo "Error: no .img.xz files found in $IMAGE_DIR" >&2
    exit 1
fi

# Write the final JSON
jq -n --argjson os_list "$entries" '{
    imager: {},
    os_list: $os_list
}' > "$OUTPUT"

echo "Generated $OUTPUT with $count image(s)" >&2
