#!/bin/bash
# Cricket A/B Buffer Auto-Grabber - Continuous Polling Mode
# Polls Cricket every 5 seconds and downloads recordings from transfer_A.wav or transfer_B.wav
# Runs forever until stopped with Ctrl+C
#
# Usage: ./auto_grab_cricket_ab.sh
#        Press Ctrl+C to stop

## Script version marker
SCRIPT_VERSION="2025-12-19_1005_mDNS-timeout-fix"

CRICKET_HOST="${CRICKET_HOST:-cricket-m5tab5.local}"
API_KEY="water_detection_2025"
POLL_INTERVAL=5  # seconds between polls

## Test hostname connectivity (mDNS sometimes takes >5s; use larger max-time + IPv4 + retry)
echo "============================================"
echo "  CRICKET A/B BUFFER AUTO-GRABBER"
echo "============================================"
echo "Script:   $SCRIPT_VERSION"
echo "Start:    $(date '+%Y-%m-%d %H:%M:%S')"
echo "Host:     $CRICKET_HOST"
echo "============================================"
echo ""
echo "🔍 Testing Cricket connectivity: $CRICKET_HOST"

if ! curl -4 -s --connect-timeout 3 -m 12 --retry 2 --retry-delay 1 "http://$CRICKET_HOST/status" >/dev/null 2>&1; then
    echo "❌ Cannot reach Cricket at $CRICKET_HOST"
    echo ""
    echo "Possible issues:"
    echo "  1. Cricket is not powered on"
    echo "  2. Cricket is not connected to WiFi"
    echo "  3. Hostname not resolving (check mDNS/Bonjour)"
    echo "  4. Firewall blocking connections"
    echo ""
    echo "Tip: mDNS can be slow; try: curl -m 12 http://$CRICKET_HOST/status"
    exit 1
fi

echo "✅ Connected to Cricket at $CRICKET_HOST"
echo ""

## Auto-detect user and set save directory accordingly
## Each user has their own cricket_downloads folder in their project area
if [ -d "/Users/uhuman" ]; then
    SAVE_DIR="/Users/uhuman/PycharmProjects/projectWater_vs/cricket_AudioData_and_Models/projectWater/cricket_downloads"
    USER_NAME="uhuman"
elif [ -d "/Users/ming" ]; then
    SAVE_DIR="/Users/ming/Development/esp32/cricket/cricket_downloads"
    USER_NAME="ming"
else
    SAVE_DIR="$HOME/cricket_downloads"
    USER_NAME="$USER"
fi

## Color codes for pretty output
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
RED='\033[0;31m'
NC='\033[0m'  # No Color

echo ""
echo "User:     $USER_NAME"
echo "Cricket:  http://$CRICKET_HOST"
echo "Save to:  $SAVE_DIR"
echo "Interval: ${POLL_INTERVAL}s"
echo ""
echo "Press Ctrl+C to stop"
echo "============================================"
echo ""

## Create save directory if needed
mkdir -p "$SAVE_DIR"

## Statistics
TOTAL_DOWNLOADED=0
BUFFER_A_COUNT=0
BUFFER_B_COUNT=0
POLL_COUNT=0
START_TIME=$(date +%s)

## Trap Ctrl+C to show stats before exit
trap ctrl_c INT
function ctrl_c() {
    echo ""
    echo ""
    echo "============================================"
    echo "  SESSION SUMMARY"
    echo "============================================"
    echo "Script:      $SCRIPT_VERSION"
    DURATION=$(($(date +%s) - START_TIME))
    MINUTES=$((DURATION / 60))
    SECONDS=$((DURATION % 60))
    echo "Runtime:     ${MINUTES}m ${SECONDS}s"
    echo "Polls:       $POLL_COUNT"
    echo "Downloaded:  $TOTAL_DOWNLOADED files"
    echo "  Buffer A:  $BUFFER_A_COUNT"
    echo "  Buffer B:  $BUFFER_B_COUNT"
    echo "Saved to:    $SAVE_DIR"
    echo "============================================"
    echo ""
    exit 0
}

