#!/usr/bin/env bash
#
# Construit un paquet Flatpak de Pena à partir du .deb généré par Tauri.
#
# Étapes :
#   1. `cargo tauri build --bundles deb`  -> produit le .deb autonome
#   2. Copie du .deb à côté du manifeste sous le nom `pena.deb`
#   3. `flatpak-builder` construit le bundle dans la sandbox GNOME
#   4. Installation locale (--user) ET export du fichier pena.flatpak
#
# Le fichier `pena.flatpak` est TOUJOURS exporté à côté du script.
#
# Usage :
#   ./build-flatpak.sh              # build + installation (--user) + pena.flatpak
#   ./build-flatpak.sh --no-install # build + pena.flatpak seul (pas d'installation)
#   ./build-flatpak.sh --no-deb     # réutilise le .deb déjà présent (build rapide)
#
set -euo pipefail

APP_ID="com.pena.app"
RUNTIME_VERSION="48"
RUST_CONTAINER="ubuntu-rust"   # distrobox contenant cargo-tauri + libs GTK/WebKit

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_DIR="$(dirname "$SCRIPT_DIR")"          # .../Pena-tauri
MANIFEST="$SCRIPT_DIR/${APP_ID}.yml"
BUILD_DIR="$SCRIPT_DIR/.build"                  # arbre de build flatpak-builder
REPO_DIR="$SCRIPT_DIR/.repo"                    # dépôt ostree temporaire
DEB_TARGET="$SCRIPT_DIR/pena.deb"
TAURI_CONF="$PROJECT_DIR/src-tauri/tauri.conf.json"
METAINFO="$SCRIPT_DIR/${APP_ID}.metainfo.xml"

DO_INSTALL=1
BUILD_DEB=1
for arg in "$@"; do
  case "$arg" in
    --no-install|--bundle) DO_INSTALL=0 ;;   # --bundle : alias rétrocompatible
    --no-deb) BUILD_DEB=0 ;;
    -h|--help) sed -n '2,17p' "$0"; exit 0 ;;
    *) echo "Argument inconnu : $arg" >&2; exit 1 ;;
  esac
done

# --- Vérification des outils -------------------------------------------------
need() { command -v "$1" >/dev/null 2>&1 || { echo "Outil manquant : $1" >&2; exit 1; }; }
need flatpak

# flatpak-builder : commande native, sinon le Flatpak org.flatpak.Builder
# (cas des distributions atomiques type Bazzite/Silverblue).
if command -v flatpak-builder >/dev/null 2>&1; then
  FLATPAK_BUILDER=(flatpak-builder)
elif flatpak info org.flatpak.Builder >/dev/null 2>&1; then
  FLATPAK_BUILDER=(flatpak run org.flatpak.Builder)
else
  echo "flatpak-builder est requis. Installez-le :" >&2
  echo "  flatpak install -y flathub org.flatpak.Builder" >&2
  echo "  ou sur Fedora classique :  sudo dnf install flatpak-builder" >&2
  exit 1
fi

# --- Remote flathub (scope --user) -------------------------------------------
# flatpak-builder est lancé en --user et installe les dépendances (runtime/SDK
# via --install-deps-from=flathub) dans cette même installation. Le remote
# flathub doit donc exister au niveau --user, ce qui n'est pas le cas par
# défaut sur les distributions atomiques (où flathub est un remote système).
echo ">> Vérification du remote flathub (--user)…"
flatpak remote-add --if-not-exists --user flathub \
  https://flathub.org/repo/flathub.flatpakrepo

# --- 0. Version : source de vérité = tauri.conf.json -------------------------
# On lit la version applicative depuis tauri.conf.json et on la répercute dans
# le metainfo AppStream (release) afin que le Flatpak porte toujours la
# dernière version déclarée dans les sources.
need jq
VERSION="$(jq -r '.version' "$TAURI_CONF")"
if [[ -z "$VERSION" || "$VERSION" == "null" ]]; then
  echo "Impossible de lire la version dans $TAURI_CONF" >&2
  exit 1
fi
TODAY="$(date -u +%Y-%m-%d)"
echo ">> Version applicative : $VERSION (build du $TODAY)"

# Met à jour (ou insère) l'entrée <release> du metainfo pour cette version.
if grep -q "version=\"$VERSION\"" "$METAINFO"; then
  echo ">> Release $VERSION déjà présente dans le metainfo."
else
  echo ">> Ajout de la release $VERSION au metainfo…"
  sed -i \
    "s#<releases>#<releases>\n    <release version=\"$VERSION\" date=\"$TODAY\"/>#" \
    "$METAINFO"
fi

# --- 1. Build du .deb via Tauri ---------------------------------------------
if [[ "$BUILD_DEB" -eq 1 ]]; then
  # La compilation Tauri exige les libs de dev GTK/WebKit, absentes de l'hôte
  # (distribution atomique). On build donc dans le distrobox `$RUST_CONTAINER`,
  # qui embarque cargo-tauri et ces libs. flatpak-builder reste sur l'hôte.
  need distrobox
  echo ">> Build du paquet .deb dans le distrobox $RUST_CONTAINER…"
  distrobox enter "$RUST_CONTAINER" -- \
    bash -lc "cd '$PROJECT_DIR' && cargo tauri build --bundles deb"
fi

DEB_SRC="$(find "$PROJECT_DIR/src-tauri/target/release/bundle/deb" -name '*.deb' 2>/dev/null | sort | tail -n1 || true)"
if [[ -z "$DEB_SRC" ]]; then
  echo "Aucun .deb trouvé. Lancez le script sans --no-deb." >&2
  exit 1
fi
echo ">> Utilisation du .deb : $DEB_SRC"
cp -f "$DEB_SRC" "$DEB_TARGET"

# Icône installée dans le Flatpak (128x128) depuis les sources du projet.
cp -f "$PROJECT_DIR/src-tauri/icons/128x128.png" "$SCRIPT_DIR/icon.png"

# --- 2. Build Flatpak --------------------------------------------------------
# Construit l'app dans un dépôt OSTree local ($REPO_DIR) ; les dépendances
# manquantes (runtime/SDK) sont récupérées depuis flathub.
echo ">> Construction du Flatpak…"
rm -rf "$BUILD_DIR"
FB_ARGS=(--force-clean --user --install-deps-from=flathub --repo="$REPO_DIR")
if [[ "$DO_INSTALL" -eq 1 ]]; then
  FB_ARGS+=(--install)
fi
"${FLATPAK_BUILDER[@]}" "${FB_ARGS[@]}" "$BUILD_DIR" "$MANIFEST"

# --- 3. Export du fichier .flatpak (toujours) --------------------------------
# Le bundle autonome est systématiquement exporté à côté du manifeste.
OUT="$SCRIPT_DIR/pena.flatpak"
echo ">> Export du bundle : $OUT"
flatpak build-bundle "$REPO_DIR" "$OUT" "$APP_ID" \
  --runtime-repo=https://flathub.org/repo/flathub.flatpakrepo

echo ">> Nettoyage du dépôt OSTree temporaire…"
rm -rf "$REPO_DIR"

if [[ "$DO_INSTALL" -eq 1 ]]; then
  echo ">> Pena $VERSION installé (--user) et bundle exporté : $OUT"
  echo ">> Lancer avec :  flatpak run $APP_ID"
else
  echo ">> Bundle exporté : $OUT"
  echo ">> Installer avec :  flatpak install --user $OUT"
fi

echo ">> Terminé."
