#!/bin/bash

set -uo pipefail

ok()   { echo -e "✅ $1"; }
info() { echo -e "ℹ️ $1"; }
warn() { echo -e "⚠️ $1"; }
err()  { echo -e "❌ $1"; }



echo ""
echo "──────────────────────────────────────────────────────────"

# Wenn kein Container angegeben → automatisch suchen
if [[ $# -eq 0 ]]; then


    info "Kein fail2ban Container angegeben, versuche Autodetect"

    CONTAINER=$(docker ps --format '{{.Names}}' | grep -i fail2ban | head -n1)
    
    if [[ -z "$CONTAINER" ]]; then
        err "Kein Fail2Ban Container gefunden"
        echo "──────────────────────────────────────────────────────────"
        exit 1
    else
        info "Container gefunden"

    fi
else
    CONTAINER="$1"

    # Existiert der Container überhaupt?
    if ! docker ps -a --format '{{.Names}}' | grep -Fxq "$CONTAINER"; then
        err "Container '$CONTAINER' existiert nicht"
        echo "──────────────────────────────────────────────────────────"
        exit 1
    fi

    # Läuft der Container?
    if ! docker ps --format '{{.Names}}' | grep -Fxq "$CONTAINER"; then
        err "Container '$CONTAINER' läuft nicht"
        echo "──────────────────────────────────────────────────────────"
        exit 1
    fi
fi


info "Verwende Container: $CONTAINER"
echo "──────────────────────────────────────────────────────────"
echo ""

JAILS=$(docker exec "$CONTAINER" fail2ban-client status \
    | awk -F: '/Jail list/ {print $2}' | xargs)

IFS=',' read -ra JAIL_ARRAY <<< "$JAILS"

for JAIL in "${JAIL_ARRAY[@]}"; do
    JAIL=$(echo "$JAIL" | xargs)

    IPS=$(docker exec "$CONTAINER" fail2ban-client status "$JAIL" \
        | awk -F: '/Banned IP list/ {print $2}' | xargs)

    if [[ -z "$IPS" ]]; then
        ok "$JAIL → keine Bans"
        continue
    fi

    info "🔓 $JAIL → entbanne: $IPS"

    COUNT=0
    FAILED=0

    for IP in $IPS; do
        if docker exec "$CONTAINER" fail2ban-client set "$JAIL" unbanip "$IP" >/dev/null 2>&1; then
            ((COUNT++))
        else
            ((FAILED++))
            warn "$JAIL → konnte $IP nicht entbannen"
        fi
    done

    REMAINING=$(docker exec "$CONTAINER" fail2ban-client status "$JAIL" \
        | awk '/Currently banned/ {print $4}')

    if [[ "$REMAINING" == "0" ]]; then
        ok "$JAIL → $COUNT IP(s) entfernt"
    else
        err "$JAIL → $REMAINING IP(s) noch gebannt"
    fi
done

echo ""
echo "──────────────────────────────────────────────────────────"
ok "Fertig."
echo "──────────────────────────────────────────────────────────"