#!/bin/bash
set -euo pipefail

# ============================================================================
# PR Issue Collator with CI Failures - Unified Issue Aggregation
# ============================================================================
# Fetches both PR review issues AND CI failures, combines them by severity,
# and outputs in /parallel-solve-ready format.
#
# Features:
#   - Single command: collate-issues-with-ci <PR#>
#   - Combines PR review issues + CI failures
#   - Automatic severity grouping (Critical > Major > Minor > Nit)
#   - Ready for /parallel-solve (no manual parsing needed)
#   - Graceful degradation (continues if CI fetch fails)
# ============================================================================

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
CI_SCRIPT="$SCRIPT_DIR/../ci-failures/ci-quick-review"
COLLATE_SCRIPT="$SCRIPT_DIR/collate-issues"

INCLUDE_NITPICKS=false

usage() {
    cat << 'EOF'
Usage: collate-issues-with-ci <PR_NUMBER> [OPTIONS]

Unified PR issue and CI failure collation.

Arguments:
  PR_NUMBER    PR number (e.g., 33) or full GitHub URL

Options:
  --include-nitpicks    Include nitpick issues in output (default: excluded)
  --help                Show this help message

Output:
  Combined list of PR review issues + CI failures by severity:
    🔴 CRITICAL - Must address before merge
    🟠 MAJOR    - Must address before merge
    🟡 MINOR    - Must address before merge
    ⚪ NITPICK  - Optional improvements (only with --include-nitpicks)

Example:
  collate-issues-with-ci 33                      # Critical, Major, Minor only
  collate-issues-with-ci 33 --include-nitpicks   # Include nitpicks too

Exit codes:
  0 - Success
  1 - Missing arguments or dependencies
  2 - Failed to fetch data
EOF
    exit 1
}

