#!/bin/bash
# ════════════════════════════════════════════════
#  ARIA — Release Script
#  Baut APK, taggt, erstellt Gitea Release
#  Verwendung: ./release.sh 1.2.0
#  Gitea-Kennwort wird interaktiv abgefragt.
# ════════════════════════════════════════════════

set -e

# ── Farben ────────────────────────────────────
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
CYAN='\033[0;36m'
NC='\033[0m'

# ── Parameter ─────────────────────────────────
VERSION=${1:?"Usage: ./release.sh <version>  (z.B. 1.2.0)"}
TAG="v$VERSION"

# ── Gitea-Konfiguration ──────────────────────
# Aus .env lesen falls vorhanden (GITEA_URL, GITEA_REPO, GITEA_USER)
if [ -f .env ]; then
    source .env
fi

GITEA_URL="${GITEA_URL:?"GITEA_URL nicht gesetzt (in .env oder als Umgebungsvariable)"}"
GITEA_REPO="${GITEA_REPO:?"GITEA_REPO nicht gesetzt (z.B. stefan/aria-agent)"}"
GITEA_USER="${GITEA_USER:-$(echo "$GITEA_REPO" | cut -d'/' -f1)}"

echo -e "${CYAN}╔═══════════════════════════════════════╗${NC}"
echo -e "${CYAN}║   ARIA Release — ${TAG}$(printf '%*s' $((19 - ${#TAG})) '')║${NC}"
echo -e "${CYAN}╚═══════════════════════════════════════╝${NC}"
echo ""

# ── Kennwort abfragen ─────────────────────────
echo -e "${YELLOW}Gitea-Login: ${GITEA_USER}${NC}"
read -s -p "Gitea-Kennwort: " GITEA_PASS
echo ""

# Credentials testen
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" \
    -u "${GITEA_USER}:${GITEA_PASS}" \
    "$GITEA_URL/api/v1/user")

if [ "$HTTP_CODE" != "200" ]; then
    echo -e "${RED}Login fehlgeschlagen (HTTP $HTTP_CODE). Kennwort korrekt?${NC}"
    exit 1
fi
echo -e "  ${GREEN}✓${NC} Login erfolgreich"
echo ""

# ── Versionsnummern aktualisieren ─────────────
echo -e "${GREEN}[1/5] Versionsnummern auf $VERSION setzen...${NC}"

# package.json
sed -i "s/\"version\": \"[^\"]*\"/\"version\": \"$VERSION\"/" android/package.json
echo -e "  ${GREEN}✓${NC} package.json → $VERSION"

# build.gradle: versionName + versionCode (aus Version berechnen)
# Unterstuetzt 3-stellig (1.2.3) und 4-stellig (0.0.1.7)
IFS='.' read -ra VER_PARTS <<< "$VERSION"
V1=${VER_PARTS[0]:-0}; V2=${VER_PARTS[1]:-0}; V3=${VER_PARTS[2]:-0}; V4=${VER_PARTS[3]:-0}
VERSION_CODE=$((V1 * 1000000 + V2 * 10000 + V3 * 100 + V4))
# Mindestens 1 (Android erfordert versionCode >= 1)
[ "$VERSION_CODE" -lt 1 ] && VERSION_CODE=1
sed -i "s/versionName \"[^\"]*\"/versionName \"$VERSION\"/" android/android/app/build.gradle
sed -i "s/versionCode [0-9]*/versionCode $VERSION_CODE/" android/android/app/build.gradle
echo -e "  ${GREEN}✓${NC} build.gradle → versionName $VERSION, versionCode $VERSION_CODE"

# SettingsScreen: Anzeige-Version (beliebiges Versionsformat)
sed -i "s/Version [0-9][0-9.]*[^<]*/Version $VERSION /" android/src/screens/SettingsScreen.tsx
echo -e "  ${GREEN}✓${NC} SettingsScreen → Version $VERSION"

echo ""

# ── APK bauen ─────────────────────────────────
echo -e "${GREEN}[2/5] APK bauen (Cache leeren + Build)...${NC}"
cd android
# Metro + Gradle Cache leeren damit neue Version sauber eingebettet wird
rm -rf node_modules/.cache 2>/dev/null
cd android && ./gradlew clean 2>/dev/null; cd ..
./build.sh release
cd ..

APK_PATH="android/ARIA-Cockpit-release.apk"
if [ ! -f "$APK_PATH" ]; then
    echo -e "${RED}APK nicht gefunden: $APK_PATH${NC}"
    echo -e "${RED}Build fehlgeschlagen.${NC}"
    exit 1
fi

APK_NAME="ARIA-${TAG}.apk"
APK_SIZE=$(du -h "$APK_PATH" | cut -f1)
echo -e "  ${GREEN}✓${NC} APK gebaut ($APK_SIZE)"
echo ""

# ── Git Tag ───────────────────────────────────
echo -e "${GREEN}[3/5] Git Tag $TAG...${NC}"

# Versions-Aenderungen committen
git add android/package.json android/android/app/build.gradle android/src/screens/SettingsScreen.tsx
git commit -m "release: bump version to $VERSION" 2>/dev/null || echo -e "  ${YELLOW}Keine Aenderungen zum Committen${NC}"

if git rev-parse "$TAG" &>/dev/null; then
    echo -e "  ${YELLOW}Tag $TAG existiert bereits — überspringe${NC}"
else
    git tag "$TAG"
    echo -e "  ${GREEN}✓${NC} Tag $TAG erstellt"
fi

