#!/usr/bin/env bash
# Instala compiladores y herramientas en copias de las bases, sin alterar los tar.gz limpios.
set -euo pipefail

entornos=(ubuntu-viejo debian-viejo fedora-viejo suse-viejo arch-viejo ubuntu-actual debian-actual fedora-actual suse-actual arch-actual)
if (($#)); then entornos=("$@"); fi
raiz=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd)
[[ -x $raiz/sp/sp ]] || { echo "Falta $raiz/sp/sp" >&2; exit 1; }

for entorno in "${entornos[@]}"; do
  base="localhost/simusol-$entorno:base"
  destino="localhost/simusol-$entorno:desarrollo"
  podman image exists "$base" || { echo "Falta $base" >&2; exit 1; }
  if podman image exists "$destino"; then
    echo "$destino ya existe; no se modifica"
    continue
  fi
  glibc_base=$(podman run --rm "$base" getconf GNU_LIBC_VERSION)
  echo "==> $entorno: sp buildtools"
  opciones=(--volume "$raiz:/opt/summapack:ro")
  orden=(/bin/bash /opt/summapack/sp/sp buildtools)
  if [[ $entorno == arch-viejo ]]; then
    orden=(/bin/bash -ec 'install -m 644 /opt/summapack/distros/arch/mirrorlist-2022-05-31 /etc/pacman.d/mirrorlist; install -m 644 /opt/summapack/distros/arch/pacman-archivo-2022.conf /etc/pacman.conf; exec /bin/bash /opt/summapack/sp/sp buildtools')
  fi
  contenedor=$(podman create "${opciones[@]}" "$base" "${orden[@]}")
  if ! podman start -a "$contenedor"; then
    echo "Falló $entorno; contenedor conservado: $contenedor" >&2
    exit 1
  fi
  imagen_candidata=$(podman commit "$contenedor")
  podman rm "$contenedor" >/dev/null
  podman run --rm "$imagen_candidata" sh -ec '
    for orden in gcc g++ gfortran make cmake autoconf bison flex pkg-config; do
      command -v "$orden" >/dev/null || { echo "Falta $orden" >&2; exit 1; }
    done
    for biblioteca in gsl libpcre2-8; do
      pkg-config --exists "$biblioteca" || { echo "Falta $biblioteca" >&2; exit 1; }
    done
    find /usr/include -name cblas.h -print -quit 2>/dev/null | grep -q . || { echo "Falta cabecera de OpenBLAS" >&2; exit 1; }
    find /usr/lib /usr/lib64 -name "libopenblas.so*" -print -quit 2>/dev/null | grep -q . || { echo "Falta biblioteca OpenBLAS" >&2; exit 1; }
    find /usr/include /usr/local/include -name klu.h -print -quit 2>/dev/null | grep -q . || { echo "Falta KLU (SuiteSparse)" >&2; exit 1; }
    printf "glibc="; getconf GNU_LIBC_VERSION
    printf "gcc="; gcc -dumpfullversion
    printf "g++="; g++ -dumpfullversion
    printf "gfortran="; gfortran -dumpfullversion
  '
  glibc_desarrollo=$(podman run --rm "$imagen_candidata" getconf GNU_LIBC_VERSION)
  [ "$glibc_base" = "$glibc_desarrollo" ] || {
    echo "$entorno: glibc cambió de $glibc_base a $glibc_desarrollo; repositorios mezclados" >&2
    exit 1
  }
  podman tag "$imagen_candidata" "$destino"
done