check_dependencies() {
    local missing_deps=()

    if [[ ! -x "$COLLATE_SCRIPT" ]]; then
        missing_deps+=("collate-issues script (not found or not executable)")
    fi

    if [[ ! -x "$CI_SCRIPT" ]]; then
        missing_deps+=("ci-quick-review script (not found or not executable)")
    fi

    if ! command -v jq &> /dev/null; then
        missing_deps+=("jq")
    fi

    if [ ${#missing_deps[@]} -ne 0 ]; then
        echo "ERROR: Missing required dependencies:" >&2
        for dep in "${missing_deps[@]}"; do
            echo "  - $dep" >&2
        done
        exit 1
    fi
}

extract_pr_number() {
    local input="$1"

    if [[ "$input" =~ pull/([0-9]+) ]]; then
        echo "${BASH_REMATCH[1]}"
    elif [[ "$input" =~ ^[0-9]+$ ]]; then
        echo "$input"
    else
        echo "ERROR: Invalid PR number or URL: $input" >&2
        exit 1
    fi
}

main() {
    local pr_number=""

    # Parse arguments
    while [[ $# -gt 0 ]]; do
        case $1 in
            --include-nitpicks)
                INCLUDE_NITPICKS=true
                shift
                ;;
            -h|--help)
                usage
                ;;
            *)
                if [[ -z "$pr_number" ]]; then
                    pr_number="$1"
                else
                    echo "ERROR: Unknown argument: $1" >&2
                    usage
                fi
                shift
                ;;
        esac
    done

    if [[ -z "$pr_number" ]]; then
        usage
    fi

    check_dependencies
    pr_number=$(extract_pr_number "$pr_number")

    # Step 1: Fetch PR review issues
    local pr_issues
    pr_issues=$("$COLLATE_SCRIPT" "$pr_number" --parallel-solve-format 2>&1) || {
        echo "ERROR: Failed to fetch PR review issues for PR #$pr_number" >&2
        exit 2
    }

    # Step 2: Fetch CI failures
    local ci_json=""
    local ci_exit_code=0

    # Attempt to fetch CI data
    if ci_json=$("$CI_SCRIPT" --json "$pr_number" 2>&1); then
        ci_exit_code=0  # Success - CI failures found
    else
        ci_exit_code=$?
        # Exit code 2 means no CI failures (success!)
        # Exit code 1 means error fetching data
        if [[ $ci_exit_code -ne 2 ]]; then
            echo "WARNING: Failed to fetch CI data, continuing with PR review issues only" >&2
        fi
    fi

    # Step 3: Parse CI failures (if found)
    local ci_critical=""
    local ci_major=""
    local ci_minor=""

    if [[ $ci_exit_code -eq 0 ]]; then
        # Parse JSON and format CI failures
        ci_critical=$(echo "$ci_json" | jq -r '
            .failures[]? |
            select(.severity == "critical") |
            "- [\(.workflow):\(.job):\(.step)] \(.error_message // "CI failure") (CI Failure)"
        ' 2>/dev/null || echo "")

        ci_major=$(echo "$ci_json" | jq -r '
            .failures[]? |
            select(.severity == "major") |
            "- [\(.workflow):\(.job):\(.step)] \(.error_message // "CI failure") (CI Failure)"
        ' 2>/dev/null || echo "")

        ci_minor=$(echo "$ci_json" | jq -r '
            .failures[]? |
            select(.severity == "minor") |
            "- [\(.workflow):\(.job):\(.step)] \(.error_message // "CI failure") (CI Failure)"
        ' 2>/dev/null || echo "")
    fi

    # Step 4: Combine outputs
    echo "Fix all PR #${pr_number} issues (PR review + CI failures):"
    echo ""

    # Extract and combine CRITICAL
    local pr_critical
    pr_critical=$(echo "$pr_issues" | sed -n '/^🔴 CRITICAL:/,/^🟠\|^🟡\|^⚪\|^$/p' | grep '^- ' | sed 's/$/ (PR Review)/' || echo "")

    if [[ -n "$pr_critical" ]] || [[ -n "$ci_critical" ]]; then
        echo "🔴 CRITICAL:"
        [[ -n "$pr_critical" ]] && echo "$pr_critical"
        [[ -n "$ci_critical" ]] && echo "$ci_critical"
        echo ""
    fi

    # Extract and combine MAJOR
    local pr_major
    pr_major=$(echo "$pr_issues" | sed -n '/^🟠 MAJOR:/,/^🔴\|^🟡\|^⚪\|^$/p' | grep '^- ' | sed 's/$/ (PR Review)/' || echo "")

    if [[ -n "$pr_major" ]] || [[ -n "$ci_major" ]]; then
        echo "🟠 MAJOR:"
        [[ -n "$pr_major" ]] && echo "$pr_major"
        [[ -n "$ci_major" ]] && echo "$ci_major"
        echo ""
    fi

    # Extract and combine MINOR
    local pr_minor
    pr_minor=$(echo "$pr_issues" | sed -n '/^🟡 MINOR:/,/^🔴\|^🟠\|^⚪\|^$/p' | grep '^- ' | sed 's/$/ (PR Review)/' || echo "")

    if [[ -n "$pr_minor" ]] || [[ -n "$ci_minor" ]]; then
        echo "🟡 MINOR:"
        [[ -n "$pr_minor" ]] && echo "$pr_minor"
        [[ -n "$ci_minor" ]] && echo "$ci_minor"
        echo ""
    fi

    # Extract and include NITPICKS (if flag is set)
    if [[ "$INCLUDE_NITPICKS" == "true" ]]; then
        local pr_nit
        pr_nit=$(echo "$pr_issues" | sed -n '/^⚪ NITPICK:/,/^🔴\|^🟠\|^🟡\|^$/p' | grep '^- ' | sed 's/$/ (PR Review)/' || echo "")

        if [[ -n "$pr_nit" ]]; then
            echo "⚪ NITPICK:"
            echo "$pr_nit"
            echo ""
        fi
    fi
}

main "$@"