git push origin main "$TAG"
echo -e "  ${GREEN}✓${NC} Tag gepusht"
echo ""

# ── Release Notes aus CHANGELOG.md lesen ──────
RELEASE_BODY="ARIA Android App $TAG"
CHANGELOG_FILE="$SCRIPT_DIR/CHANGELOG.md"

if [ -f "$CHANGELOG_FILE" ]; then
    # Abschnitt für diese Version extrahieren (zwischen ## [version] Zeilen)
    SECTION=$(sed -n "/^## \[$VERSION\]/,/^## \[/p" "$CHANGELOG_FILE" | head -n -1)
    if [ -n "$SECTION" ]; then
        RELEASE_BODY="$SECTION"
        echo -e "  ${GREEN}✓${NC} Release Notes aus CHANGELOG.md gelesen"
    else
        echo -e "  ${YELLOW}Kein Eintrag für [$VERSION] in CHANGELOG.md — verwende Standard-Text${NC}"
    fi
fi

# JSON-Escape: Newlines und Anführungszeichen escapen
RELEASE_BODY_ESCAPED=$(printf '%s' "$RELEASE_BODY" | python3 -c 'import sys,json; print(json.dumps(sys.stdin.read()))' 2>/dev/null || printf '"%s"' "$RELEASE_BODY" | sed 's/"/\\"/g')

# ── Gitea Release erstellen ───────────────────
echo -e "${GREEN}[4/5] Gitea Release erstellen...${NC}"

RELEASE_RESPONSE=$(curl -s -X POST \
    "$GITEA_URL/api/v1/repos/$GITEA_REPO/releases" \
    -u "${GITEA_USER}:${GITEA_PASS}" \
    -H "Content-Type: application/json" \
    -d "{
        \"tag_name\": \"$TAG\",
        \"name\": \"ARIA $TAG\",
        \"body\": $RELEASE_BODY_ESCAPED,
        \"draft\": false,
        \"prerelease\": false
    }")

RELEASE_ID=$(echo "$RELEASE_RESPONSE" | grep -o '"id":[0-9]*' | head -1 | cut -d: -f2)

if [ -z "$RELEASE_ID" ]; then
    echo -e "${RED}Release konnte nicht erstellt werden:${NC}"
    echo "$RELEASE_RESPONSE"
    exit 1
fi
echo -e "  ${GREEN}✓${NC} Release #$RELEASE_ID erstellt"
echo ""

# ── APK hochladen ─────────────────────────────
echo -e "${GREEN}[5/5] APK hochladen...${NC}"

UPLOAD_RESPONSE=$(curl -s -X POST \
    "$GITEA_URL/api/v1/repos/$GITEA_REPO/releases/$RELEASE_ID/assets?name=$APK_NAME" \
    -u "${GITEA_USER}:${GITEA_PASS}" \
    -F "attachment=@${APK_PATH};type=application/vnd.android.package-archive")

if echo "$UPLOAD_RESPONSE" | grep -q '"name"'; then
    echo -e "  ${GREEN}✓${NC} $APK_NAME hochgeladen"
else
    echo -e "${RED}Upload fehlgeschlagen:${NC}"
    echo "$UPLOAD_RESPONSE"
    exit 1
fi

# ── Auto-Update: APK auf RVS-Server kopieren ─
RVS_UPDATE_HOST="${RVS_UPDATE_HOST:-}"
if [ -n "$RVS_UPDATE_HOST" ]; then
    echo -e "${GREEN}[6/6] APK auf RVS-Server kopieren (Auto-Update)...${NC}"
    # Alte APKs auf dem RVS loeschen, dann neue hochladen
    ssh "$RVS_UPDATE_HOST" "rm -f ~/ARIA-AGENT/rvs/updates/ARIA-*.apk" 2>/dev/null
    scp "$APK_PATH" "${RVS_UPDATE_HOST}:~/ARIA-AGENT/rvs/updates/${APK_NAME}" 2>/dev/null
    if [ $? -eq 0 ]; then
        echo -e "  ${GREEN}✓${NC} APK auf RVS-Server kopiert (alte Versionen geloescht)"
    else
        echo -e "  ${YELLOW}APK konnte nicht auf RVS kopiert werden (RVS_UPDATE_HOST=$RVS_UPDATE_HOST)${NC}"
        echo -e "  ${YELLOW}Manuell: scp $APK_PATH $RVS_UPDATE_HOST:~/ARIA-AGENT/rvs/updates/${APK_NAME}${NC}"
    fi
else
    echo -e "${YELLOW}Auto-Update uebersprungen (RVS_UPDATE_HOST nicht gesetzt)${NC}"
    echo -e "${YELLOW}Setze RVS_UPDATE_HOST in .env fuer automatische Verteilung${NC}"
fi

# ── Fertig ────────────────────────────────────
echo ""
echo -e "${GREEN}╔═══════════════════════════════════════════════════╗${NC}"
echo -e "${GREEN}║   Release $TAG ist live!$(printf '%*s' $((27 - ${#TAG})) '')║${NC}"
echo -e "${GREEN}╠═══════════════════════════════════════════════════╣${NC}"
echo -e "${GREEN}║${NC}   $GITEA_URL/$GITEA_REPO/releases/tag/$TAG"
echo -e "${GREEN}║${NC}   APK: $APK_NAME ($APK_SIZE)"
echo -e "${GREEN}║${NC}   Auto-Update: ${RVS_UPDATE_HOST:-nicht konfiguriert}"
echo -e "${GREEN}╚═══════════════════════════════════════════════════╝${NC}"
