#!/bin/bash

containsElement () {
  local e match="$1"
  shift
  for e; do [[ "$e" == "$match" ]] && return 0; done
  return 1
}

SCRIPT_PATH=$(realpath "$0")
SCRIPT_DIR=$(dirname "$SCRIPT_PATH")

DEEP=false
PKGS=()

while getopts "d" flag; do
    case "$flag" in
        d) DEEP=true
           shopt -s globstar;;
        *) echo "Unknown flag ${flag}"
           exit 2;;
    esac
done

if [ -z "${@:$OPTIND:1}" ]; then
  echo "You have not specified a repository"
  exit 1
fi
if ! [ -d "${@:$OPTIND:1}" ]; then
  echo "The given path is not a directory"
  exit 1
fi

if realpath "${@:$OPTIND:1}" &> /dev/null; then
  REPO=$(realpath "${@:$OPTIND:1}")
fi

shopt -s nullglob

create_entry() {
  if [ $# -eq 0 ]; then
    return 0
  fi
  if ! [ -f "$1" ]; then
    return 0
  fi
  
  info="info:"$'\n'
  info+=$(tar -xf "$pkg" pkg.info -O | sed 's/^/  /g')
  package=$(echo "$info" | grep 'name: ' | xargs | awk '{print $2}')
  if containsElement "$package" "${PKGS[@]}"; then
    echo "The following package was found in more than 1 package archives: ${package}"
    exit 1
  fi
  PKGS+=("$package")
  file="$(realpath -s --relative-to="$REPO" "$pkg")"
  info+=$'\n'"download: ${file}"
  info+=$'\n---'
  echo "$info"
}

if ! $DEEP; then
  for arch in "$REPO"/*/; do
    for pkg in "$arch"/*.bpm; do
      create_entry "$pkg"
    done
  done
else
  for arch in "$REPO"/*/; do
    for pkg in "$arch"/**/*.bpm; do
      create_entry "$pkg"
    done
  done
fi
