#!/usr/bin/env bash

########################################################################
# Regenerate auto-generated files, using information in SAGE_ROOT/build/
#
# This script is run by SAGE_ROOT/bootstrap as part of the bootstrapping phase
# (before configure, before creating source distributions).
#
# The BOOTSTRAP_QUIET variable is set by the top-level
# bootstrap script and controls how verbose we are.
########################################################################

set -e

if [ -z "$SAGE_ROOT" ]; then
    echo Please run the top-level bootstrap script of the Sage distribution.
    exit 1
fi

cd "$SAGE_ROOT"

OUTPUT_DIR="src/doc/en/installation"
mkdir -p "$OUTPUT_DIR"

shopt -s extglob

RECOMMENDED_SPKG_PATTERN="@(_recommended$(for a in $(head -n 1 build/pkgs/_recommended/dependencies); do echo -n "|"$a; done))"
DEVELOP_SPKG_PATTERN="@(_develop$(for a in $(head -n 1 build/pkgs/_develop/dependencies); do echo -n "|"$a; done))"

for SYSTEM in arch debian fedora homebrew opensuse void; do
    SYSTEM_PACKAGES=
    OPTIONAL_SYSTEM_PACKAGES=
    SAGELIB_SYSTEM_PACKAGES=
    SAGELIB_OPTIONAL_SYSTEM_PACKAGES=
    RECOMMENDED_SYSTEM_PACKAGES=
    DEVELOP_SYSTEM_PACKAGES=
    for PKG_BASE in $(sage-package list --has-file distros/$SYSTEM.txt); do
                PKG_SCRIPTS=build/pkgs/$PKG_BASE
                PKG_TYPE=$(cat $PKG_SCRIPTS/type)
                PKG_SYSTEM_PACKAGES=$(sage-get-system-packages $SYSTEM $PKG_BASE)
                if [ -n "PKG_SYSTEM_PACKAGES" ]; then
                    if [ -f $PKG_SCRIPTS/spkg-configure.m4 ]; then
                       case "$PKG_BASE:$PKG_TYPE" in
                           *:standard)
                               SYSTEM_PACKAGES+=" $PKG_SYSTEM_PACKAGES"
                               ;;
                           $DEVELOP_SPKG_PATTERN:*)
                               DEVELOP_SYSTEM_PACKAGES+=" $PKG_SYSTEM_PACKAGES"
                               ;;
                           $RECOMMENDED_SPKG_PATTERN:*)
                               RECOMMENDED_SYSTEM_PACKAGES+=" $PKG_SYSTEM_PACKAGES"
                               ;;
                           *)
                               OPTIONAL_SYSTEM_PACKAGES+=" $PKG_SYSTEM_PACKAGES"
                               ;;
                       esac
                    else
                        case "$PKG_BASE:$PKG_TYPE" in
                           $DEVELOP_SPKG_PATTERN:*)
                               DEVELOP_SYSTEM_PACKAGES+=" $PKG_SYSTEM_PACKAGES"
                               ;;
                            *:standard)
                                SAGELIB_SYSTEM_PACKAGES+=" $PKG_SYSTEM_PACKAGES"
                                ;;
                            *)
                                SAGELIB_OPTIONAL_SYSTEM_PACKAGES+=" $PKG_SYSTEM_PACKAGES"
                                ;;
                        esac
                    fi
                fi
    done

    if [ "${BOOTSTRAP_QUIET}" = "no" ]; then
        echo >&2 $0:$LINENO: installing "$OUTPUT_DIR"/$SYSTEM"*.txt"
    fi
    echo "$(sage-print-system-package-command $SYSTEM --prompt --wrap --sudo install $(echo $(echo $SYSTEM_PACKAGES | xargs -n 1 echo | sort | uniq)))" > "$OUTPUT_DIR"/$SYSTEM.txt
    echo "$(sage-print-system-package-command $SYSTEM --prompt --wrap --sudo install $(echo $(echo $OPTIONAL_SYSTEM_PACKAGES | xargs -n 1 echo | sort | uniq)))" > "$OUTPUT_DIR"/$SYSTEM-optional.txt
    echo "$(sage-print-system-package-command $SYSTEM --prompt --wrap --sudo install $(echo $(echo $RECOMMENDED_SYSTEM_PACKAGES | xargs -n 1 echo | sort | uniq)))" > "$OUTPUT_DIR"/$SYSTEM-recommended.txt
    echo "$(sage-print-system-package-command $SYSTEM --prompt --wrap --sudo install $(echo $(echo $DEVELOP_SYSTEM_PACKAGES | xargs -n 1 echo | sort | uniq)))" > "$OUTPUT_DIR"/$SYSTEM-develop.txt
done

OUTPUT_DIR="src/doc/en/reference/spkg"
mkdir -p "$OUTPUT_DIR"
if [ "${BOOTSTRAP_QUIET}" = "no" ]; then
    echo >&2 $0:$LINENO: installing "$OUTPUT_DIR"/"*.rst"
fi
OUTPUT_INDEX="$OUTPUT_DIR"/index.rst
cat > "$OUTPUT_INDEX" <<EOF
.. _spkg:

Packages and Features
=====================

Standard Packages
-----------------

The Sage distribution includes most programs and libraries on which
Sage depends.  It installs them automatically if it does not find
equivalent system packages.

