#!/bin/bash
# Unified PPA status checker for DMS packages
# Checks build status for packages across multiple PPAs via Launchpad API
# Usage: ./distro/scripts/ppa-status.sh [package-name] [ppa-name]
#
# Examples:
#   ./distro/scripts/ppa-status.sh              # Check all packages in all PPAs
#   ./distro/scripts/ppa-status.sh dms          # Check dms package
#   ./distro/scripts/ppa-status.sh all dms-git  # Check all packages in dms-git PPA

PPA_OWNER="avengemedia"
LAUNCHPAD_API="https://api.launchpad.net/1.0"
DISTRO_SERIES="questing"

# Define packages (sync with ppa-upload.sh)
ALL_PACKAGES=(dms dms-git dms-greeter)

# Function to get PPA name for a package
get_ppa_name() {
    local pkg="$1"
    case "$pkg" in
        dms) echo "dms" ;;
        dms-git) echo "dms-git" ;;
        dms-greeter) echo "danklinux" ;;
        *) echo "" ;;
    esac
}

# Check for required tools
if ! command -v curl &> /dev/null; then
    echo "Error: curl is required but not installed"
    exit 1
fi

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

# Parse arguments
PACKAGE_INPUT="${1:-}"
PPA_INPUT="${2:-}"

# Determine packages and PPAs to check
if [[ -n "$PACKAGE_INPUT" ]] && [[ "$PACKAGE_INPUT" != "all" ]]; then
    # Check specific package
    VALID_PACKAGE=false
    for pkg in "${ALL_PACKAGES[@]}"; do
        if [[ "$PACKAGE_INPUT" == "$pkg" ]]; then
            VALID_PACKAGE=true
            break
        fi
    done

    if [[ "$VALID_PACKAGE" != "true" ]]; then
        echo "Error: Unknown package: $PACKAGE_INPUT"
        echo "Available packages: ${ALL_PACKAGES[*]}"
        exit 1
    fi

    PACKAGES=("$PACKAGE_INPUT")
    if [[ -n "$PPA_INPUT" ]]; then
        PPAS=("$PPA_INPUT")
    else
        PPAS=("$(get_ppa_name "$PACKAGE_INPUT")")
    fi
elif [[ -n "$PPA_INPUT" ]]; then
    # Check all packages in specific PPA
    PACKAGES=("${ALL_PACKAGES[@]}")
    PPAS=("$PPA_INPUT")
else
    # Check all packages in all PPAs
    PACKAGES=("${ALL_PACKAGES[@]}")
    PPAS=("dms" "dms-git" "danklinux")
fi

# Function to get build status color and symbol
get_status_display() {
    local status="$1"
    case "$status" in
        "Successfully built")
            echo -e "✅ \033[0;32m$status\033[0m"
            ;;
        "Failed to build")
            echo -e "❌ \033[0;31m$status\033[0m"
            ;;
        "Needs building"|"Currently building")
            echo -e "⏳ \033[0;33m$status\033[0m"
            ;;
        "Dependency wait")
            echo -e "⚠️ \033[0;33m$status\033[0m"
            ;;
        "Chroot problem")
            echo -e "🔧 \033[0;31m$status\033[0m"
            ;;
        "Uploading build")
            echo -e "📤 \033[0;36m$status\033[0m"
            ;;
        *)
            echo -e "❓ \033[0;37m$status\033[0m"
            ;;
    esac
}

