#!/bin/bash

set -e

# Check cache script
CHECK_CACHE_SCRIPT="check-cache.js"
#CHECK_CACHE_SCRIPT="testScript.ts"

while getopts "i:o:s:h" opt; do
    case "$opt" in
    i)
        INPUT_PATH=${OPTARG}
        ;;
    o)
        OUTPUT_PATH=${OPTARG}
        ;;
    s)
        ORGANIZATION=${OPTARG}
        ;;
    h)
        echo 'Use: ./check-cache-remote.sh -i <LOCAL_INPUT_PATH> -o <LOCAL_OUTPUT_PATH> -s <ORG_SLUG>'
        exit 0
        ;;
    esac
done

if [[ -z "${INPUT_PATH}" ]] || [[ -z "${OUTPUT_PATH}" ]] || [[ -z "${ORGANIZATION}" ]]; then
    echo "Use: ./check-cache-remote.sh -i <LOCAL_INPUT_PATH> -o <LOCAL_OUTPUT_PATH> -s <ORG_SLUG>"
    exit 1;
fi

# Init
BASH_CMD="cd /code/lib/utils && node $CHECK_CACHE_SCRIPT --org-slug ${ORGANIZATION} --files-file input.csv --output-file output.csv --workers 100 &"
echo "BASH_CMD: ${BASH_CMD}";

VIDEO_WORKERS_STR=$(kubectl get pods | grep mediaview-worker-video | cut -d " " -f 1)

# Arrays
SAVEIFS=$IFS                        # Save current IFS
IFS=$'\n'                           # Change IFS to new line
VIDEO_WORKERS=($VIDEO_WORKERS_STR)  # split workers string to array
INPUT_FILES=($(cat $INPUT_PATH))    # split inputFile to array
IFS=$SAVEIFS                        # Restore IFS

# Arrays lengths
WORKERS_COUNT=${#VIDEO_WORKERS[@]}
INPUT_COUNT=${#INPUT_FILES[@]}
BATCH_SIZE=$(($INPUT_COUNT / $WORKERS_COUNT))

# Log
echo "Running script with ${INPUT_COUNT} input files on ${#VIDEO_WORKERS[@]} workers. Batch size: ${BATCH_SIZE}"

# Cleanup files
rm -rf workers

# Start
mkdir workers
START_POS=0
for WORKER_POD in "${VIDEO_WORKERS[@]}"; do
    echo "Worker: ${WORKER_POD}"

    # Create local directory
    WORKER_LOCAL_PATH="workers/${WORKER_POD}"
    mkdir $WORKER_LOCAL_PATH

    # If this is the last batch
    SIZE=$BATCH_SIZE
    if [[ $WORKER_POD == ${VIDEO_WORKERS[${#VIDEO_WORKERS[@]}-1]} ]]; then
        SIZE=$(($BATCH_SIZE + $INPUT_COUNT - ($BATCH_SIZE * WORKERS_COUNT)))
    fi

    # Write input file
    printf "%s\n" "${INPUT_FILES[@]:$START_POS:$SIZE}" > "$WORKER_LOCAL_PATH/input.csv"

    # Copy files on pod
    kubectl cp "${CHECK_CACHE_SCRIPT}" "${WORKER_POD}:/code/lib/utils/${CHECK_CACHE_SCRIPT}"
    kubectl cp "${WORKER_LOCAL_PATH}/input.csv" "${WORKER_POD}:/code/lib/utils/input.csv"

    # Start jobs
    kubectl exec -it $WORKER_POD -- nohup bash -c "${BASH_CMD}"

    START_POS=$(($START_POS + $BATCH_SIZE))
done
ALL_WORKERS=("${VIDEO_WORKERS[@]}")

# Wait workers
STATUS="wip"
echo "Checking workers...";
while [[ $STATUS == "wip" ]]; do
    echo "------------------------------------------------------------------------------------------"
    echo "Checking workers ${#VIDEO_WORKERS[@]} workers..."
    echo "------------------------------------------------------------------------------------------"

    STATUS="done"
    ACTIVE_WORKERS=("${VIDEO_WORKERS[@]}")
    echo "${ACTIVE_WORKERS[@]}"
    for WORKER_POD in "${ACTIVE_WORKERS[@]}"; do
        WORKER_LOCAL_PATH="workers/${WORKER_POD}"
        if ! kubectl exec -it ${WORKER_POD} -- bash -c "pgrep -f ${CHECK_CACHE_SCRIPT}"; then
            if ! kubectl cp "${WORKER_POD}:/code/lib/utils/output.csv" "${WORKER_LOCAL_PATH}/output.csv"; then
                echo "ERROR $WORKER_POD"
            else
                echo "DONE $WORKER_POD..."
            fi
            VIDEO_WORKERS=($(echo "${VIDEO_WORKERS[@]/$WORKER_POD}" | tr -s " "))
        else
            STATUS="wip"
            echo "WIP $WORKER_POD..."
        fi
    done
    sleep 10s
done

# Concatenate results
echo "Concatenating results..."
echo "" > ${OUTPUT_PATH}
for WORKER_POD in "${ALL_WORKERS[@]}"; do
    WORKER_LOCAL_PATH="workers/${WORKER_POD}"
    if test -f "${WORKER_LOCAL_PATH}/output.csv"; then
        cat "${WORKER_LOCAL_PATH}/output.csv" >> ${OUTPUT_PATH}
    else
        echo "[ERROR] ${WORKER_POD}";
    fi
done

echo "DONE!"