Mathematics
~~~~~~~~~~~

EOF
for PKG_BASE in $(sage-package list --has-file SPKG.rst --has-file math :standard: | grep -v '^sagemath_'); do
    echo "* :ref:\`spkg_$PKG_BASE\`"
done >> "$OUTPUT_INDEX"
cat >> "$OUTPUT_INDEX" <<EOF

Front-end, graphics, document preparation
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

EOF
for PKG_BASE in $(sage-package list --has-file SPKG.rst --no-file math --has-file front-end :standard: | grep -v '^sagemath_'); do
    echo "* :ref:\`spkg_$PKG_BASE\`"
done >> "$OUTPUT_INDEX"
cat >> "$OUTPUT_INDEX" <<EOF

Other dependencies
~~~~~~~~~~~~~~~~~~

EOF
for PKG_BASE in $(sage-package list --has-file SPKG.rst --no-file math --no-file front-end :standard: | grep -v '^sagemath_'); do
    echo "* :ref:\`spkg_$PKG_BASE\`"
done >> "$OUTPUT_INDEX"
cat >> "$OUTPUT_INDEX" <<EOF


Optional Packages
-----------------

For additional functionality, you can install some of the following
optional packages.

Mathematics
~~~~~~~~~~~

EOF
for PKG_BASE in $(sage-package list --has-file SPKG.rst --has-file math :optional: | grep -v '^sagemath_'); do
    echo "* :ref:\`spkg_$PKG_BASE\`"
done >> "$OUTPUT_INDEX"
cat >> "$OUTPUT_INDEX" <<EOF

Front-end, graphics, document preparation
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

EOF
for PKG_BASE in $(sage-package list --has-file SPKG.rst --no-file math --has-file front-end :optional: | grep -v '^sagemath_'); do
    echo "* :ref:\`spkg_$PKG_BASE\`"
done >> "$OUTPUT_INDEX"
cat >> "$OUTPUT_INDEX" <<EOF

Other dependencies
~~~~~~~~~~~~~~~~~~

EOF
for PKG_BASE in $(sage-package list --has-file SPKG.rst --no-file math --no-file front-end :optional: | grep -v '^sagemath_'); do
    echo "* :ref:\`spkg_$PKG_BASE\`"
done >> "$OUTPUT_INDEX"
cat >> "$OUTPUT_INDEX" <<EOF


Features
--------

.. toctree::
   :maxdepth: 1

   sage/features
   sage/features/join_feature
   sage/features/all
   sage/features/sagemath
   sage/features/pkg_systems
   sage/features/bliss
   sage/features/csdp
   sage/features/databases
   sage/features/dvipng
   sage/features/ffmpeg
   sage/features/four_ti_2
   sage/features/gap
   sage/features/graph_generators
   sage/features/graphviz
   sage/features/imagemagick
   sage/features/interfaces
   sage/features/internet
   sage/features/kenzo
   sage/features/latex
   sage/features/latte
   sage/features/lrs
   sage/features/mcqd
   sage/features/meataxe
   sage/features/mip_backends
   sage/features/normaliz
   sage/features/pandoc
   sage/features/pdf2svg
   sage/features/polymake
   sage/features/rubiks
   sage/features/tdlib
EOF
cat >> "$OUTPUT_INDEX" <<EOF

Distribution Packages of the Sage Library
-----------------------------------------

EOF
for PKG_BASE in $(sage-package list --has-file SPKG.rst | grep '^sagemath_'); do
    echo "* :ref:\`spkg_$PKG_BASE\`"
done >> "$OUTPUT_INDEX"
cat >> "$OUTPUT_INDEX" <<EOF

Experimental Packages
---------------------

Some packages that provide additional functionality are marked as
"experimental".  Developers are needed in order to improve the
integration of these packages into the Sage distribution.

Mathematics
~~~~~~~~~~~

EOF
for PKG_BASE in $(sage-package list --has-file SPKG.rst --has-file math :experimental: | grep -v '^sagemath_'); do
    echo "* :ref:\`spkg_$PKG_BASE\`"
done >> "$OUTPUT_INDEX"

cat >> "$OUTPUT_INDEX" <<EOF

Other dependencies
~~~~~~~~~~~~~~~~~~

EOF
for PKG_BASE in $(sage-package list --has-file SPKG.rst --no-file math :experimental: | grep -v '^sagemath_'); do
    echo "* :ref:\`spkg_$PKG_BASE\`"
done >> "$OUTPUT_INDEX"

cat >> "$OUTPUT_INDEX" <<EOF


All External Packages
---------------------

.. toctree::
   :maxdepth: 1

   index_alph

EOF

OUTPUT_INDEX="$OUTPUT_DIR"/index_alph.rst
(cat <<EOF

Details of external packages
============================

Packages are in alphabetical order.

.. default-role:: code

.. toctree::
   :maxdepth: 1

EOF
for PKG_BASE in $(sage-package list --has-file SPKG.rst); do
    echo "   $PKG_BASE"
done
cat <<EOF

.. default-role::

EOF
) > "$OUTPUT_INDEX"
sage-package list --has-file SPKG.rst | OUTPUT_DIR=$OUTPUT_DIR OUTPUT_RST=1 xargs -P 99 -n 1 sage-spkg-info
