#!/bin/bash

set -e

versionsUniq() {
  tr ' ' '\n' | \
  sed 's|^python$|python>=0|' | \
  sort -rV | \
  sed 's@^\([^<=>]*\)\(\(>=\|=\|<\)[0-9.]*\)$@\1\2 \1@' | \
  sed 's|^\(\S*\)$|\1 \1|' | \
  uniq -f1 "$@" | \
  awk '{print $1}' | \
  sed 's|^python>=0$|python|' | \
  sort | \
  grep -v '^\s*$'
}

ladePkgbuild() {
  paket="$1"

  if [[ "${paket}" != "python-"* ]]
  then
    return 1
  fi

  cd "$(dirname "${me}")"
  cd "${paket}"

  makepkg -f --verifysource

  . PKGBUILD
}

versteheRequirements() {
  for version_prefix in '' 'v'; do
    for suffix in 'tar.gz' 'tgz'; do
      archiv="${_pkgname}-${version_prefix}${pkgver}.${suffix}"
      [ -r "${archiv}" ] && break
    done
    [ -r "${archiv}" ] && break
  done

  if [ ! -r "${archiv}" ]; then
    >&2 echo "Kann Quelldatei nicht finden!"
    return 2
  fi

  unset meta

  echo "setup.py lesen ..."

  meta="$(
    {
      tar -Oxzf "${archiv}" "${_pkgname}-${pkgver}/setup.py" | \
        sed -n "$(
          for wasAusgeben in "${!metaRegexe[@]}"; do
            printf '/^\\s*%s = \[/{\n' \
              "${metaRegexe["${wasAusgeben}"]}"
            printf '  :%s\n' \
              "${wasAusgeben}"
            printf '  $! N\n'
            printf '  s/^\(\\s*\\S\\+\\s*=\\s*\\[[^]#]*\\)\\(#.*\\)\\?\\n/\\1 /\n'
            printf '  t %s\n' \
              "${wasAusgeben}"
            printf '  s/\\s//g\n'
            printf '  s/^%s=\[//\n' \
              "${metaRegexe["${wasAusgeben}"]}"
            printf '  s/\]$//\n'
            printf '  s/\\s*%%[^"'"'"']*["'"'"']//g\n'
            printf '  s/,/\\n/g\n'
            printf '  s/["'"'"']//g\n'
            printf '  s/^/%s:/\n' \
              "${wasAusgeben}"
            printf '  P\n'
            printf '  D\n'
            printf '}\n'
          done
        )"
      {
        tar -Oxzf "${archiv}" "${_pkgname}-${pkgver}/requirements.txt"
        tar -tzf "${archiv}" | \
          grep '^.*/.*/requirements.txt' | \
          xargs -r tar -Oxzf "${archiv}"
      } | \
        sed '
          /^[a-zA-Z]/! d
          s/==/=/
          s/\s*\([<=>]\+\)\s*/\1/
          s/\s*[#;].*$//
          /^$/d
          /^numpydoc\s*\([<>=].*\)\?$/d
          s,^https\?:.*/mysql-connector-python-[^/]*$,mysql-connector,
          s/^/_depends:/
        '
    } | \
      tr '[:upper:]' '[:lower:]' | \
      sort -u
  )"

  for wasAusgeben in "${!metaRegexe[@]}"; do
    metaInfos["${wasAusgeben}"]=$(
      printf '%s\n' "${meta}" | \
        sed -n '
          s/^'"${wasAusgeben}"'://
          T
          y/ /\n/
          p
        ' | \
        sed '
          /^cython\($\|[<>=]\)\|^python-/! s/^/python-/
          /[^<>]=/ s/=/>=/
        '
    )
  done

  for wasAusgeben in "${!metaRegexe[@]}"; do
    eval 'tmp=("${'${wasAusgeben}'[@]}")'
    pkgBuild["${wasAusgeben}"]=$(
      echo "${tmp[@]}" | \
        tr " '" '\n\n' | \
        grep -v '^$' | \
        sort -u
    )
    if [ -z "${pkgBuild["${wasAusgeben}"]}" ] && \
      [ "${wasAusgeben}" == "_depends" ]; then
      pkgBuild["${wasAusgeben}"]="python"
    fi

    metaYml["${wasAusgeben}"]="${metaInfos["${wasAusgeben}"]}"

    if [ -z "${metaYml["${wasAusgeben}"]}" ] && \
      [ "${wasAusgeben}" == "_depends" ]; then
      metaYml["${wasAusgeben}"]="python"
    fi
    if [ "${wasAusgeben}" == "_makedepends" ]; then
      metaYml["${wasAusgeben}"]=$(
        {
          {
            {
              {
                echo "${metaYml["${wasAusgeben}"]}"
                echo "${metaYml["_depends"]}"
              } | \
                versionsUniq
              echo "${metaYml["_depends"]}"
            } | \
              sort | \
              uniq -d | \
              sed 'p'
            echo "${metaYml["${wasAusgeben}"]}"
          } | \
            versionsUniq -u
          echo "${pkgBuild["${wasAusgeben}"]}" | \
            grep '^\s*\(cython\|python-setuptools\)\($\|[<>=]\)'
        } | \
          versionsUniq
      )
    fi
    if [ "${wasAusgeben}" == "_checkdepends" ]; then
      metaYml["${wasAusgeben}"]=$(
        {
          {
            {
              {
                echo "${metaYml["${wasAusgeben}"]}"
                echo "${metaYml["_depends"]}"
              } | \
                versionsUniq
              echo "${metaYml["_depends"]}"
            } | \
              sort | \
              uniq -d | \
              sed 'p'
            echo "${metaYml["${wasAusgeben}"]}"
          } | \
            versionsUniq -u
          echo "${pkgBuild["${wasAusgeben}"]}" | \
            grep '^\s*\(python-nose\)\($\|[<>=]\)'
        } | \
          versionsUniq
      )
    fi
  done

  echo "... fertig"
}

declare -A metaInfos
declare -A metaRegexe
declare -A metaSubst
declare -A metaYml
declare -A pkgBuild

metaRegexe["_depends"]="install_requires"
metaSubst["_depends"]=true
metaRegexe["_makedepends"]="setup_requires"
metaSubst["_makedepends"]=true
metaRegexe["_checkdepends"]="test_requires"
metaSubst["_checkdepends"]=true