#!/usr/bin/env bash
# ===========================================================================
#  Richtet den Raspberry Pi als WLAN-Access-Point ein (NetworkManager/nmcli).
#
#  Aufruf:  sudo ./setup-ap.sh [/etc/tvwall/tvwall.conf]
#
#  Der Name des WLANs kommt aus AP_SSID in der Konfigurationsdatei - so
#  bekommt jeder Pi seinen eigenen, unterscheidbaren Netznamen.
# ===========================================================================
set -euo pipefail

CONF="${1:-/etc/tvwall/tvwall.conf}"
CON_NAME="tvwall-ap"

info() { printf '\033[1;36m==>\033[0m %s\n' "$*"; }
ok()   { printf '\033[1;32m  ✓\033[0m %s\n' "$*"; }
warn() { printf '\033[1;33m  !\033[0m %s\n' "$*"; }
die()  { printf '\033[1;31mFehler:\033[0m %s\n' "$*" >&2; exit 1; }

[[ $EUID -eq 0 ]] || die "bitte mit sudo starten:  sudo $0"
[[ -f "$CONF" ]]  || die "Konfigurationsdatei nicht gefunden: $CONF"

set -a
# shellcheck disable=SC1090
. "$CONF"
set +a

AP_SSID="${AP_SSID:-TVWall-01}"
AP_PASSWORD="${AP_PASSWORD:-tvwall1234}"
AP_COUNTRY="${AP_COUNTRY:-DE}"
AP_IP="${AP_IP:-192.168.4.1}"
AP_CHANNEL="${AP_CHANNEL:-7}"
CAPTIVE_PORTAL="${CAPTIVE_PORTAL:-no}"
HOSTNAME_NEW="${HOSTNAME:-tvwall}"

[[ ${#AP_PASSWORD} -ge 8 ]] || die "AP_PASSWORD muss mindestens 8 Zeichen haben"

command -v nmcli >/dev/null || die "nmcli fehlt. Bitte NetworkManager installieren:
       sudo apt install network-manager && sudo systemctl enable --now NetworkManager"

systemctl is-active --quiet NetworkManager || systemctl start NetworkManager

# --- WLAN-Schnittstelle finden --------------------------------------------
IFACE="${AP_IFACE:-}"
if [[ -z "$IFACE" ]]; then
  IFACE="$(nmcli -t -f DEVICE,TYPE device status | awk -F: '$2=="wifi"{print $1; exit}')"
fi
[[ -n "$IFACE" ]] || die "keine WLAN-Schnittstelle gefunden"
info "WLAN-Schnittstelle: $IFACE"

# --- Funk freischalten und Land setzen ------------------------------------
command -v rfkill >/dev/null && rfkill unblock wifi || true
if command -v raspi-config >/dev/null; then
  raspi-config nonint do_wifi_country "$AP_COUNTRY" >/dev/null 2>&1 || true
fi
command -v iw >/dev/null && iw reg set "$AP_COUNTRY" >/dev/null 2>&1 || true
nmcli radio wifi on >/dev/null 2>&1 || true
ok "Funk aktiv, Land: $AP_COUNTRY"

# --- Verbindung anlegen ----------------------------------------------------
info "Richte Access Point '$AP_SSID' ein"
nmcli connection delete "$CON_NAME" >/dev/null 2>&1 || true

nmcli connection add \
  type wifi \
  ifname "$IFACE" \
  con-name "$CON_NAME" \
  autoconnect yes \
  ssid "$AP_SSID" >/dev/null

nmcli connection modify "$CON_NAME" \
  802-11-wireless.mode ap \
  802-11-wireless.band bg \
  802-11-wireless.channel "$AP_CHANNEL" \
  802-11-wireless.hidden no \
  wifi-sec.key-mgmt wpa-psk \
  wifi-sec.proto rsn \
  wifi-sec.pairwise ccmp \
  wifi-sec.group ccmp \
  wifi-sec.psk "$AP_PASSWORD" \
  ipv4.method shared \
  ipv4.addresses "$AP_IP/24" \
  ipv6.method disabled \
  connection.autoconnect yes \
  connection.autoconnect-priority 100

# --- Namensaufloesung im eigenen Netz -------------------------------------
# NetworkManager startet im Modus "shared" ein eigenes dnsmasq. Damit ist der
# Pi auch unter einem einfachen Namen statt nur ueber die IP erreichbar.
install -d -m 0755 /etc/NetworkManager/dnsmasq-shared.d
{
  echo "# von TV-Wall setup-ap.sh erzeugt"
  echo "address=/tvwall/$AP_IP"
  echo "address=/$HOSTNAME_NEW/$AP_IP"
  echo "address=/$HOSTNAME_NEW.local/$AP_IP"
  if [[ "$CAPTIVE_PORTAL" == "yes" ]]; then
    # Alle Namen zeigen auf den Pi - Handys oeffnen die Seite dann von selbst.
    echo "address=/#/$AP_IP"
  fi
} > /etc/NetworkManager/dnsmasq-shared.d/tvwall.conf
ok "Namensaufloesung eingerichtet (http://tvwall)"

# --- Starten ---------------------------------------------------------------
info "Aktiviere Access Point"
if ! nmcli connection up "$CON_NAME" >/dev/null 2>&1; then
  warn "Access Point liess sich nicht sofort starten. Details:"
  nmcli connection up "$CON_NAME" || true
  warn "Haeufigste Ursache: das WLAN ist noch mit einem anderen Netz verbunden."
  warn "Andere WLAN-Verbindungen abschalten:  nmcli connection show"
fi

sleep 2
if nmcli -t -f NAME connection show --active | grep -qx "$CON_NAME"; then
  ok "Access Point '$AP_SSID' laeuft auf $IFACE ($AP_IP)"
else
  warn "Access Point ist noch nicht aktiv - nach einem Neustart versucht NetworkManager es erneut"
fi

cat <<EOF

   WLAN-Name  : $AP_SSID
   Passwort   : $AP_PASSWORD
   Adresse    : http://$AP_IP   (oder http://tvwall)

   Namen aendern: AP_SSID in $CONF anpassen und dieses Skript erneut ausfuehren.
EOF
