#!/usr/bin/env bash
set -Eeuo pipefail

sha=${1:-}
[[ $sha =~ ^[0-9a-f]{40}$ ]] || { echo "invalid commit" >&2; exit 2; }
base=/home/audax-runtime
source=$base/repos/api-clientes
releases=$base/releases/api-clientes
current=$base/apps/api-clientes/current
shared=$base/apps/api-clientes/shared
exec 9>/var/lock/audax-api-clientes-deploy.lock
flock -n 9 || { echo "another deploy is running" >&2; exit 3; }

mkdir -p "$base/repos" "$releases" "$(dirname "$current")" "$shared"
if [[ ! -d $source/.git ]]; then git clone --filter=blob:none git@gitlab.com:vendedor/api-clientes.git "$source"; fi
git -C "$source" fetch --prune origin main
git -C "$source" merge-base --is-ancestor "$sha" origin/main
release=$releases/$sha
if [[ ! -d $release ]]; then git -C "$source" worktree add --detach "$release" "$sha"; fi

ln -sfn "$shared/.env" "$release/.env"
chgrp www-data "$shared/.env" && chmod 640 "$shared/.env"
mkdir -p "$shared/xlsx" "$shared/vendor"
rm -rf "$release/goals/xlsx" && ln -s "$shared/xlsx" "$release/goals/xlsx"
rm -rf "$release/goals/set_goal_by_file/vendor" && ln -s "$shared/vendor" "$release/goals/set_goal_by_file/vendor"
find "$release" -path "$release/goals/set_goal_by_file/vendor" -prune -o -type f -name '*.php' -exec php -l '{}' ';'
php "$release/tests/document_key_filter_test.php"
php "$release/tests/net_sales_calculator_test.php"
php "$release/tests/premia_api_support_test.php"
php "$release/tests/premia_orders_query_test.php"
php "$release/tests/redistribute_goals_test.php"

previous=$(readlink -f "$current" 2>/dev/null || true)
ln -sfn "$release" "${current}.next" && mv -Tf "${current}.next" "$current"
ln -sfn "$current" /var/www/html.next && mv -Tf /var/www/html.next /var/www/html
if ! curl --fail --silent --show-error --retry 5 --retry-delay 2 --max-time 10 http://127.0.0.1/health/ >/dev/null; then
  if [[ -n $previous && -d $previous ]]; then
    ln -sfn "$previous" "${current}.rollback" && mv -Tf "${current}.rollback" "$current"
    ln -sfn "$current" /var/www/html.rollback && mv -Tf /var/www/html.rollback /var/www/html
  fi
  exit 1
fi
find "$releases" -mindepth 1 -maxdepth 1 -type d -printf '%T@ %p\n' | sort -nr | tail -n +6 | cut -d' ' -f2- | while read -r old; do
  [[ $old == "$(readlink -f "$current")" ]] || git -C "$source" worktree remove --force "$old" || true
done
echo "deployed api-clientes $sha"
