#!/usr/bin/env bash

set -euo pipefail

. "$(dirname "${BASH_SOURCE[0]}")/../../scripts/lib.sh"

# Create S3 dirs
step mkdir -p /srv/philomena/priv/static/system/images/thumbs
step mkdir -p /srv/philomena/priv/s3/philomena
step ln -sf /srv/philomena/priv/static/system/images/thumbs /srv/philomena/priv/s3/philomena/images
step ln -sf /srv/philomena/priv/static/system/images /srv/philomena/priv/s3/philomena/adverts
step ln -sf /srv/philomena/priv/static/system/images /srv/philomena/priv/s3/philomena/avatars
step ln -sf /srv/philomena/priv/static/system/images /srv/philomena/priv/s3/philomena/badges
step ln -sf /srv/philomena/priv/static/system/images /srv/philomena/priv/s3/philomena/tags

# For compatibility with musl libc
export CARGO_FEATURE_DISABLE_INITIAL_EXEC_TLS=1
export CARGO_HOME=/srv/philomena/.cargo

background() {
  # Log the execution with (bg-jobs) prefix to differentiate it from the main process
  export TASK="bg-jobs"

  while :; do
    step mix run -e 'Philomena.Release.update_channels()' > /dev/null
    step mix run -e 'Philomena.Release.verify_artist_links()' > /dev/null
    step mix run -e 'Philomena.Release.update_stats()' > /dev/null
    step mix run -e 'Philomena.Release.clean_moderation_logs()' > /dev/null
    step mix run -e 'Philomena.Release.generate_autocomplete()' > /dev/null

    sleep 300
  done
}

# Always install assets
(
  step cd /srv/philomena/assets
  step npm install
)

# Always install mix dependencies
(
  step cd /srv/philomena
  step mix deps.get
)

# Sleep to allow OpenSearch to finish initializing
# if it's not done doing whatever it does yet
info "Waiting for OpenSearch"

until step wget --no-check-certificate -qO - http://opensearch:9200; do
  sleep 2
done

# Try to create the database if it doesn't exist yet
if step createdb -h postgres -U postgres philomena_dev; then
  step mix ecto.setup_dev
  step mix reindex_all
fi

# Explicitly compile deps to avoid racing
step mix compile

# Run background jobs
background &

info "Starting the server"

# Run the application
START_WORKER=true exec mix phx.server