#!/usr/bin/env bash
#
# Setup the Python environment to build the Landing Page.
# To be sourced from other scripts.
#

# Parameters
DIRNAME="`dirname $0`"
BASEPATH="$DIRNAME/../"
#VENV="${VENV:-$BASEPATH/venv}"
VENV="${VENV:-$HOME/.virtualenvs/onion-launchpad}"
PYTHON="${PYTHON:-python3}"

# Environment file support
if [ -e "$BASEPATH/.env" ]; then
  source "$BASEPATH/.env"
fi

# Export environment variables
export TRANSLATION_BRANCH="${TRANSLATION_BRANCH:-onion-launchpad}"
export LEKTOR_FOREGROUND_COLOR="${LEKTOR_FOREGROUND_COLOR:-CF5C00}"
export LEKTOR_BACKGROUND_COLOR="${LEKTOR_BACKGROUND_COLOR:-EA6903}"
export LEKTOR_BUTTON_COLOR="${LEKTOR_BUTTON_COLOR:-EA6903}"
export LEKTOR_ONION_URL_LOCK_FILTER="${LEKTOR_ONION_URL_LOCK_FILTER:-CF5C00}"
export LEKTOR_ONION_URL="${LEKTOR_ONION_URL:-https://abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz2345.onion}"
export LEKTOR_SERVICE_NAME="${LEKTOR_SERVICE_NAME:-Onion Launchpad}"
export LEKTOR_SERVICE_URL="${LEKTOR_SERVICE_URL:-https://service-url.website/}"
export LEKTOR_FAVICON="${LEKTOR_FAVICON:-/favicon-default-32.png}"
export LEKTOR_LOGO_PATH="${LEKTOR_LOGO_PATH:-/onion-launchpad-logo-default-1.svg}"
export LEKTOR_ASSET_REPOSITORY_URL="${LEKTOR_ASSET_REPOSITORY_URL:-}"
export LEKTOR_DEFAULT_LANGUAGE="${LEKTOR_DEFAULT_LANGUAGE:-en}"
export LEKTOR_AVAILABLE_LANGUAGES="${LEKTOR_AVAILABLE_LANGUAGES:-}"
export LEKTOR_ANALYTICS="${LEKTOR_ANALYTICS:-}"
export LEKTOR_ANALYTICS_SDK="${LEKTOR_ANALYTICS_SDK:-}"
export LEKTOR_ANALYTICS_BACKEND="${LEKTOR_ANALYTICS_BACKEND:-}"
export LEKTOR_ANALYTICS_SITE_ID="${LEKTOR_ANALYTICS_SITE_ID:-}"
export LEKTOR_ANALYTICS_LINK_TRACKING="${LEKTOR_ANALYTICS_LINK_TRACKING:-}"
export LEKTOR_ANALYTICS_BROWSER_DETECTION="${LEKTOR_ANALYTICS_BROWSER_DETECTION:-}"
export LEKTOR_ANALYTICS_PRIVACY_POLICY_CONTACT="${LEKTOR_ANALYTICS_PRIVACY_POLICY_CONTACT:-}"
export LEKTOR_ANALYTICS_BACKGROUND_COLOR="${LEKTOR_ANALYTICS_BACKGROUND_COLOR:-FCEDE1}"

# Set safe directory
# See https://gitlab.torproject.org/tpo/onion-services/onion-launchpad/-/issues/74
if [ "$ONION_LAUNCHPAD_SET_SAFE_DIRECTORY" == "1" ]; then
  echo "Ensuring $(pwd) is listed as a Git safe directory..."
  git config --global --add safe.directory "$(pwd)"
fi

# Include the lego repository
if [ ! -d "lego" ]; then
  git clone --depth 1 https://gitlab.torproject.org/tpo/web/lego.git lego || exit 1
else
  git submodule update --init --recursive --depth 1 || exit 1
fi

# Install dependencies
# In the future we may phase away from venv,
# see https://gitlab.torproject.org/tpo/tpa/ci-templates/-/commit/9850b8deb1d5813a5d6e25d2d0ffb7684ac42bf0
mkdir -p "$(dirname "$VENV")"
$PYTHON -m venv $VENV || exit 1
source $VENV/bin/activate || exit 1

# Ensure setuptools and pip are up-to-date, avoiding issues such as
# https://stackoverflow.com/questions/77364550/attributeerror-module-pkgutil-has-no-attribute-impimporter-did-you-mean
# https://github.com/pypa/pip/issues/12179
$PYTHON -m ensurepip   --upgrade
$PYTHON -m pip install --upgrade setuptools
$PYTHON -m pip install --upgrade pip

$PYTHON -m pip install --require-hashes -r lego/lektor-requirements.txt || exit 1
$PYTHON -m pip install --require-hashes -r requirements.txt || exit 1

# Ensure we have an extended PATH if lektor is installed locally
#if [ -e "$HOME/.local/bin/lektor" ]; then
#  export PATH="$PATH:$HOME/.local/bin"
#fi

# Check for Lektor
#if ! which lektor &> /dev/null; then
#  echo "Please install lektor"
#  exit 1
#fi

# Ensure a fresh lektor cache
rm -rf ~/.cache/lektor

# Ensure all plugins are reinstalled
#lektor plugins reinstall

# Ensure we're in the root repository folder
cd "$BASEPATH" &> /dev/null

# Cleanup
echo "Cleaning up previous builds..."
find content -type f -name 'contents+*.lr' -delete
rm -rf public
#lektor clean --yes --output-path public || exit 1

# Ensure a fresh i18n repository in place
if [ ! -d "i18n" ]; then
  git clone --depth 1 --single-branch --branch=${TRANSLATION_BRANCH} https://gitlab.torproject.org/tpo/translation.git i18n || exit 1
else
  rm -rf i18n/_compiled && rm -f i18n/contents+*
  cd i18n &> /dev/null && git restore . && git checkout -q ${TRANSLATION_BRANCH} && git pull --ff origin ${TRANSLATION_BRANCH} || exit 1
  cd ..
fi

# Ensure any per-language service name environment variable is exported
for lang_code in `ls -1 i18n/contents+* | grep -v '~' | sed -e 's|i18n/contents+||' -e 's|.po$||' | xargs | tr '-' '_' | tr '[:lower:]' '[:upper:]'`; do
  variable_name="LEKTOR_SERVICE_NAME_$lang_code"

  if [ ! -z "${!variable_name}" ]; then
    echo "Exporting ${variable_name} with value ${!variable_name}..."
    export $variable_name="${!variable_name}"
  fi
done

# Include an asset repository if available
if [ ! -z "$LEKTOR_ASSET_REPOSITORY_URL" ]; then
  if [ ! -d "assets/custom" ]; then
    git clone --depth 1 "$LEKTOR_ASSET_REPOSITORY_URL" assets/custom || exit 1
  else
    cd assets/custom &> /dev/null && git restore . && git checkout -q main && git pull --ff origin main || exit 1
    cd ../..
  fi
fi

# Print the env, useful for debugging
echo "Current environment:"
env | sort
