#!/usr/bin/env bash
# setup-broker.sh — genera cert del broker cloud (firmato dalla C4rgo-CA) e i file
# passwd/acl. Da eseguire una volta sul cloud, in ./docker/mqtt/.
#
# PREREQUISITO: serve la chiave privata della C4rgo-CA (dalla tua infrastruttura di
# provisioning: la stessa CA che ha firmato i cert dei device). Mettila come ca.key
# accanto a ca.crt. Se non l'hai, in fondo trovi l'alternativa "CA nuova".
set -euo pipefail
cd "$(dirname "$0")"
mkdir -p certs
cd certs

CN="my.c4rgo.cloud"      # deve combaciare con l'address nel bridge dei device

if [[ ! -f ca.crt || ! -f ca.key ]]; then
  echo "!! Mancano ca.crt/ca.key (C4rgo-CA). Copiali qui dall'infrastruttura di provisioning."
  echo "   ca.crt lo trovi gia' sui device in /opt/.c4rgo/etc/certs/ca.crt (ma serve anche ca.key)."
  exit 1
fi

# Cert del broker firmato dalla C4rgo-CA, con SAN sul nome DNS pubblico.
openssl genrsa -out "${CN}.key" 2048
openssl req -new -key "${CN}.key" -out "${CN}.csr" -subj "/C=IT/ST=Lombardy/O=C4rgo/OU=IoT/CN=${CN}"
cat > "${CN}.ext" <<EOF
subjectAltName = DNS:${CN}
extendedKeyUsage = serverAuth
EOF
openssl x509 -req -in "${CN}.csr" -CA ca.crt -CAkey ca.key -CAcreateserial \
  -out "${CN}.crt" -days 3650 -sha256 -extfile "${CN}.ext"
rm -f "${CN}.csr" "${CN}.ext"
echo ">> Cert broker generato: certs/${CN}.crt"

# --- utenti / password -------------------------------------------------------
cd ..
: > passwd
# r_server = ruolo del server (script di test + worker), full access
R_SERVER_PASS="$(openssl rand -base64 18)"
mosquitto_passwd -b passwd r_server "$R_SERVER_PASS"
echo ">> Creato utente r_server. Metti QUESTA password in .env.local come"
echo "   SCANNER_MQTT_PASSWORD (non viene salvata altrove, se la perdi rigenera):"
echo "     r_server : $R_SERVER_PASS"
echo "   Per un device:   mosquitto_passwd -b passwd kiosk_36b94b28 <password>"

# --- ACL ---------------------------------------------------------------------
# L'ACL e' versionata nel repo (non e' un segreto): qui non la si sovrascrive.
if [[ ! -f acl ]]; then
  echo "!! ./acl mancante: dovrebbe essere versionato nel repo. Ripristinalo da git."
  exit 1
fi
echo ">> passwd generato; acl gia' presente (versionata nel repo)."
echo "   Aggiungi un utente per ogni device con username == device_id."

# --- ALTERNATIVA se NON hai la chiave della C4rgo-CA -------------------------
# Genera una CA nuova per il canale cloud e distribuisci il suo ca.crt ai device
# (come bridge_cafile). NON riusare allora /opt/.c4rgo/etc/certs/ca.crt sul device.
#   openssl genrsa -out ca.key 4096
#   openssl req -x509 -new -key ca.key -sha256 -days 3650 -out ca.crt \
#     -subj "/C=IT/ST=Lombardy/O=C4rgo/OU=IoT-Cloud/CN=C4rgo-Cloud-CA"
