#!/bin/bash
# Under the terms of the 'COPYRIGHT.TXT' file.

# Chequeo de sanidad:
if [[ ! -r ${TMP}/series.in ]]; then
  exit 99;
fi

# Funciones:
install_from() {
  local file
  local CODE
  file="$1"
  [[ -s $file ]] || return 99;
  setterm -clear
  mapfile -t arr < $file
  num=${#arr[*]}
  total=$((num - 1))
  for ((i = 0; i <= total; i++)); do
    ROOT=/mnt pkg add -f "${arr[i]}"
    CODE=$?
    if (( $CODE != 0 )); then
      echo "Failed in package installation."
      read -ep "Do you want to continue with the installation? (y/N): "
      if [[ $REPLY = [nN] ]]; then
        return $CODE;
      else
        continue;
      fi
    fi
    printf "\n%s\n\n" "Package: (${i}/${total})"
  done
}

# Una funcin para crear la lista completa de los paquetes:
mk_list() {
  local list
  list="$1"
  rm -f ${TMP}/$list
  while read -r series ; do
    find ${SRC_INS}/$series -type f -name '*.tlz' | sort >> "$list"
  done < ${TMP}/series.in
}

# Men:
dialog \
 --backtitle "Selection of installation mode" \
 --title "SELECT THE INSTALLATION MODE" \
 --menu "" 7 67 0 \
 "All"     "Install all packages in the selected series" \
 "Expert"  "Select packages from the selected series" \
  2> ${TMP}/return-run-install-menu
CODE=$?
if (( $CODE != 0 )); then
  exit $CODE;
fi
ANSWER=$(cat ${TMP}/return-run-install-menu)

if [[ $ANSWER = All ]]; then
  mk_list ${TMP}/packages_in_all
  install_from ${TMP}/packages_in_all
  CODE=$?; (( $CODE != 0 )) && exit $CODE;
fi

if [[ $ANSWER = Expert ]]; then
  # Procesamos las series escogidas para ser desplegadas en pantalla:
  mkdir -p ${TMP}/by-selection
  while read -r series ; do
    name=${SRC_INS}/${series}/_install/$series
    if [[ -f $name ]]; then
      name=${name##*/}
      cat << EOF > ${TMP}/by-selection/${name}
dialog \\
 --backtitle "Selecting packages" --title "= $series =" \\
 --item-help --checklist "" 21 70 22 \\
EOF
      ( cd ${TMP}/by-selection
        sed 's/:/\" \"/g' ${SRC_INS}/${series}/_install/$series | \
         sed 's/^/\"/;s/$/\" \\\n\\/'
        echo " 2> \${TMP}/serie.${series}"
      ) >> ${TMP}/by-selection/${name}
    fi
  done < ${TMP}/series.in
  # Muestra el men de cada serie:
  for display in ${TMP}/by-selection/* ; do
    if [[ -f $display ]]; then
      . $display
    fi
  done
  # Depura las respuestas para su posterior bsqueda:
  sed 's/"//g;s/ /\n/g' ${TMP}/serie.* 2> /dev/null \
   >> ${TMP}/selected_packages

  mk_list ${TMP}/packages_in_all

  # Procedemos a encontrar los paquetes:
  mapfile -t lines < ${TMP}/selected_packages
  rm -f ${TMP}/packages_in_expert
  for element in "${lines[@]}"; do
    if grep -q -w -m1 "$element" ${TMP}/packages_in_all ; then
      echo $(grep -w -m1 "$element" ${TMP}/packages_in_all) \
       >> ${TMP}/packages_in_expert
    fi     
  done
  ( cd $TMP
    sort packages_in_expert > packages_in_expert.sorted
    mv packages_in_expert.sorted packages_in_expert
  )
  install_from ${TMP}/packages_in_expert
fi

