#!/usr/bin/env bash
# Holt im Shop-Admin angeforderte Knoten-Aufträge ab und führt sie aus.
#
#   verbund-agent.sh einmal     # einen Durchlauf (für den systemd-Timer)
#   verbund-agent.sh schleife   # alle zwei Minuten, für die Hand
#
# Warum dieser Umweg statt eines Knopfes, der direkt Hetzner anruft:
# Der Shop ist aus dem Internet erreichbar. Läge dort ein Hetzner-Token mit
# Schreibrechten, könnte jeder, der in den Admin kommt, Server anlegen UND
# löschen. Token und SSH-Schlüssel bleiben deshalb hier auf dem
# Verwaltungsserver. Der Admin vermerkt nur einen Wunsch; abgeholt und
# ausgeführt wird er von hier.
#
# Der Shop wird über die Admin-API gefragt – dieselben Zugangsdaten, die
# dev/demo-data/apilib.php nutzt.
set -uo pipefail

cd "$(dirname "$0")"
BEFEHL="${1:-einmal}"
CREDS=/root/.shopware-dev/credentials
BASIS="${RZ_SHOP_API:-https://dev.riccardozigarette.com/api}"

token() {
    local id secret
    id=$(sed -n 's/^SWAPI_ID=//p' "$CREDS")
    secret=$(sed -n 's/^SWAPI_SECRET=//p' "$CREDS")
    [ -n "$id" ] && [ -n "$secret" ] || { echo "Keine API-Zugangsdaten in $CREDS" >&2; return 1; }
    curl -sS -X POST "$BASIS/oauth/token" -H 'Content-Type: application/json' \
         -d "{\"grant_type\":\"client_credentials\",\"client_id\":\"$id\",\"client_secret\":\"$secret\"}" \
      | python3 -c 'import json,sys; print(json.load(sys.stdin).get("access_token",""))'
}

shop() {   # shop METHODE PFAD [JSON]
    local m="$1" p="$2" body="${3:-}"
    if [ -n "$body" ]; then
        curl -sS -X "$m" -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' -d "$body" "$BASIS$p"
    else
        curl -sS -X "$m" -H "Authorization: Bearer $TOKEN" "$BASIS$p"
    fi
}

# Zustand und Protokoll eines Auftrags fortschreiben. Der Shop nimmt nur die
# vier bekannten Zustaende an und laesst einen fertigen Auftrag nicht wieder
# aufmachen - der Agent kann also nichts durcheinanderbringen, auch wenn er
# zweimal laeuft.
melde() {   # melde <id> <zustand> <text>
    local id="$1" zustand="$2" text="$3"
    python3 - "$id" "$zustand" "$text" <<'PY' > /tmp/rz-verbund-melde.json
import json, sys
print(json.dumps({"zustand": sys.argv[2], "protokoll": sys.argv[3]}))
PY
    shop PATCH "/_action/riccardo-verbund/auftrag/$id" "$(cat /tmp/rz-verbund-melde.json)" >/dev/null 2>&1 || true
    rm -f /tmp/rz-verbund-melde.json
}

durchlauf() {
    TOKEN="$(token)" || return 1
    [ -n "$TOKEN" ] || { echo "Keine Anmeldung am Shop." >&2; return 1; }

    local lage id
    lage=$(shop GET "/_action/riccardo-verbund/lage") || return 1
    id=$(printf '%s' "$lage" | python3 -c '
import json, sys
a = json.load(sys.stdin).get("offenerAuftrag") or {}
print(a.get("id", "") if a.get("zustand") == "angefordert" else "")
')
    [ -n "$id" ] || { [ "$BEFEHL" = schleife ] || echo "Nichts zu tun."; return 0; }

    echo "Auftrag $id gefunden – Knoten wird aufgenommen."
    melde "$id" laeuft "Gestartet $(date '+%F %T')"

    local protokoll
    protokoll=$(./frontend-aufnehmen.sh anlegen --ja 2>&1)
    local rc=$?

    printf '%s\n' "$protokoll" | tail -30
    if [ $rc = 0 ]; then
        melde "$id" fertig "$protokoll"
        echo "Fertig."
    else
        melde "$id" gescheitert "$protokoll"
        echo "Gescheitert – siehe Protokoll im Admin."
    fi
    return $rc
}

case "$BEFEHL" in
    einmal)   durchlauf ;;
    schleife) while :; do durchlauf; sleep 120; done ;;
    *) echo "Aufruf: $0 einmal | schleife"; exit 1 ;;
esac
