#!/usr/bin/env bash
set -u
set -e
# Default values for options
START=0
LIMIT=500
DELAY=10
ADDITIONAL_SQL="WHERE ! deleted"
JOB_PER_CORE=1
TABLE=''
DRYRUN=''

# Function to display usage instructions
function usage {
    echo "Usage: $0 <TABLE> [-s <START>] [-l <LIMIT>] [-d <DELAY>] [-j <JOB_PER_CORE>] [--additional-sql <ADDITIONAL_SQL>] [--dryrun]"
    echo "Options:"
    echo "  -s, --start        Start index (default: 0)"
    echo "  -l, --limit        Limit the number of records (default: 500)"
    echo "  -d, --delay        Delay between parallel jobs in seconds (default: 10)"
    echo "  -j, --jobs         Number of parallel jobs per core (default: 1)"
    echo "      --additional-sql Additional SQL condition (default: 'WHERE ! deleted')"
    echo "      --dryrun       Dry run the indexing"
    echo "      --help         Display this help message"
    exit 1
}
# Parse options
while [[ $# -gt 0 ]]; do
    case "$1" in
    -s | --start)
        START="$2"
        shift 2
        ;;
    -l | --limit)
        LIMIT="$2"
        shift 2
        ;;
    -d | --delay)
        DELAY="$2"
        shift 2
        ;;
    -j | --jobs)
        JOB_PER_CORE="$2"
        shift 2
        ;;
    --additional-sql)
        ADDITIONAL_SQL="$2"
        shift 2
        ;;
    --dryrun)
        DRYRUN="--dryrun"
        shift
        ;;
    --help)
        usage
        ;;
    *)
        TABLE="$1"
        shift
        ;;
    esac
done

if [[ -z "${TABLE}" ]]; then
    usage
fi

mkdir -p ~/.parallel
touch ~/.parallel/will-cite

MAX=$(mysql -u "${DB_USER}" -p"${DB_PASSWORD}" -h "${DB_HOST}" "${DB_NAME}" -B -N -e "SELECT count(*) FROM ${TABLE} ${ADDITIONAL_SQL}")

export SHELL=$(type -p bash)
function index {
    time nice -n 19 indexRecordsFromTable "$1" --limit="$2" --offset="$3"
}
export -f index
JOBS=$(($JOB_PER_CORE * $(nproc)))
seq ${START} ${LIMIT} $MAX | parallel ${DRYRUN} --jobs $JOBS --progress --eta --delay ${DELAY} --results /tmp/${TABLE} --line-buffer --tag --joblog /tmp/${TABLE}.log index ${TABLE} ${LIMIT} {}
