#!/usr/bin/env bash

# whatsmeow-update
#
# Copyright (c) 2023-2026 Kristofer Berggren
# All rights reserved.
#
# whatsmeow-update is distributed under the MIT license.

SYNCNAME="whatsmeow"
SYNCBRANCH="main"
SYNCURL="https://github.com/tulir/whatsmeow"
TARGET="lib/wmchat/go/ext/whatsmeow"
if [[ "${1}" == "-h" ]]; then
  echo "usage: ./utils/whatsmeow-update [commit]"
  exit 0
fi

exiterr()
{
  >&2 echo "${1}"
  exit 1
}

REPOROOT="$(git rev-parse --show-toplevel)"
if [[ "${REPOROOT}" == "" ]]; then
  exit 1
fi

cd "${REPOROOT}"
REPOPARENT=$(dirname "${REPOROOT}")
SYNCDIR="${REPOPARENT}/${SYNCNAME}"

# Clone / Update source repository
if [[ ! -d "${SYNCDIR}" ]]; then
  echo "Clone"
  git clone "${SYNCURL}" "${SYNCDIR}" || exiterr "git clone failed"
else
  echo "Update"
  pushd "${SYNCDIR}" > /dev/null || exiterr "pushd failed"
  [[ "$(${REPOROOT}/utils/cvc ur)" == "${SYNCURL}" ]] || exiterr "clone mismatch"
  git checkout ${SYNCBRANCH} || exiterr "git checkout ${SYNCBRANCH} failed"
  git pull --prune --rebase --autostash > /dev/null || exiterr "git pull failed"
  git clean -ffdx || exiterr "git clean failed"
  git diff --exit-code > /dev/null || exiterr "source dir has local changes"
  popd > /dev/null || exiterr "popd failed"
fi

# Checkout commit, if specified
if [[ "${1}" != "" ]]; then
  echo "Checkout"
  COMMIT="${1}"
  pushd "${SYNCDIR}" > /dev/null || exiterr "pushd failed"
  git checkout ${COMMIT} || exiterr "git checkout ${COMMIT} failed"
  NEWVERSION="$(git show -s --date=format:'%Y%m%d' --format=%cd)"
  SYNCCOMMIT="$(git show -s | head -1 | cut -d' ' -f2 | cut -c1-7)"
  popd > /dev/null || exiterr "popd failed"
else
  echo "Get date"
  pushd "${SYNCDIR}" > /dev/null || exiterr "pushd failed"
  NEWVERSION="$(git show -s --date=format:'%Y%m%d' --format=%cd)"
  SYNCCOMMIT="$(git show -s | head -1 | cut -d' ' -f2 | cut -c1-7)"
  popd > /dev/null || exiterr "popd failed"
fi

# Apply customizations to source repo
PATCHFILE="lib/wmchat/go/ext/nchat-whatsmeow.patch"
if [[ -f "${PATCHFILE}" ]]; then
  echo "Patch"
  pushd "${SYNCDIR}" > /dev/null || exiterr "pushd failed"
  ${REPOROOT}/utils/cvc apply "${REPOROOT}/${PATCHFILE}" || exiterr "patch apply failed - review ${PATCHFILE}"
  popd > /dev/null || exiterr "popd failed"
else
  exiterr "patch file not found: ${PATCHFILE}"
fi

# Sync patched repo to nchat
echo "Sync"
REPOTARGET="${REPOROOT}/${TARGET}"
pushd "${REPOTARGET}" > /dev/null || exiterr "pushd failed"
${REPOROOT}/utils/cvc sync "${SYNCDIR}" || exiterr "cvc sync failed"
popd > /dev/null || exiterr "popd failed"

# Restore source repo
pushd "${SYNCDIR}" > /dev/null || exiterr "pushd failed"
git checkout . || exiterr "source repo restore failed"
popd > /dev/null || exiterr "popd failed"

# Remove unwanted files
RMPATH="lib/wmchat/go/ext/whatsmeow/binary/proto/extract/yarn.lock"
if [[ -f "${RMPATH}" ]]; then
  git restore --staged ${RMPATH} || exiterr "git restore ${RMPATH} failed"
  rm ${RMPATH} || exiterr "rm ${RMPATH} failed"
fi

# Update whatsmeow date
[[ "$(uname)" == "Linux" ]] && SEDCMD="sed" || SEDCMD="gsed"
${SEDCMD} -E -i -e "s/^var whatsmeowDate int.*$/var whatsmeowDate int = ${NEWVERSION}/g" lib/wmchat/go/gowm.go

# Perform go mod tidy
pushd lib/wmchat/go > /dev/null && go mod tidy && popd > /dev/null

# Complete
echo "Done"
echo "Proceed to bump project version and build:"
echo "./make.sh bump"
echo "./make.sh doc"
echo ""
echo "If succesful proceed to commit the changes:"
echo "git add -u"
echo "git commit -m \"update whatsmeow to ${NEWVERSION} from tulir/whatsmeow@${SYNCCOMMIT}\""
echo "git push"

exit 0
