#!/usr/bin/bash
# Generate pkgutil catalog and descriptions from .pkg.gz files in EXPORTDIR
# Writes catalog + descriptions to OUTDIR.

EXPORTDIR=/export/home/ai/ozsw-export
OUTDIR=/tmp/ozsw-catalog.$$
TMPBASE=$OUTDIR/work

mkdir -p "$OUTDIR" "$TMPBASE"
> "$OUTDIR/catalog"
> "$OUTDIR/descriptions"

# Deps to strip: GAR artifacts that don't exist in our repo
STRIP_DEPS="CSWcas-dictconf OZSWcommon"

for pkgfile in "$EXPORTDIR"/*.pkg.gz; do
    filename=$(basename "$pkgfile")
    echo "Processing $filename ..." >&2

    # File size and md5
    size=$(wc -c < "$pkgfile" | tr -d ' \t')
    md5=$(/opt/ozsw/bin/openssl md5 < "$pkgfile" | awk '{print $NF}')

    # Extract to temp dir
    pkgtmpdir="$TMPBASE/pkg"
    rm -rf "$pkgtmpdir"
    mkdir -p "$pkgtmpdir/stream" "$pkgtmpdir/root"

    gunzip -c "$pkgfile" > "$pkgtmpdir/stream/pkg.pkg"
    pkgtrans "$pkgtmpdir/stream/pkg.pkg" "$pkgtmpdir/root" all 2>/dev/null || {
        echo "  WARNING: pkgtrans failed for $filename" >&2
        rm -rf "$pkgtmpdir"
        continue
    }

    pkgdir=$(ls -d "$pkgtmpdir/root"/OZSW* 2>/dev/null | head -1)
    if [ -z "$pkgdir" ]; then
        echo "  WARNING: no OZSW package dir in $filename, skipping" >&2
        rm -rf "$pkgtmpdir"
        continue
    fi
    pkgname=$(basename "$pkgdir")

    # Common name from OPENCSW_CATALOGNAME (reliable, no spaces)
    common=$(grep '^OPENCSW_CATALOGNAME=' "$pkgdir/pkginfo" | cut -d= -f2-)
    if [ -z "$common" ]; then
        # Fallback: strip OZSW prefix and lowercase
        common=$(echo "$pkgname" | gsed 's/^OZSW//' | tr '[:upper:]' '[:lower:]')
    fi

    # Version
    version=$(grep '^VERSION=' "$pkgdir/pkginfo" | cut -d= -f2-)

    # Category (first word)
    category=$(grep '^CATEGORY=' "$pkgdir/pkginfo" | cut -d= -f2- | awk '{print $1}')
    [ -z "$category" ] && category="application"

    # Description: NAME field is "catalogname - long description"
    namefield=$(grep '^NAME=' "$pkgdir/pkginfo" | cut -d= -f2-)
    desc=$(echo "$namefield" | gsed 's/^[^ ]* - //')

    # Dependencies: P lines in install/depend, filter out GAR artifacts
    deps="none"
    if [ -f "$pkgdir/install/depend" ]; then
        deplist=$(grep '^P ' "$pkgdir/install/depend" 2>/dev/null | awk '{print $2}')
        for strip in $STRIP_DEPS; do
            deplist=$(echo "$deplist" | grep -v "^${strip}$")
        done
        deplist=$(echo "$deplist" | tr '\n' '|' | gsed 's/|$//')
        [ -n "$deplist" ] && deps="$deplist"
    fi

    echo "$common $version $pkgname $filename $md5 $size $deps $category" >> "$OUTDIR/catalog"
    echo "$pkgname - $desc" >> "$OUTDIR/descriptions"

    rm -rf "$pkgtmpdir"
done

rm -rf "$TMPBASE"

echo "" >&2
echo "Generated $(wc -l < $OUTDIR/catalog) catalog entries." >&2
echo "Output: $OUTDIR/catalog  $OUTDIR/descriptions" >&2
echo "$OUTDIR"
