#!/usr/bin/env bash
# Установить firmware b43 для BCM4322 на Fedora (offline).
# Запуск на Fedora MacBook (root):
#   tar xzf fedora-bcm4322-wifi-fix.tar.gz
#   cd fedora-bcm4322-wifi-fix
#   sudo bash install-bcm4322-firmware-fedora.sh
set -euo pipefail

die() { printf 'error: %s\n' "$*" >&2; exit 1; }

if [ "$(id -u)" -ne 0 ]; then
  die "запустите с sudo"
fi

ROOT="$(cd "$(dirname "$0")" && pwd)"
SRC="${1:-$ROOT/bundle/bcm4322-offline-bundle}"

[ -d "$SRC/b43" ] || die "нет каталога $SRC/b43"
[ -f "$SRC/b43/ucode16_mimo.fw" ] || die "нет $SRC/b43/ucode16_mimo.fw (BCM4322)"

DEST="/lib/firmware/b43"
BACKUP="/var/lib/bcm4322-firmware-backup-$(date +%Y%m%d-%H%M%S)"

mkdir -p "$DEST" "$BACKUP"
if [ -d "$DEST" ] && [ "$(ls -A "$DEST" 2>/dev/null | wc -l)" -gt 0 ]; then
  cp -a "$DEST/." "$BACKUP/" 2>/dev/null || true
  printf 'Резервная копия старых файлов: %s\n' "$BACKUP"
fi

cp -a "$SRC/b43/." "$DEST/"
chmod 644 "$DEST"/*.fw 2>/dev/null || true
restorecon -Rv /lib/firmware/b43 >/dev/null 2>&1 || true

COUNT="$(find "$DEST" -maxdepth 1 -name '*.fw' | wc -l | tr -d ' ')"
printf 'Установлено %s файлов в %s\n' "$COUNT" "$DEST"
printf 'Ключевой файл: %s (%s bytes)\n' "$DEST/ucode16_mimo.fw" "$(stat -c%s "$DEST/ucode16_mimo.fw" 2>/dev/null || stat -f%z "$DEST/ucode16_mimo.fw")"

printf 'Перезагрузка модуля b43 …\n'
modprobe -r b43 2>/dev/null || true
sleep 1
modprobe b43

sleep 2
if dmesg | tail -50 | grep -qi 'firmware file.*not found'; then
  die "ядро всё ещё не видит firmware — проверьте: sudo dmesg | grep -i b43"
fi

if command -v nmcli >/dev/null 2>&1; then
  nmcli device status || true
  WIFI_DEV="$(nmcli -t -f DEVICE,TYPE device | awk -F: '$2=="wifi"{print $1; exit}')"
  if [ -n "${WIFI_DEV:-}" ]; then
    printf 'Wi-Fi интерфейс появился: %s\n' "$WIFI_DEV"
    nmcli radio wifi on 2>/dev/null || true
    nmcli device wifi list 2>/dev/null | head -10 || true
  else
    printf 'Wi-Fi интерфейс пока не виден — нужна перезагрузка.\n'
  fi
fi

printf '\nГотово. Дальше:\n'
printf '  sudo reboot\n'
printf '  nmcli device wifi list\n'
printf '  nmcli device wifi connect "SSID" password "пароль"\n'
