#!/bin/bash

function flush_dns_cache() {
    case "$(uname -s)" in
        Darwin)
            # macOS
            echo "Flushing DNS cache on macOS..."
            sudo dscacheutil -flushcache
            sudo killall -HUP mDNSResponder
            ;;
        Linux)
            # Linux
            echo "Flushing DNS cache on Linux..."
            sudo systemd-resolve --flush-caches
            ;;
        CYGWIN*|MINGW32*|MSYS*|MINGW*)
            # Windows
            echo "Flushing DNS cache on Windows..."
            ipconfig /flushdns
            ;;
        *)
            echo "Unsupported OS. DNS cache flush not performed."
            ;;
    esac
}

function check_dns_cache {
  GIT_HOST=$(terminus connection:info ${SITE_ID}.${ENV_ID} --field=git_host)
  CACHED_IP=$(dig +short A $GIT_HOST)
  UNCACHED_IP=$(dig +short $GIT_HOST @8.8.8.8)
  echo "Checking for stale DNS cache for $GIT_HOST"
  # Check if CACHED_IP does not equal UNCACHED_IP
  if [ "$CACHED_IP" != "$UNCACHED_IP" ]; then
    echo "IP address has changed, flushing DNS cache"
    flush_dns_cache
  else
    echo "IP address has not changed, no need to flush DNS cache"
  fi
}

function push_code {
  # Example: if git clone fails, check for stale DNS cache and retry
  MAX_RETRIES=5
  RETRY_COUNT=0
  while [ $RETRY_COUNT -lt $MAX_RETRIES ]; do
    git clone --branch $ENV_ID --depth 2 ${{ env.UPSTREAM_GIT_URL }}
    if [ $? -eq 0 ]; then
      break
    else
      RETRY_COUNT=$((RETRY_COUNT+1))
      check_dns_cache && echo "Retrying git clone command..."
    fi
  done
  # Continue existing code

  # Example: if git push fails, check for stale DNS cache and retry
  MAX_RETRIES=5
  RETRY_COUNT=0
  while [ $RETRY_COUNT -lt $MAX_RETRIES ]; do
    git push pantheon $BRANCH -vv
    if [ $? -eq 0 ]; then
      break
    else
      RETRY_COUNT=$((RETRY_COUNT+1))
      check_dns_cache && echo "Retrying git push command..."
    fi
  done
}

push_code
