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

cd /var/www/html

SLEEP_SECONDS="${JOB_WORKER_SLEEP:-15}"
ERP_FACTURAS_LIMIT="${JOB_WORKER_ERP_FACTURAS_LIMIT:-5}"
ERP_FACTURAS_MAX_CHUNKS="${JOB_WORKER_ERP_FACTURAS_MAX_CHUNKS:-25}"
VOUCHER_FILES_LIMIT="${JOB_WORKER_VOUCHER_FILES_LIMIT:-10}"
CLOUD_SYNC_LIMIT="${JOB_WORKER_CLOUD_SYNC_LIMIT:-25}"

echo "[job-worker] Starting async job worker"
echo "[job-worker] APP_ENV=${APP_ENV:-}"
echo "[job-worker] sleep=${SLEEP_SECONDS}s erp_limit=${ERP_FACTURAS_LIMIT} erp_max_chunks=${ERP_FACTURAS_MAX_CHUNKS} voucher_limit=${VOUCHER_FILES_LIMIT} cloud_sync_limit=${CLOUD_SYNC_LIMIT}"

run_as_www_data() {
    if [ "$(id -u)" = "0" ]; then
        su -s /bin/sh www-data -c "$*"
        return
    fi

    sh -lc "$*"
}

ensure_worker_runtime_dirs() {
    echo "[job-worker] Ensuring writable runtime dirs"
    mkdir -p \
        var/cache \
        var/cache/prod \
        var/cache/prod/doctrine \
        var/cache/prod/doctrine/orm \
        var/cache/prod/doctrine/orm/Proxies \
        var/log \
        public/uploads \
        public/uploads/adjuntos \
        public/generated \
        public/generated/vouchers

    if [ "$(id -u)" = "0" ]; then
        chown -R www-data:www-data var/cache var/log public/uploads public/generated
    fi
    chmod -R ug+rwX var/cache var/log public/uploads public/generated

    if ! run_as_www_data "test -w var/cache/prod/doctrine/orm/Proxies"; then
        echo "[job-worker] ERROR: var/cache/prod/doctrine/orm/Proxies is not writable by www-data."
        exit 1
    fi

    echo "[job-worker] Proxies writable by www-data"
}

ensure_worker_runtime_dirs

echo "[job-worker] Entering loop"
while true; do
    run_as_www_data "php bin/console app:erp:sync-facturas-jobs:run --limit=${ERP_FACTURAS_LIMIT} --max-chunks=${ERP_FACTURAS_MAX_CHUNKS} --no-ansi" || echo "[job-worker] app:erp:sync-facturas-jobs:run failed this cycle"
    run_as_www_data "php bin/console app:voucher-files:run --limit=${VOUCHER_FILES_LIMIT} --no-ansi" || echo "[job-worker] app:voucher-files:run failed this cycle"
    run_as_www_data "php bin/console app:cloud-sync:run --limit=${CLOUD_SYNC_LIMIT} --no-ansi" || echo "[job-worker] app:cloud-sync:run failed this cycle"

    sleep "${SLEEP_SECONDS}"
done
