# Maintainer: FWS
# ============================================================================
#  anaconda — l'installateur Fedora (rhinstaller) PORTÉ sur Arch pour FWS.
#  Build autotools : ./autogen.sh && ./configure && make && make install
#  (le source compile aussi widgets/ via AC_CONFIG_SUBDIRS → on retire ces
#   fichiers en package(), ils sont fournis par le paquet anaconda-widgets).
#
#  ⚠️  SCAFFOLD À ITÉRER : ce PKGBUILD est un point de départ fidèle au spec
#      amont, mais Anaconda est profondément couplé à Fedora. Il faudra très
#      probablement itérer sur Arch RÉEL (via ./setup-aur.sh) pour :
#        - des BuildRequires manquants au configure,
#        - des chemins/macros Fedora (systemd-rpm-macros, find_lang…),
#        - la compat Python 3.14 d'Arch (Anaconda vise le Python de Fedora).
#
#  DÉVIATIONS FWS vs Requires du spec (justifiées) :
#   - RETIRÉS car payload liveimg (jamais le payload DNF) : python3-libdnf5,
#     python3-rpm.  → cf. verdict « drop DNF » (libdnf5 importé seulement dans
#     dnf_manager.py, chemin non pris avec liveimg).
#   - RETIRÉ libselinux : Arch n'est pas SELinux (blivet/anaconda gèrent son
#     absence).  - RETIRÉS Fedora-only / N/A archiso : subscription-manager,
#     s390utils-*, crypto-policies(-scripts), glibc-langpack-*, dracut-network,
#     teamd/NetworkManager-team, flatpak(-libs).  - grub2-common → grub (Arch).
#   - RISQUE connu : python3-crypt-r (module `crypt` retiré de Python ≥ 3.13)
#     n'a peut-être pas d'équivalent Arch → à packager si l'import casse.
# ============================================================================
pkgname=anaconda
pkgver=45.8
pkgrel=4
pkgdesc="The Anaconda installer (porté sur Arch pour FWS, payload liveimg)"
arch=('x86_64')
url="https://github.com/rhinstaller/anaconda"
license=('GPL-2.0-or-later')
depends=(
  # — interface & widgets —
  'anaconda-widgets' 'gtk3' 'python-gobject' 'gsettings-desktop-schemas'
  'adwaita-icon-theme' 'librsvg' 'nm-connection-editor'
  # — cœur Python Anaconda —
  'python' 'python-meh' 'python-simpleline' 'pykickstart' 'python-dasbus'
  'python-productmd' 'python-pid' 'python-langtable' 'python-iso639'
  'python-requests' 'python-requests-file' 'python-requests-ftp'
  # — stockage —
  'python-blivet' 'libblockdev' 'python-pyparted' 'parted' 'util-linux'
  'lvm2' 'cryptsetup' 'mdadm' 'dosfstools' 'e2fsprogs' 'xfsprogs' 'btrfs-progs'
  # — rapport de crash (python-meh importe `report` en dur) —
  'libreport'
  # — système / réseau / boot —
  'networkmanager' 'kbd' 'chrony' 'systemd' 'dbus' 'openssh' 'grub'
  'libpwquality' 'python-systemd' 'python-xkbregistry' 'cracklib'
)
# NB : pas de 'glade' — module Glade désactivé au build (cf. build()).
makedepends=(
  'autoconf' 'automake' 'libtool' 'gettext' 'intltool' 'gtk-doc'
  'gobject-introspection' 'python' 'gdk-pixbuf2' 'libxml2'
  'desktop-file-utils' 'glib2-devel' 'libarchive' 'rpm-tools'
)
source=("anaconda-$pkgver.tar.gz::https://github.com/rhinstaller/anaconda/archive/refs/tags/anaconda-$pkgver.tar.gz")
sha256sums=('5ef1464bff7f28a4a09a821cbb0121f09ef504ec169288d742373f86807ec4ed')
_srcdir="anaconda-anaconda-$pkgver"

