#!/usr/bin/env bash
#
# pipeline-status.sh — Check Woodpecker CI pipeline status
#
# Usage: pipeline-status.sh [-r owner/repo] [-n number] [-f format] [-a instance]
#
# Options:
#   -r repo       Repository in owner/repo format (default: current repo)
#   -n number     Pipeline number (default: latest)
#   -f format     Output format: table (default), json
#   -a instance   Woodpecker instance name (e.g. usc, mosaic)
#   -h            Show this help
#
# Requires: woodpecker credentials in credentials.json
set -euo pipefail

MOSAIC_HOME="${MOSAIC_HOME:-$HOME/.config/mosaic}"
source "$MOSAIC_HOME/tools/_lib/credentials.sh"
source "$(dirname "${BASH_SOURCE[0]}")/_lib.sh"

REPO=""
NUMBER=""
FORMAT="table"
WP_INSTANCE=""

while getopts "r:n:f:a:h" opt; do
  case $opt in
    r) REPO="$OPTARG" ;;
    n) NUMBER="$OPTARG" ;;
    f) FORMAT="$OPTARG" ;;
    a) WP_INSTANCE="$OPTARG" ;;
    h) head -14 "$0" | grep "^#" | sed 's/^# \?//'; exit 0 ;;
    *) echo "Usage: $0 [-r owner/repo] [-n number] [-f format] [-a instance]" >&2; exit 1 ;;
  esac
done

if [[ -n "$WP_INSTANCE" ]]; then
  load_credentials "woodpecker-${WP_INSTANCE}"
else
  load_credentials woodpecker
fi

if [[ -z "$REPO" ]]; then
  REPO=$(wp_detect_repo) || exit 1
fi

# Resolve owner/repo to numeric ID (Woodpecker v3 API)
REPO_ID=$(wp_resolve_repo_id "$REPO") || exit 1

_wp_fetch() {
  local ep="$1"
  local resp http_code body
  resp=$(curl -sS -w "\n%{http_code}" \
    -H "Authorization: Bearer $WOODPECKER_TOKEN" \
    "$ep")
  http_code=$(echo "$resp" | tail -n1)
  body=$(echo "$resp" | sed '$d')
  if [[ "$http_code" != "200" ]]; then
    echo "Error: HTTP $http_code from $ep" >&2
    return 1
  fi
  echo "$body"
}

if [[ -z "$NUMBER" ]]; then
  # Get latest pipeline number from list, then fetch full detail
  list_body=$(_wp_fetch "${WOODPECKER_URL}/api/repos/${REPO_ID}/pipelines?perPage=1") || exit 1
  NUMBER=$(echo "$list_body" | jq -r '.[0].number // empty')
  if [[ -z "$NUMBER" ]]; then
    echo "Error: No pipelines found" >&2
    exit 1
  fi
fi

# Always fetch the single-pipeline endpoint (includes workflows/steps)
body=$(_wp_fetch "${WOODPECKER_URL}/api/repos/${REPO_ID}/pipelines/${NUMBER}") || exit 1

if [[ "$FORMAT" == "json" ]]; then
  echo "$body" | jq '.'
  exit 0
fi

echo "Pipeline Status"
echo "==============="
echo "$body" | jq -r '
  def ts: if . and . > 0 then todate else "—" end;
  "  Number:    \(.number)\n" +
  "  Status:    \(.status)\n" +
  "  Branch:    \(.branch)\n" +
  "  Event:     \(.event)\n" +
  "  Commit:    \(.commit[:12])\n" +
  "  Message:   \(.message | split("\n")[0])\n" +
  "  Author:    \(.author)\n" +
  "  Started:   \(.started | ts)\n" +
  "  Finished:  \(.finished | ts)"
'

# Show step-level details if workflows exist
has_workflows=$(echo "$body" | jq 'has("workflows") and (.workflows | length > 0)')
if [[ "$has_workflows" == "true" ]]; then
  echo ""
  echo "Steps"
  echo "-----"
  echo "$body" | jq -r '
    .workflows[] | .children[]? |
    select(.type != "clone") |
    "  " +
    (if .state == "success" then "OK"
     elif .state == "failure" then "FAIL"
     elif .state == "running" then "RUN"
     elif .state == "skipped" then "SKIP"
     elif .state == "pending" then "WAIT"
     else .state end) +
    "  " + .name +
    (if .error and .error != "" then "  (" + .error + ")" else "" end) +
    (if .exit_code and .exit_code != 0 then "  [exit " + (.exit_code | tostring) + "]" else "" end)
  '
fi