## Main polling loop
while true; do
    POLL_COUNT=$((POLL_COUNT + 1))
    TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')

    ## Get file list from Cricket (requires API key)
    ## Use forgiving timeouts because mDNS + WiFi jitter can exceed 3-5s
    FILES_JSON=$(curl -4 -s --connect-timeout 3 -m 12 --retry 1 --retry-delay 1 -H "X-API-Key: $API_KEY" "http://$CRICKET_HOST/list" 2>/dev/null)

    if [ -z "$FILES_JSON" ]; then
        echo -e "${RED}[$TIMESTAMP] Poll #$POLL_COUNT - Connection failed${NC}"
        sleep $POLL_INTERVAL
        continue
    fi

    ## Check for transfer_A.wav and transfer_B.wav
    BUFFER_STATUS=$(echo "$FILES_JSON" | python3 -c "
import sys, json
try:
    data  = json.load(sys.stdin)
    files = {f['name']: f for f in data.get('files', [])}

    has_a = 'transfer_A.wav' in files
    has_b = 'transfer_B.wav' in files

    if has_a and has_b:
        print('BOTH')
    elif has_a:
        print('A_ONLY')
    elif has_b:
        print('B_ONLY')
    else:
        print('NONE')
except:
    print('ERROR')
" 2>/dev/null)

    ## Download whichever buffer is ready (prefer A if both available)
    case "$BUFFER_STATUS" in
        BOTH)
            ## Both buffers ready - download A first
            echo -e "${GREEN}[$TIMESTAMP] Poll #$POLL_COUNT - Both buffers ready! Downloading A...${NC}"

            SAVE_FILE="$SAVE_DIR/cricket_bufferA_$(date +%Y%m%d_%H%M%S).wav"
            curl -4 -s --connect-timeout 3 -m 20 -H "X-API-Key: $API_KEY" "http://$CRICKET_HOST/download?file=transfer_A.wav" -o "$SAVE_FILE" 2>/dev/null

            if [ -f "$SAVE_FILE" ] && [ -s "$SAVE_FILE" ]; then
                SIZE=$(ls -lh "$SAVE_FILE" | awk '{print $5}')
                echo -e "${GREEN}  ✅ Buffer A saved ($SIZE)${NC}"

                ## Delete A from Cricket
                curl -4 -s --connect-timeout 3 -m 12 -X DELETE -H "X-API-Key: $API_KEY" "http://$CRICKET_HOST/file?file=transfer_A.wav" >/dev/null 2>&1

                TOTAL_DOWNLOADED=$((TOTAL_DOWNLOADED + 1))
                BUFFER_A_COUNT=$((BUFFER_A_COUNT + 1))
            else
                echo -e "${RED}  ❌ Buffer A download failed${NC}"
                rm -f "$SAVE_FILE"
            fi
            ;;

        A_ONLY)
            ## Only buffer A ready
            echo -e "${BLUE}[$TIMESTAMP] Poll #$POLL_COUNT - Buffer A ready, downloading...${NC}"

            SAVE_FILE="$SAVE_DIR/cricket_bufferA_$(date +%Y%m%d_%H%M%S).wav"
            curl -4 -s --connect-timeout 3 -m 20 -H "X-API-Key: $API_KEY" "http://$CRICKET_HOST/download?file=transfer_A.wav" -o "$SAVE_FILE" 2>/dev/null

            if [ -f "$SAVE_FILE" ] && [ -s "$SAVE_FILE" ]; then
                SIZE=$(ls -lh "$SAVE_FILE" | awk '{print $5}')
                echo -e "${BLUE}  ✅ Buffer A saved ($SIZE)${NC}"

                ## Delete A from Cricket
                curl -4 -s --connect-timeout 3 -m 12 -X DELETE -H "X-API-Key: $API_KEY" "http://$CRICKET_HOST/file?file=transfer_A.wav" >/dev/null 2>&1

                TOTAL_DOWNLOADED=$((TOTAL_DOWNLOADED + 1))
                BUFFER_A_COUNT=$((BUFFER_A_COUNT + 1))
            else
                echo -e "${RED}  ❌ Buffer A download failed${NC}"
                rm -f "$SAVE_FILE"
            fi
            ;;

        B_ONLY)
            ## Only buffer B ready
            echo -e "${BLUE}[$TIMESTAMP] Poll #$POLL_COUNT - Buffer B ready, downloading...${NC}"

            SAVE_FILE="$SAVE_DIR/cricket_bufferB_$(date +%Y%m%d_%H%M%S).wav"
            curl -4 -s --connect-timeout 3 -m 20 -H "X-API-Key: $API_KEY" "http://$CRICKET_HOST/download?file=transfer_B.wav" -o "$SAVE_FILE" 2>/dev/null

            if [ -f "$SAVE_FILE" ] && [ -s "$SAVE_FILE" ]; then
                SIZE=$(ls -lh "$SAVE_FILE" | awk '{print $5}')
                echo -e "${BLUE}  ✅ Buffer B saved ($SIZE)${NC}"

                ## Delete B from Cricket
                curl -4 -s --connect-timeout 3 -m 12 -X DELETE -H "X-API-Key: $API_KEY" "http://$CRICKET_HOST/file?file=transfer_B.wav" >/dev/null 2>&1

                TOTAL_DOWNLOADED=$((TOTAL_DOWNLOADED + 1))
                BUFFER_B_COUNT=$((BUFFER_B_COUNT + 1))
            else
                echo -e "${RED}  ❌ Buffer B download failed${NC}"
                rm -f "$SAVE_FILE"
            fi
            ;;

        NONE)
            ## No buffers ready - silent poll

	    ## Show every 2nd poll (10s) so we can see it's alive
	    if [ $((POLL_COUNT % 2)) -eq 0 ]; then
                echo "[$TIMESTAMP] Poll #$POLL_COUNT - Waiting... (Downloaded: $TOTAL_DOWNLOADED, A=$BUFFER_A_COUNT, B=$BUFFER_B_COUNT)"
            fi
            ;;

        ERROR)
            echo -e "${RED}[$TIMESTAMP] Poll #$POLL_COUNT - JSON parse error${NC}"
            ;;
    esac

    ## Wait before next poll
    sleep $POLL_INTERVAL
done