#!/bin/bash
# Wystawia hotspot konfiguracyjny przy starcie urządzenia, niezależnie od
# aplikacji Java. Dzięki temu sieć Nivato-XXXXXX jest dostępna w kilka sekund
# po starcie NetworkManagera, nawet gdyby aplikacja nie wstała poprawnie.
set -u

DEFAULTS="/etc/default/nivato-logger"
[ -f "$DEFAULTS" ] && . "$DEFAULTS"

IFACE="${NIVATO_WIFI_HOTSPOT_INTERFACE:-${NIVATO_WIFI_INTERFACE:-wlan0}}"
PASSWORD="${NIVATO_WIFI_HOTSPOT_PASSWORD:-nivato-setup}"
IP="${NIVATO_WIFI_HOTSPOT_IP:-192.168.1.254}"
AUTO_START="${NIVATO_WIFI_HOTSPOT_AUTO_START:-true}"
DATA_DIR="${NIVATO_DATA_DIR:-/opt/nivato-logger/data}"
MARKER="${NIVATO_WIFI_HOTSPOT_DISABLED_MARKER:-$DATA_DIR/hotspot-disabled}"
START_SCRIPT="/opt/nivato-logger/bin/wifi-hotspot-start"

log() { echo "[nivato-hotspot-boot] $*"; }

# Wspólna logika identyfikatora urządzenia (ten sam suffix co w UI/SSID).
# shellcheck source=/dev/null
. /opt/nivato-logger/bin/nivato-device-id.sh

# SSID jak w WifiService.getHotspotSsid(): "Nivato-" + suffix.
resolve_ssid() {
    printf 'Nivato-%s' "$(nivato_device_suffix)"
}

# Zawsze kończymy sukcesem — brak hotspotu na tym etapie nie może blokować
# startu reszty systemu (aplikacja Java ma własny watchdog jako siatkę bezpieczeństwa).
finish() { exit 0; }

[ "$AUTO_START" = "true" ] || { log "Autostart hotspotu wyłączony"; finish; }

# Setup zakończony (marker zapisywany przez aplikację po konfiguracji sieci).
if [ -f "$MARKER" ]; then
    log "Wykryto marker zakończonej konfiguracji — pomijam hotspot"
    finish
fi

if ! command -v nmcli >/dev/null 2>&1; then
    log "Brak nmcli — pomijam"
    finish
fi

# Urządzenie już skonfigurowane przez WiFi: istnieje zapisany profil klienta.
# Pozwalamy NetworkManagerowi połączyć się z siecią domową zamiast stawiać AP.
client_profiles=$(nmcli -t -f NAME,TYPE connection show 2>/dev/null \
    | grep ':802-11-wireless$' | cut -d: -f1 | grep -vx 'Hotspot' || true)
if [ -n "$client_profiles" ]; then
    log "Istnieje zapisany profil WiFi klienta — pomijam hotspot"
    finish
fi

# Czekamy aż interfejs WiFi pojawi się i przestanie być 'unmanaged'
# (sterownik brcmfmac potrafi wstać chwilę po NetworkManagerze).
state=""
for _ in $(seq 1 30); do
    state=$(nmcli -t -f DEVICE,STATE dev status 2>/dev/null \
        | grep "^${IFACE}:" | cut -d: -f2 || true)
    if [ -n "$state" ] && [ "$state" != "unmanaged" ] && [ "$state" != "unavailable" ]; then
        break
    fi
    sleep 1
done

if [ -z "$state" ] || [ "$state" = "unmanaged" ]; then
    log "Interfejs $IFACE niedostępny/unmanaged — zostawiam to aplikacji"
    finish
fi

# Jeśli interfejs zdążył się połączyć jako klient — nie ruszamy go.
if [ "$state" = "connected" ]; then
    log "Interfejs $IFACE już połączony jako klient — pomijam hotspot"
    finish
fi

ssid=$(resolve_ssid)
log "Uruchamiam hotspot konfiguracyjny: $ssid (iface=$IFACE, ip=$IP)"
if [ -x "$START_SCRIPT" ]; then
    "$START_SCRIPT" "$IFACE" "$ssid" "$PASSWORD" "$IP" \
        && log "Hotspot aktywny: $ssid" \
        || log "Nie udało się postawić hotspotu — przejmie aplikacja"
else
    log "Brak $START_SCRIPT"
fi

finish
