#!/usr/bin/env bash

set -euo pipefail


if [ $# -ne 1 ] ; then
   echo >&2 "Usage: %0 osc_home_directory"
   exit 1
fi
OSC_HOME="$1"
if [ ! -d "${OSC_HOME}" ] ; then
   echo 2>&1 "ERROR: OSC home directory ${OSC_HOME} does not exist!"
   exit 1
fi

# ====== Get package configuration ==========================================
CHANGELOG_HEADER="$(head -n1 debian/changelog)"

# The package name, e.g. MyApplication
PACKAGE=$(echo "${CHANGELOG_HEADER}" | sed -e "s/(.*//" -e "s/ //g")
# The package distribution, e.g. precise, raring, ...
PACKAGE_DISTRIBUTION=$(echo "${CHANGELOG_HEADER}" | sed -e "s/[^)]*)//" -e "s/;.*//g" -e "s/ //g")
# The package's version, e.g. 1.2.3-1ubuntu1
PACKAGE_VERSION=$(echo "${CHANGELOG_HEADER}" | sed -e "s/.*(//" -e "s/).*//" -e "s/ //g" -e "s/ //g" -e "s/^[0-9]://g")
# The package's output version, e.g. 1.2.3-1ubuntu
# shellcheck disable=SC2001
OUTPUT_VERSION=$(echo "${PACKAGE_VERSION}"   | sed -e "s/\(ubuntu\|ppa\)[0-9]*$/\1/")
# The package's Debian version, e.g. 1.2.3-1
# shellcheck disable=SC2001
DEBIAN_VERSION=$(echo "${OUTPUT_VERSION}"    | sed -e "s/\(ubuntu\|ppa\)$//1")
# The package's upstream version, e.g. 1.2.3
# shellcheck disable=SC2001
UPSTREAM_VERSION=$(echo "${DEBIAN_VERSION}"  | sed -e "s/-[0-9]*$//")
# The package's plain upstream version, e.g. 1.2.3 (without e.g. ~svn<xxxx>)
# shellcheck disable=SC2001
PLAIN_VERSION=$(echo "${UPSTREAM_VERSION}"   | sed -e "s/\([0-9\.]*\)[-+~].*$/\1/")


echo -e "\x1b[34m######################################################################\x1b[0m"
echo -e "\x1b[34mCHANGELOG_HEADER:     ${CHANGELOG_HEADER}\x1b[0m"
echo -e "\x1b[34mPACKAGE:              ${PACKAGE}\x1b[0m"
echo -e "\x1b[34mPACKAGE_DISTRIBUTION: ${PACKAGE_DISTRIBUTION}\x1b[0m"
echo -e "\x1b[34mPACKAGE_VERSION       ${PACKAGE_VERSION}\x1b[0m"
echo -e "\x1b[34mOUTPUT_VERSION:       ${OUTPUT_VERSION}\x1b[0m"
echo -e "\x1b[34mDEBIAN_VERSION:       ${DEBIAN_VERSION}\x1b[0m"
echo -e "\x1b[34mUPSTREAM_VERSION:     ${UPSTREAM_VERSION}\x1b[0m"
echo -e "\x1b[34mPLAIN_VERSION:        ${PLAIN_VERSION}\x1b[0m"
echo -e "\x1b[34m######################################################################\x1b[0m"


# ====== Update OSC package =================================================
if [ ! -d "${OSC_HOME}/${PACKAGE}" ] ; then
   echo 2>&1 "ERROR: OSC package directory ${OSC_HOME}/${PACKAGE} does not exist!"
   exit 1
fi
TARBALL1_EXT="$(find . -maxdepth 1 -name "${PACKAGE}-${UPSTREAM_VERSION}.tar.*" -printf "%P\n" | \
   head -n1 | awk '/\.gz|\.bz2|\.xz|\.zst$/ { print $1 }' | sed -e 's/^.*\.//g')"
if [ -z "${TARBALL1_EXT}" ] ; then
   echo "ERROR: Unable to find original tarball (${PACKAGE}-${UPSTREAM_VERSION}.tar.*)!"
   exit 1
fi
TARBALL2_EXT="$(find . -maxdepth 1 -name "${PACKAGE}_${UPSTREAM_VERSION}.orig.tar.*" -printf "%P\n" | \
   head -n1 | awk '/\.gz|\.bz2|\.xz|\.zst$/ { print $1 }' | sed -e 's/^.*\.//g')"
if [ -z "${TARBALL2_EXT}" ] ; then
   echo "ERROR: Unable to find original tarball (${PACKAGE}_${UPSTREAM_VERSION}.orig.tar.*)!"
   exit 1
fi

declare -A filesToProcess=(
   ["${PACKAGE}-${UPSTREAM_VERSION}.tar.${TARBALL1_EXT}"]=1
   ["${PACKAGE}-${UPSTREAM_VERSION}.tar.${TARBALL1_EXT}.asc"]=1
   ["${PACKAGE}_${UPSTREAM_VERSION}.orig.tar.${TARBALL2_EXT}"]=1
   ["${PACKAGE}_${UPSTREAM_VERSION}.orig.tar.${TARBALL2_EXT}.asc"]=1
   ["${PACKAGE}_${DEBIAN_VERSION}.dsc"]=1
   ["${PACKAGE}_${DEBIAN_VERSION}.debian.tar.xz"]=1
   ["${PACKAGE}.spec"]=1
)
if [ -e packaging/APKBUILD ] ; then
   filesToProcess+=(
      ["APKBUILD"]=1
   )
fi

# ------ Obtain all current files -------------------------------------------
mapfile -t filesToRemove < <(find "${OSC_HOME}/${PACKAGE}" -maxdepth 1 -name "[^\.]*" -type f -printf "%P\n")
for file in "${filesToRemove[@]}" ; do
   if [[ ! -v filesToProcess["${file}"] ]] ; then
      filesToProcess["${file}"]=0
   fi
done

# ------ Copy new files -----------------------------------------------------
for file in "${!filesToProcess[@]}" ; do
   if [ "${filesToProcess["${file}"]}" -eq 1 ] ; then
      echo "Copy ${file} -> ${OSC_HOME}/${PACKAGE}/${file} ..."
      if [ -e "${file}" ] ; then
         cp "${file}" "${OSC_HOME}/${PACKAGE}/"
      elif [ -e "rpm/${file}" ] ; then
         cp "rpm/${file}" "${OSC_HOME}/${PACKAGE}/"
      elif [ -e "packaging/${file}" ] ; then
         cp "packaging/${file}" "${OSC_HOME}/${PACKAGE}/"
      else
         echo >&2 "ERROR: File ${file} does not exist!"
         exit 1
      fi
   fi
done

# ------ Remove old files ---------------------------------------------------
pushd "${OSC_HOME}/${PACKAGE}" >/dev/null
for file in "${!filesToProcess[@]}" ; do
   if [ "${filesToProcess["${file}"]}" -eq 1 ] ; then
      if osc status "${file}" | grep -q "^?" ; then
         echo "Adding ${file} ..."
         osc add "${file}"
      else
         echo "Already in repository: ${file}"
      fi
   else
      echo "Removing ${file} ..."
      osc rm --force "${file}"
   fi
done
popd >/dev/null
