#!/bin/sh
# Lanceur Linux de l'Atelier Mise en Page.
# Il installe la page de l'application dans ~/AtelierMiseEnPage/app et l'ouvre dans une fenêtre d'application
# Chrome, Chromium, Edge ou Brave (sinon dans le navigateur par défaut). Le dossier n'est pas caché pour que les
# navigateurs installés en « snap » (Ubuntu) puissent l'ouvrir.
# Avec un lien atelier-maj:..., il recherche et installe une mise à jour : le bouton « Mise à jour » de l'application
# ouvre ce lien, que le bureau confie à ce script grâce au fichier .desktop qu'il enregistre à chaque lancement.
SCRIPT=$(readlink -f "$0" 2>/dev/null || printf '%s' "$0")
ICI=$(cd "$(dirname "$SCRIPT")" && pwd)
. "$ICI/config.sh"
ICI_COMMUN=$ICI
DONNEES=${ATELIER_DONNEES:-"$HOME/AtelierMiseEnPage"}
PAGE="$DONNEES/app/index.html"
PAQUET=linux
. "$ICI/commun.sh"
TITRE="Atelier Mise en Page"
APPLIS="${XDG_DATA_HOME:-$HOME/.local/share}/applications"

# Les messages passent par zenity (GNOME...) ou kdialog (KDE). Sans eux, le message s'affiche dans l'application.
message() { # $1 : texte ; $2 : info, warning ou error
  if silencieux; then journal "$1"; return; fi
  if command -v zenity >/dev/null 2>&1; then
    zenity "--${2:-info}" --no-markup --title="$TITRE" --text="$1" >/dev/null 2>&1
  elif command -v kdialog >/dev/null 2>&1; then
    case "${2:-info}" in info) k=--msgbox ;; warning) k=--sorry ;; *) k=--error ;; esac
    kdialog --title "$TITRE" "$k" "$1" >/dev/null 2>&1
  else
    MESSAGE_EN_ATTENTE=$1
  fi
}

question() { # $1 : texte, $2 : bouton qui accepte, $3 : bouton qui refuse ; vrai si on accepte
  if silencieux; then journal "$1"; return 0; fi
  if command -v zenity >/dev/null 2>&1; then
    zenity --question --no-markup --title="$TITRE" --text="$1" --ok-label="$2" --cancel-label="$3" >/dev/null 2>&1
  elif command -v kdialog >/dev/null 2>&1; then
    kdialog --title "$TITRE" --yes-label "$2" --no-label "$3" --yesno "$1" >/dev/null 2>&1
  else
    return 0 # sans boîte de dialogue, on fait ce que la personne a demandé en cliquant sur « Mise à jour »
  fi
}

# Le lien atelier-maj: est confié à ce script, là où il se trouve (pour l'utilisateur seulement).
enregistrer_maj() {
  bureau="$APPLIS/atelier-mise-en-page-maj.desktop"
  contenu="[Desktop Entry]
Type=Application
Name=$TITRE ($(txt nom-maj))
Exec=$(chemin_exec "$SCRIPT") %u
NoDisplay=true
Terminal=false
MimeType=x-scheme-handler/atelier-maj;"
  if [ "$(cat "$bureau" 2>/dev/null)" != "$contenu" ]; then
    mkdir -p "$APPLIS" && printf '%s\n' "$contenu" > "$bureau" || return
    command -v update-desktop-database >/dev/null 2>&1 && update-desktop-database "$APPLIS" >/dev/null 2>&1
    # xdg-mime échoue en silence si ce dossier n'existe pas encore
    mkdir -p "${XDG_CONFIG_HOME:-$HOME/.config}"
    command -v xdg-mime >/dev/null 2>&1 && xdg-mime default atelier-mise-en-page-maj.desktop x-scheme-handler/atelier-maj >/dev/null 2>&1
  fi
}

lancer() { # $1 (facultatif) : message à afficher dans l'application
  installer_page_fournie "$ICI/index.html" || { message "$(txt demarrage "$DONNEES")" error; exit 1; }
  adresse="file://$(encoder_url "$PAGE")"
  [ -n "${1:-}" ] && adresse="$adresse#maj=$(encoder_url "$1")"
  if silencieux; then journal "Fenêtre : $adresse"; return; fi
  enregistrer_maj
  for nav in google-chrome-stable google-chrome chromium chromium-browser microsoft-edge-stable microsoft-edge brave-browser; do
    chemin=$(command -v "$nav" 2>/dev/null) || continue
    nohup "$chemin" --app="$adresse" --user-data-dir="$DONNEES/profil" --no-first-run --no-default-browser-check \
      --window-size=1440,900 >/dev/null 2>&1 &
    exit 0
  done
  # Pas de navigateur de la famille Chrome : la page s'ouvre dans le navigateur par défaut (Firefox...)
  nohup xdg-open "$adresse" >/dev/null 2>&1 &
  exit 0
}

mettre_a_jour() {
  MESSAGE_EN_ATTENTE=""
  if ! maj_verifier; then
    message "$MAJ_MESSAGE" warning
  else
    case $MAJ_ETAT in
      a-jour) message "$(txt a-jour "$MAJ_ACTUELLE")" info ;;
      paquet)
        texte=$(txt paquet "$MAJ_VERSION" "$MAJ_ACTUELLE" Linux)
        if command -v zenity >/dev/null 2>&1 || command -v kdialog >/dev/null 2>&1 || silencieux; then
          if [ -n "$MAJ_LIEN" ] && question "$texte" "$(txt b-telecharger)" "$(txt b-plus-tard)"; then silencieux || { xdg-open "$MAJ_LIEN" >/dev/null 2>&1 & }; fi
        else
          MESSAGE_EN_ATTENTE="$texte${NL}${NL}$MAJ_LIEN"
        fi ;;
      disponible)
        if question "$(texte_question)" "$(txt b-installer)" "$(txt b-plus-tard)"; then
          if maj_installer; then
            message "$(txt installee "$MAJ_VERSION")" info
            maj_nettoyer
            lancer "$MESSAGE_EN_ATTENTE"
          else
            message "$MAJ_MESSAGE" warning
          fi
        fi ;;
    esac
  fi
  maj_nettoyer
  # Sans zenity ni kdialog, la réponse s'affiche dans une nouvelle fenêtre de l'application
  [ -n "$MESSAGE_EN_ATTENTE" ] && lancer "$MESSAGE_EN_ATTENTE"
}

case "${1:-}" in
  atelier-maj:*|--maj) langue_du_lien "${1:-}"; mettre_a_jour ;;
  *) lancer ;;
esac
exit 0