prepare() {
  cd "$srcdir/$_srcdir"
  # ── FWS : clavier par défaut selon le TERRITOIRE de la locale ──────────────
  # set_layouts() amont fait « locale = get_language_id(self.language) » →
  # get_language_id JETTE le territoire (fr_CH.UTF-8 → 'fr') → list_keyboards('fr')
  # = 'fr(oss)' (France) au lieu de 'ch(fr)' (Suisse). On passe la LOCALE COMPLÈTE
  # (self.language) : langtable.list_keyboards('fr_CH.UTF-8') = 'ch(fr)'. La
  # validation l'accepte (is_valid_langcode → parse_locale().language non vide).
  # → le clavier du GUI ET du système installé suivent enfin la locale choisie.
  sed -i \
    's/^\(\s*\)locale = get_language_id(self\.language)/\1locale = self.language  # FWS: garder le territoire (fr_CH -> ch(fr))/' \
    pyanaconda/modules/localization/localization.py
  # Garde-fou : casse le build si le motif amont a changé (le patch silencieux).
  grep -q 'locale = self.language  # FWS' \
    pyanaconda/modules/localization/localization.py

  # ── FWS : champ « Nom de machine » dans le spoke Utilisateur ───────────────
  # Anaconda ne propage PAS le hostname (le champ du spoke Réseau est perdu chez
  # nous → /etc/hostname vide). On ajoute donc un champ Hostname à l'onglet de
  # création de compte (ligne 2 de la grille, libre) ; user.py écrit la valeur
  # dans /tmp/fws-hostname, que le %post du kickstart applique à /etc/hostname.
  python3 - <<'PYEOF'
import glob

# 1) user.glade : insérer label + entry "Host name" APRÈS le bloc username_entry.
glades = [p for p in glob.glob("pyanaconda/**/user.glade", recursive=True)
          if 'username_entry' in open(p, encoding='utf-8').read()]
assert glades, "FWS: user.glade introuvable"
g = glades[0]
s = open(g, encoding='utf-8').read()
assert 'id="hostname_entry"' not in s, "FWS: glade déjà patché"
i = s.index('id="username_entry"')
k = s.index('</packing>', i)                 # fin du packing de username_entry
j = s.index('</child>', k) + len('</child>') # fin du <child> EXTERNE (pas l'accessible)
block = '''
                    <child>
                      <object class="GtkLabel" id="hostname_label">
                        <property name="visible">True</property>
                        <property name="can-focus">False</property>
                        <property name="xpad">10</property>
                        <property name="label" translatable="yes" context="GUI|User">_Host name</property>
                        <property name="use-underline">True</property>
                        <property name="mnemonic-widget">hostname_entry</property>
                        <property name="xalign">1</property>
                        <attributes>
                          <attribute name="weight" value="bold"/>
                        </attributes>
                      </object>
                      <packing>
                        <property name="left-attach">0</property>
                        <property name="top-attach">2</property>
                      </packing>
                    </child>
                    <child>
                      <object class="GtkEntry" id="hostname_entry">
                        <property name="visible">True</property>
                        <property name="can-focus">True</property>
                        <property name="width-chars">50</property>
                        <child internal-child="accessible">
                          <object class="AtkObject" id="hostname_entry-atkobject">
                            <property name="AtkObject::accessible-name" translatable="yes">Host Name</property>
                          </object>
                        </child>
                      </object>
                      <packing>
                        <property name="left-attach">1</property>
                        <property name="top-attach">2</property>
                      </packing>
                    </child>'''
open(g, 'w', encoding='utf-8').write(s[:j] + block + s[j:])

# 2) user.py (GUI) : récupérer le widget + écrire /tmp/fws-hostname dans apply().
pys = glob.glob("pyanaconda/ui/gui/spokes/user.py")
assert pys, "FWS: user.py introuvable"
p = pys[0]
s = open(p, encoding='utf-8').read()
anchor = 'self._username_entry = self.builder.get_object("username_entry")'
assert anchor in s, "FWS: ancre username_entry absente"
s = s.replace(anchor,
    anchor + '\n        self._hostname_entry = self.builder.get_object("hostname_entry")',
    1)
ap = 'set_user_list(self._users_module, self._user_list, remove_unset=True)'
assert ap in s, "FWS: ancre apply() absente"
s = s.replace(ap, ap + '''

        # FWS : mémorise le nom de machine saisi (cible pas encore montée) pour
        # le %post du kickstart, qui l'écrira dans /etc/hostname.
        try:
            _hn = self._hostname_entry.get_text().strip()
        except Exception:
            _hn = ""
        try:
            with open("/tmp/fws-hostname", "w") as _f:
                _f.write(_hn)
        except OSError:
            pass''', 1)
open(p, 'w', encoding='utf-8').write(s)
print("FWS: champ Hostname ajouté au spoke Utilisateur (glade + user.py)")
PYEOF
}

