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

# -------------------------------------------------------------------
# Logging setup
# -------------------------------------------------------------------
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
LOG_FILE="$SCRIPT_DIR/NR_LogFileToS3_$(date '+%Y%m%d_%H%M%S').log"

exec >>"$LOG_FILE" 2>&1

log() {
    printf "%s  %s\n" "$(date '+%Y-%m-%d %H:%M:%S')" "$*"
}

AWS_BIN=$(command -v aws)

# -------------------------------------------------------------------
# Operator input
# -------------------------------------------------------------------
[[ $# -eq 1 ]] || { echo "Usage: $0 <operator>"; exit 1; }

OPERATOR="${1,,}"

[[ "$OPERATOR" =~ ^[a-z]{3}$ ]] || {
    echo "Operator must be 3 letters"
    exit 1
}

# -------------------------------------------------------------------
# Config
# -------------------------------------------------------------------
BASE_DIR="/opt/device/P20_logs"
MINUTES=15000
PARALLEL_UPLOADS=50
AUTO_DETECT_DEVICES=true

ACCOUNT_ID=$($AWS_BIN sts get-caller-identity \
    --query Account --output text 2>/dev/null || true)

[[ -n "$ACCOUNT_ID" ]] || {
    log "ERROR: AWS authentication failed"
    exit 1
}

REGION="ap-southeast-1"
BUCKET="${ACCOUNT_ID}-${REGION}-onecell-files"

log "Script Started"
log "Bucket: $BUCKET"
log "Parallel uploads: $PARALLEL_UPLOADS"

# -------------------------------------------------------------------
# Detect devices
# -------------------------------------------------------------------
DEVICE_IDS=()

if $AUTO_DETECT_DEVICES; then
    mapfile -t DEVICE_IDS < <(
        find "$BASE_DIR/$OPERATOR" \
            -mindepth 1 -maxdepth 1 -type d -printf "%f\n" 2>/dev/null
    )
fi

# -------------------------------------------------------------------
# Upload function
# -------------------------------------------------------------------
upload_file() {

    local FILE="$1"
    local BASENAME=${FILE##*/}

    if [[ $BASENAME =~ ([0-9]{8}) ]]; then
        local DATE="${BASH_REMATCH[1]}"
    else
        log "Skipping (no date): $FILE"
        return
    fi

    local DEST="s3://$BUCKET/onecell/$OPERATOR/NR/logs/$DATE/"

    if "$AWS_BIN" s3 cp "$FILE" "$DEST" --only-show-errors; then
        rm -f "$FILE"
        log "Uploaded & deleted: $BASENAME"
    else
        log "Upload failed: $FILE"
    fi
}

# -------------------------------------------------------------------
# Simple Bash Worker Pool (NO xargs)
# -------------------------------------------------------------------
run_parallel() {
    local running_jobs

    while (( $(jobs -rp | wc -l) >= PARALLEL_UPLOADS )); do
        sleep 0.2
    done

    upload_file "$1" &
}

# -------------------------------------------------------------------
# Process devices
# -------------------------------------------------------------------
for DEV in "${DEVICE_IDS[@]}"; do

    FILES_PATH="$BASE_DIR/$OPERATOR/$DEV"

    [[ -d "$FILES_PATH" ]] || {
        log "Missing directory: $FILES_PATH"
        continue
    }

    log "-------------------------------------------"
    log "Scanning: $FILES_PATH"

    while IFS= read -r -d '' FILE; do
        run_parallel "$FILE"
    done < <(
        find "$FILES_PATH" \
            -maxdepth 1 -type f -mmin -"$MINUTES" -print0 2>/dev/null
    )

    # wait for this device batch
    wait
done

log "-------------------------------------------"
log "All eligible NR files processed successfully."
