#!/bin/bash

#  CURSE_URL_BASE used in manifest downloads below
CURSE_URL_BASE=${CURSE_URL_BASE:-https://minecraft.curseforge.com/projects}

# Remove old mods/plugins
if [ "$REMOVE_OLD_MODS" = "TRUE" ]; then
  if [ "$TYPE" = "SPIGOT" ]; then
    rm -rf /data/plugins/*
  else
    rm -rf /data/mods/*
  fi
fi

# If supplied with a URL for a modpack (simple zip of jars), download it and unpack
if [[ "$MODPACK" ]]; then
EFFECTIVE_MODPACK_URL=$(curl -Ls -o /dev/null -w %{url_effective} $MODPACK)
case "X$EFFECTIVE_MODPACK_URL" in
  X[Hh][Tt][Tt][Pp]*.zip)
    echo "Downloading mod/plugin pack via HTTP"
    echo "  from $EFFECTIVE_MODPACK_URL ..."
    if ! curl -sSL -o /tmp/modpack.zip "$EFFECTIVE_MODPACK_URL"; then
      echo "ERROR: failed to download from $EFFECTIVE_MODPACK_URL"
      exit 2
    fi

    if [ "$TYPE" = "SPIGOT" ]; then
      mkdir -p /data/plugins
      if ! unzip -o -d /data/plugins /tmp/modpack.zip; then
        echo "ERROR: failed to unzip the modpack from $EFFECTIVE_MODPACK_URL"
      fi
    else
      mkdir -p /data/mods
      if ! unzip -o -d /data/mods /tmp/modpack.zip; then
        echo "ERROR: failed to unzip the modpack from $EFFECTIVE_MODPACK_URL"
      fi
    fi
    rm -f /tmp/modpack.zip
    ;;
  *)
    echo "Invalid URL given for modpack: Must be HTTP or HTTPS and a ZIP file"
    ;;
esac
fi

# If supplied with a URL for a plugin download it.
if [[ "$MODS" ]]; then
for i in ${MODS//,/ }
do
  EFFECTIVE_MOD_URL=$(curl -Ls -o /dev/null -w %{url_effective} $i)
  case "X$EFFECTIVE_MOD_URL" in
    X[Hh][Tt][Tt][Pp]*.jar)
      echo "Downloading mod/plugin via HTTP"
      echo "  from $EFFECTIVE_MOD_URL ..."
      if ! curl -sSL -o /tmp/${EFFECTIVE_MOD_URL##*/} $EFFECTIVE_MOD_URL; then
        echo "ERROR: failed to download from $EFFECTIVE_MOD_URL to /tmp/${EFFECTIVE_MOD_URL##*/}"
        exit 2
      fi

      if [ "$TYPE" = "SPIGOT" ]; then
        mkdir -p /data/plugins
        mv /tmp/${EFFECTIVE_MOD_URL##*/} /data/plugins/${EFFECTIVE_MOD_URL##*/}
      else
        mkdir -p /data/mods
        mv /tmp/${EFFECTIVE_MOD_URL##*/} /data/mods/${EFFECTIVE_MOD_URL##*/}
      fi
      rm -f /tmp/${EFFECTIVE_MOD_URL##*/}
      ;;
    *)
      echo "Invalid URL given for modpack: Must be HTTP or HTTPS and a JAR file"
      ;;
  esac
done
fi

if [[ "$MANIFEST" ]]; then
EFFECTIVE_MANIFEST_URL=$(curl -Ls -o /dev/null -w %{url_effective} $MANIFEST)
case "X$EFFECTIVE_MANIFEST_URL" in
  X*.json)
    if [ -f "${EFFECTIVE_MANIFEST_URL}" ]; then
      MOD_DIR=${FTB_BASE_DIR:-/data}/mods
      if [ ! -d "$MOD_DIR" ]
      then
        echo "Creating mods dir $MOD_DIR"
        mkdir -p "$MOD_DIR"
      fi
      echo "Starting manifest download..."
      cat "${EFFECTIVE_MANIFEST_URL}" | jq -r '.files[] | (.projectID|tostring) + " " + (.fileID|tostring)'| while read -r p f
      do
        if [ ! -f $MOD_DIR/${p}_${f}.jar ]
        then
          redirect_url="$(curl -Ls -o /dev/null -w %{url_effective} ${CURSE_URL_BASE}/${p})"
          url="$redirect_url/download/${f}/file"
          echo Downloading curseforge mod $url
          #  Manifest usually doesn't have mod names. Using id should be fine, tho
          curl -sSL "${url}" -o $MOD_DIR/${p}_${f}.jar
        fi
      done
    else
      echo "Could not find manifest file, unsufficient privs, or malformed path."
    fi
    ;;
  *)
    echo "Invalid manifest file for modpack. Please make sure it is a .json file."
    ;;
esac
fi

exec /start-finalSetup03Modconfig $@
