#!/bin/bash
# pr-diff.sh - Get the diff for a pull request on GitHub or Gitea
# Usage: pr-diff.sh -n <pr_number> [-r owner/repo] [-o <output_file>]

set -e

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "$SCRIPT_DIR/detect-platform.sh"

# Parse arguments
PR_NUMBER=""
OUTPUT_FILE=""
REPO_OVERRIDE=""
HOST_OVERRIDE=""

while [[ $# -gt 0 ]]; do
    case $1 in
        -n|--number)
            PR_NUMBER="$2"
            shift 2
            ;;
        -o|--output)
            OUTPUT_FILE="$2"
            shift 2
            ;;
        -r|--repo)
            REPO_OVERRIDE="$2"
            shift 2
            ;;
        --host)
            HOST_OVERRIDE="$2"
            shift 2
            ;;
        -h|--help)
            echo "Usage: pr-diff.sh -n <pr_number> [-r owner/repo] [--host host] [-o <output_file>]"
            echo ""
            echo "Options:"
            echo "  -n, --number   PR number (required)"
            echo "  -r, --repo     Repository slug (default: infer from git origin)"
            echo "      --host     Gitea host for --repo API calls (or set GITEA_HOST/GITEA_URL)"
            echo "  -o, --output   Output file (optional, prints to stdout if omitted)"
            echo "  -h, --help     Show this help"
            exit 0
            ;;
        *)
            echo "Unknown option: $1"
            exit 1
            ;;
    esac
done

if [[ -z "$PR_NUMBER" ]]; then
    echo "Error: PR number is required (-n)" >&2
    exit 1
fi

if [[ -n "$REPO_OVERRIDE" ]]; then
    REPO_INFO="$REPO_OVERRIDE"
    PLATFORM=$(detect_platform 2>/dev/null || echo gitea)
else
    detect_platform > /dev/null
    REPO_INFO=$(get_repo_info)
fi

if [[ -z "$REPO_INFO" || "$REPO_INFO" == error:* ]]; then
    echo "Error: Could not determine repository from git origin. Run from a repo or pass --repo." >&2
    exit 1
fi

if [[ "$PLATFORM" == "github" ]]; then
    if [[ -n "$OUTPUT_FILE" ]]; then
        gh pr diff "$PR_NUMBER" --repo "$REPO_INFO" > "$OUTPUT_FILE"
    else
        gh pr diff "$PR_NUMBER" --repo "$REPO_INFO"
    fi
elif [[ "$PLATFORM" == "gitea" ]]; then
    # tea doesn't have a direct diff command — use the API
    if [[ -n "$HOST_OVERRIDE" ]]; then
        HOST="$HOST_OVERRIDE"
    elif [[ -n "$REPO_OVERRIDE" ]]; then
        HOST=$(get_gitea_api_host_for_repo_override) || {
            echo "Error: Gitea host is required with --repo. Pass --host or set GITEA_HOST/GITEA_URL." >&2
            exit 1
        }
    else
        HOST=$(get_remote_host) || {
            echo "Error: Could not determine Gitea host from git origin." >&2
            exit 1
        }
    fi

    DIFF_URL="https://${HOST}/api/v1/repos/${REPO_INFO}/pulls/${PR_NUMBER}.diff"

    GITEA_API_TOKEN=$(get_gitea_token "$HOST" || true)

    if [[ -n "$GITEA_API_TOKEN" ]]; then
        DIFF_CONTENT=$(curl -sS -H "User-Agent: curl/8" -H "Authorization: token $GITEA_API_TOKEN" "$DIFF_URL")
    else
        DIFF_CONTENT=$(curl -sS -H "User-Agent: curl/8" "$DIFF_URL")
    fi

    if [[ -n "$OUTPUT_FILE" ]]; then
        echo "$DIFF_CONTENT" > "$OUTPUT_FILE"
    else
        echo "$DIFF_CONTENT"
    fi
else
    echo "Error: Unknown platform" >&2
    exit 1
fi