# Check each PPA
for PPA_NAME in "${PPAS[@]}"; do
    PPA_ARCHIVE="${LAUNCHPAD_API}/~${PPA_OWNER}/+archive/ubuntu/${PPA_NAME}"

    echo "=========================================="
    echo "=== PPA: ${PPA_OWNER}/${PPA_NAME} ==="
    echo "=========================================="
    echo "Distribution: Ubuntu $DISTRO_SERIES"
    echo ""

    for pkg in "${PACKAGES[@]}"; do
        # Only check packages that belong to this PPA
        PKG_PPA=$(get_ppa_name "$pkg")
        if [[ "$PKG_PPA" != "$PPA_NAME" ]]; then
            continue
        fi

        echo "----------------------------------------"
        echo "--- $pkg ---"
        echo "----------------------------------------"

        # Get published sources for this package
        SOURCES_URL="${PPA_ARCHIVE}?ws.op=getPublishedSources&source_name=${pkg}&distro_series=${LAUNCHPAD_API}/ubuntu/${DISTRO_SERIES}&status=Published"

        SOURCES=$(curl -s "$SOURCES_URL" 2>/dev/null)

        if [[ -z "$SOURCES" ]] || [[ "$SOURCES" == "null" ]]; then
            echo "  ⚠️  No published sources found"
            echo ""
            continue
        fi

        # Get the latest source
        TOTAL=$(echo "$SOURCES" | jq '.total_size // 0')

        if [[ "$TOTAL" == "0" ]]; then
            echo "  ⚠️  No published sources found for $DISTRO_SERIES"
            echo ""
            continue
        fi

        # Get most recent entry
        ENTRY=$(echo "$SOURCES" | jq '.entries[0]')

        if [[ "$ENTRY" == "null" ]]; then
            echo "  ⚠️  No source entries found"
            echo ""
            continue
        fi

        # Extract source info
        VERSION=$(echo "$ENTRY" | jq -r '.source_package_version // "unknown"')
        STATUS=$(echo "$ENTRY" | jq -r '.status // "unknown"')
        DATE_PUBLISHED=$(echo "$ENTRY" | jq -r '.date_published // "unknown"')
        SELF_LINK=$(echo "$ENTRY" | jq -r '.self_link // ""')

        echo "  📦 Version: $VERSION"
        echo "  📅 Published: ${DATE_PUBLISHED%T*}"
        echo "  📋 Source Status: $STATUS"
        echo ""

        # Get builds for this source
        if [[ -n "$SELF_LINK" && "$SELF_LINK" != "null" ]]; then
            BUILDS_URL="${SELF_LINK}?ws.op=getBuilds"
            BUILDS=$(curl -s "$BUILDS_URL" 2>/dev/null)

            if [[ -n "$BUILDS" && "$BUILDS" != "null" ]]; then
                BUILD_COUNT=$(echo "$BUILDS" | jq '.total_size // 0')

                if [[ "$BUILD_COUNT" -gt 0 ]]; then
                    echo "  Builds:"
                    echo "$BUILDS" | jq -r '.entries[] | "\(.arch_tag) \(.buildstate)"' 2>/dev/null | while read -r line; do
                        ARCH=$(echo "$line" | awk '{print $1}')
                        BUILD_STATUS=$(echo "$line" | cut -d' ' -f2-)
                        DISPLAY=$(get_status_display "$BUILD_STATUS")
                        echo "    $ARCH: $DISPLAY"
                    done
                fi
            fi
        fi

        # Alternative: Get build records directly from archive
        BUILD_RECORDS_URL="${PPA_ARCHIVE}?ws.op=getBuildRecords&source_name=${pkg}"
        BUILD_RECORDS=$(curl -s "$BUILD_RECORDS_URL" 2>/dev/null)

        if [[ -n "$BUILD_RECORDS" && "$BUILD_RECORDS" != "null" ]]; then
            RECORD_COUNT=$(echo "$BUILD_RECORDS" | jq '.total_size // 0')

            if [[ "$RECORD_COUNT" -gt 0 ]]; then
                echo ""
                echo "  Recent build history:"

                # Get unique version+arch combinations
                echo "$BUILD_RECORDS" | jq -r '.entries[:6][] | "\(.source_package_version) \(.arch_tag) \(.buildstate)"' 2>/dev/null | while read -r line; do
                    VER=$(echo "$line" | awk '{print $1}')
                    ARCH=$(echo "$line" | awk '{print $2}')
                    BUILD_STATUS=$(echo "$line" | cut -d' ' -f3-)
                    DISPLAY=$(get_status_display "$BUILD_STATUS")
                    echo "    $VER ($ARCH): $DISPLAY"
                done
            fi
        fi

        echo ""
    done

    echo "View full PPA at: https://launchpad.net/~${PPA_OWNER}/+archive/ubuntu/${PPA_NAME}"
    echo ""
done

echo "=========================================="
echo "Status check complete!"
echo ""
