#!/usr/bin/env bash
# SMWForge APT-Repository einrichten (Debian, Ubuntu, ViseOS und Ableger).
#
#   Öffentliches Repository:
#     curl -fsSL https://repo.smwforge.global/setup.sh | sudo bash
#
#   Firmen-Repository (Zugangsschlüssel von SMWForge):
#     curl -fsSL https://repo.smwforge.global/setup.sh | sudo bash -s -- --company <firma> --key <schlüssel>
#     (ohne --key fragt das Skript nach dem Schlüssel; alternativ SMW_REPO_KEY=… setzen)
#
#   Wieder entfernen:  … | sudo bash -s -- --remove [--company <firma>]
set -euo pipefail

HOST="${SMW_REPO_HOST:-repo.smwforge.global}"
BASE="https://${HOST}"
KEYRING="/etc/apt/keyrings/smwforge.gpg"
COMPANY=""
KEY="${SMW_REPO_KEY:-}"
REMOVE=0

die() { echo "FEHLER: $*" >&2; exit 1; }

while [ $# -gt 0 ]; do
    case "$1" in
        --company) COMPANY="${2:-}"; shift 2 ;;
        --key)     KEY="${2:-}"; shift 2 ;;
        --remove)  REMOVE=1; shift ;;
        -h|--help) echo "Aufruf siehe Kopf dieses Skripts oder https://${HOST}/"; exit 0 ;;
        *) die "Unbekannte Option: $1" ;;
    esac
done

[ "$(id -u)" -eq 0 ] || die "Bitte als root ausführen (sudo)."
command -v apt-get >/dev/null || die "Dieses Skript braucht ein Debian-basiertes System (apt)."

if [ -n "$COMPANY" ]; then
    [[ "$COMPANY" =~ ^[a-z0-9][a-z0-9-]{1,39}$ ]] || die "Ungültiger Firmenname: $COMPANY"
    SOURCES="/etc/apt/sources.list.d/smwforge-${COMPANY}.sources"
    AUTH="/etc/apt/auth.conf.d/smwforge-${COMPANY}.conf"
    URI="${BASE}/firma/${COMPANY}/"
else
    SOURCES="/etc/apt/sources.list.d/smwforge.sources"
    AUTH=""
    URI="${BASE}/"
fi

if [ "$REMOVE" -eq 1 ]; then
    rm -f "$SOURCES"
    [ -n "$AUTH" ] && rm -f "$AUTH"
    if ! ls /etc/apt/sources.list.d/smwforge*.sources >/dev/null 2>&1; then
        rm -f "$KEYRING"
    fi
    apt-get update -qq || true
    echo "SMWForge-Repository entfernt."
    exit 0
fi

command -v curl >/dev/null || { apt-get update -qq && apt-get install -y curl ca-certificates; }

if [ -n "$COMPANY" ] && [ -z "$KEY" ]; then
    [ -r /dev/tty ] || die "Kein Schlüssel angegeben (--key oder SMW_REPO_KEY)."
    read -rsp "Zugangsschlüssel für ${COMPANY}: " KEY < /dev/tty
    echo
fi

install -d -m 755 /etc/apt/keyrings
tmp="$(mktemp)"
trap 'rm -f "$tmp"' EXIT
curl -fsSL "${BASE}/smwforge-repo.gpg" -o "$tmp" || die "Signaturschlüssel nicht abrufbar (${BASE})."
install -m 644 "$tmp" "$KEYRING"

if [ -n "$COMPANY" ]; then
    [ -n "$KEY" ] || die "Leerer Schlüssel."
    # Zugangsdaten per stdin an curl, damit sie nicht in der Prozessliste stehen
    code="$(printf 'user = "%s:%s"\n' "$COMPANY" "$KEY" |
        curl -sS -o /dev/null -w '%{http_code}' -K - "${URI}dists/stable/InRelease" || true)"
    case "$code" in
        200) ;;
        401|403) die "Zugang verweigert – Firmenname oder Schlüssel falsch." ;;
        *) die "Firmen-Repository nicht erreichbar (HTTP ${code})." ;;
    esac
    install -d -m 755 /etc/apt/auth.conf.d
    ( umask 077; printf 'machine %s/firma/%s/ login %s password %s\n' "$HOST" "$COMPANY" "$COMPANY" "$KEY" > "$AUTH" )
    chmod 600 "$AUTH"
fi

cat > "$SOURCES" <<EOF
Types: deb
URIs: ${URI}
Suites: stable
Components: main
Signed-By: ${KEYRING}
EOF

apt-get update || echo "Hinweis: apt-get update meldete Fehler (ggf. andere Quellen)." >&2

echo
if [ -n "$COMPANY" ]; then
    echo "Firmen-Repository '${COMPANY}' eingerichtet. Paketliste: https://${HOST}/firma/${COMPANY}/   Installieren: apt install <paket>"
else
    echo "SMWForge-Repository eingerichtet. Paketliste: https://${HOST}/   Installieren: apt install <paket>"
fi
