#!/usr/bin/env bash
# Sprint 16: генерация бейджей покрытия / статуса в badges/*.svg.
#
# Запускается вручную или из CI после `dotnet test --collect:"XPlat Code Coverage"`.
# Вход: путь к cobertura.xml (или авто-поиск в TestResults/).
# Выход: badges/coverage.svg + ссылка для добавления в README.
#
# Без зависимостей кроме curl, python3, sed.
set -euo pipefail
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
BADGES_DIR="$ROOT/badges"
mkdir -p "$BADGES_DIR"
# 1. Coverage badge
CXML="${1:-}"
if [[ -z "$CXML" ]]; then
CXML="$(find "$ROOT" -name 'coverage.cobertura.xml' -path '*/TestResults/*' 2>/dev/null | head -1)"
fi
if [[ -z "$CXML" || ! -f "$CXML" ]]; then
echo "Usage: $0 [path/to/coverage.cobertura.xml]" >&2
echo "Run 'dotnet test --collect:XPlat Code Coverage' first." >&2
exit 1
fi
PCT=$(python3 -c "
import xml.etree.ElementTree as ET
r = ET.parse('$CXML').getroot()
# Считаем суммарное покрытие по Application + Domain (главные пакеты).
covered, valid = 0, 0
for pkg in r.iter('package'):
if pkg.get('name') in ('foodmarket.Application', 'foodmarket.Domain'):
for line in pkg.iter('line'):
valid += 1
if int(line.get('hits', '0')) > 0:
covered += 1
print(f'{100*covered/valid:.0f}' if valid else '0')
")
# Цвет по порогам — shields.io стандарт.
COLOR="brightgreen"
if (( PCT < 50 )); then COLOR="red"
elif (( PCT < 70 )); then COLOR="yellow"
elif (( PCT < 85 )); then COLOR="green"
fi
# Скачиваем static SVG от shields.io (legacy endpoint без рантайма).
URL="https://img.shields.io/badge/coverage-${PCT}%25-${COLOR}?style=flat-square&label=coverage%20(app%2Bdomain)"
echo "[badges] coverage = ${PCT}% → ${COLOR}"
echo "[badges] fetching $URL"
if curl -fsS "$URL" -o "$BADGES_DIR/coverage.svg"; then
echo "[badges] wrote $BADGES_DIR/coverage.svg ($(wc -c < "$BADGES_DIR/coverage.svg") bytes)"
else
# Offline-fallback: SVG inline.
cat > "$BADGES_DIR/coverage.svg" <
SVG
echo "[badges] offline fallback SVG written"
fi
# 2. Build/CI status — static shields. Реальный badge берёт SVG c
# Forgejo `actions/workflows/ci.yml/badge.svg` (auto-обновляется).
# Тут просто проверяем, что mirror.svg есть в repo для случая offline-read.
cat > "$BADGES_DIR/ci-status-link.md" <