build() {
  cd "$srcdir/$_srcdir"
  # Glade désactivé (catalogue designer, inutile au runtime) → pas de dép glade.
  # La variable d'env doit être posée AVANT autogen.sh (lue par m4 à l'autoreconf)
  # EN PLUS du flag --disable-glade au configure.
  export ANACONDA_DISABLE_GLADE=yes
  # autogen.sh : autoreconf -vfi racine + (cd widgets && ./autogen.sh).
  ./autogen.sh
  # ANACONDA_RELEASE=1 : release réelle, pas la date de création du tarball.
  ./configure \
      --prefix=/usr --libdir=/usr/lib --sysconfdir=/etc \
      --disable-glade --disable-gtk-doc ANACONDA_RELEASE=1
  make
}

package() {
  cd "$srcdir/$_srcdir"
  make DESTDIR="$pkgdir" install
  find "$pkgdir" -name '*.la' -delete

  # Répertoires attendus par Anaconda (créés vides par le spec).
  install -d "$pkgdir/usr/share/anaconda/addons" \
             "$pkgdir/usr/share/anaconda/post-scripts"

  # Fichiers widgets : fournis par le paquet anaconda-widgets → on les retire
  # ici (le build principal recompile widgets/ via AC_CONFIG_SUBDIRS) pour
  # éviter le conflit de fichiers à l'install. On enlève TOUT l'empreinte
  # widgets : lib, typelib, pkgconfig, headers, .gir, doc, override gi.
  rm -f  "$pkgdir"/usr/lib/libAnacondaWidgets.so*
  rm -f  "$pkgdir"/usr/lib/girepository-*/AnacondaWidgets*.typelib
  rm -f  "$pkgdir"/usr/lib/pkgconfig/AnacondaWidgets.pc
  rm -rf "$pkgdir"/usr/include/AnacondaWidgets
  rm -f  "$pkgdir"/usr/share/gir-1.0/AnacondaWidgets*.gir
  rm -rf "$pkgdir"/usr/share/gtk-doc/html/AnacondaWidgets
  rm -f  "$pkgdir"/usr/lib/python*/site-packages/gi/overrides/AnacondaWidgets*

  # interactive-defaults.ks : FWS le fournit via l'overlay airootfs
  # (configs/*/airootfs/usr/share/anaconda/) avec le payload liveimg. mkarchiso
  # copie l'overlay AVANT pacstrap → si le paquet livrait aussi ce fichier, pacman
  # planterait (« exists in filesystem »). On retire donc la version amont : le
  # fichier de l'overlay reste la seule à ce chemin, et anaconda le lit au runtime.
  rm -f "$pkgdir"/usr/share/anaconda/interactive-defaults.ks

  # usr-merge Arch : /usr/sbin est un LIEN → /usr/bin. Anaconda installe dans
  # /usr/sbin (vrai dossier sur Fedora) → conflit avec le paquet 'filesystem'.
  # On rapatrie le contenu dans /usr/bin et on supprime le dossier sbin.
  if [ -d "$pkgdir/usr/sbin" ] && [ ! -L "$pkgdir/usr/sbin" ]; then
    install -d "$pkgdir/usr/bin"
    cp -aT "$pkgdir/usr/sbin" "$pkgdir/usr/bin"
    rm -rf "$pkgdir/usr/sbin"
  fi
}
