#!/bin/bash

if [ $# -ne 2 ]; then
	echo "usage: $(basename $0) <reponame> <dest-dir>"
	exit 1
fi

reponame=$1
dest=$2

############################################################

. "$(dirname $0)/../db-functions" 
. "$(dirname $0)/../config"

ftppath_base="$FTP_BASE/$reponame/$FTP_OS_SUFFIX"

for arch in ${ARCHES[@]}; do

  TMPDIR=$(mktemp -d /tmp/cleanup-XXXXXX) || exit 1
  ftppath="$ftppath_base/$arch"
  MISSINGFILES=""
  DELETEFILES=""
  DELETESYMLINKS=""
  EXTRAFILES=""

  if [ ! -d "$ftppath" ]; then
      echo "FTP path '$ftppath' does not exist"
      exit 1
  fi

  if ! cd "${TMPDIR}" ; then
      echo "Failed to cd to ${TMPDIR}"
      exit 1
  fi

  if [ ! -f "$ftppath/$reponame$DBEXT" ]; then
    echo ""
    echo "ERROR: The file \"$ftppath/$reponame$DBEXT\" could not be found, aborting."
    echo ""
    exit 1
  fi

  if ! bsdtar xf "$ftppath/$reponame$DBEXT"; then
    echo ""
    echo "ERROR: Command failed: bsdtar xf \"$ftppath/$reponame$DBEXT\""
    exit 1
  fi

  cd "$ftppath"

  for pkg in $TMPDIR/*; do
    filename=$(grep -A1 '^%FILENAME%$' "${pkg}/desc" | tail -n1)
    [ -z "${filename}" ] && filename="${pkg}${PKGEXT}"

    if [ ! -e "${filename}" ]; then
      MISSINGFILES="${MISSINGFILES} ${filename}"
    else
      pkgname="$(getpkgname ${filename})"
      for otherfile in ${pkgname}-*; do
        if [ "${otherfile}" != "${filename}" -a "${pkgname}" = "$(getpkgname ${otherfile})" ]; then
          if [ -h "${otherfile}" ]; then
            DELETESYMLINKS="${DELETESYMLINKS} ${otherfile}"
          else
            DELETEFILES="${DELETEFILES} ${otherfile}"
          fi
        fi
      done
    fi
  done

  for pkg in *$PKGEXT; do
      if [ ! -e "$pkg" ]; then
          continue
      fi
      pkgname="$(getpkgname $pkg)"
      for p in ${TMPDIR}/${pkgname}-*; do
          [ ! -d "${p}" ] || continue 2
          dbpkgname=$(grep -A1 '^%FILENAME%$' "${p}/desc" | tail -n1)
          if [ "${dbpkgname}" = "${pkgname}" ]; then
              continue 2
          fi                                                                                                                                               
      done
      EXTRAFILES="$EXTRAFILES $pkg"
  done 

  rm -rf ${TMPDIR}

  # Do a quick check to see if a missing ARCHINDEPFILE is in the any dir
  # If it is, and the file is MISSING, restore it
  missfiles="$MISSINGFILES"
  MISSINGFILES=""
  for mf in $missfiles; do
      if [ -e "${ftppath_base}/any/${mf}" ]; then
          echo "Restoring missing 'any' symlink: ${mf}"
          ln -s "../any/${mf}" "${ftppath}"
      else
          MISSINGFILES="${MISSINGFILES} ${mf}"
      fi
  done

  #Make sure we've done *something* before outputting anything
  if [ -z "$DELETEFILES$DELETESYMLINKS$MISSINGFILES$EXTRAFILES" ]; then
      continue
  fi

  echo "Scan complete for $reponame ($arch) at ${ftppath}"

  if [ -n "$DELETEFILES" ]; then
      echo "    The following files are out of date"
      echo "    They will be moved to '$dest'"
      for f in $DELETEFILES; do
          echo "        $f"
      done
      echo ""
  fi

  if [ -n "$DELETESYMLINKS" ]; then
      echo "    The following symlinks are out of date"
      echo "    They will be deleted"
      for f in $DELETESYMLINKS; do
          echo "        $f"
      done
      echo ""
  fi

  if [ -n "$MISSINGFILES" ]; then
      echo "    The following files are missing in the repo"
      for f in $MISSINGFILES; do
          echo "        $f"
      done
      echo ""
  fi

  if [ -n "$EXTRAFILES" ]; then
      echo "    The following files are in the repo but not the db"
      echo "    They will be moved to '$dest'"
      for f in $EXTRAFILES; do
          echo "        $f"
      done
  fi

  if [ -n "${DELETEFILES}" ]; then
      mv ${DELETEFILES} "$dest"
      echo ""
  fi

  if [ -n "${DELETESYMLINKS}" ]; then
      rm -f ${DELETESYMLINKS}
      echo ""
  fi

  if [ -n "${EXTRAFILES}" ]; then
      mv ${EXTRAFILES} "$dest"
      echo ""
  fi

done

ARCHINDEPFILES=""

if [ -d "$ftppath_base/any" ]; then
    cd "$ftppath_base/any"
    for pkg in *$PKGEXT; do
        [ -f "$pkg" ] || continue # in case we get a file named "*.pkg.tar.gz"
        found=0
        #check for any existing symlinks
        for arch in ${ARCHES[@]}; do
            if [ -h "$ftppath_base/$arch/$pkg" ]; then
                found=1
                break
            fi
        done
        if [ $found -eq 0 ]; then
            # We found no symlinks to this, delete it
            ARCHINDEPFILES="$ARCHINDEPFILES $pkg"
        fi
    done
fi

if [ -n "$ARCHINDEPFILES" ]; then
  echo "    The following architecture independent packages"
  echo "    are not symlinked in the architecture repositories."
  echo "    They will be moved to '$dest'"
    for f in $ARCHINDEPFILES; do
        echo "        $f"
    done
fi

if [ -d "$ftppath_base/any" -a -n "${ARCHINDEPFILES}" ]; then
  cd "$ftppath_base/any"
  mv ${ARCHINDEPFILES} "$dest"
  echo ""
fi