#!/bin/bash

# Configuration
DATA_DIR="$HOME/scrape_data"
mkdir -p "$DATA_DIR"

# Parse arguments
JSON_MODE=false
if [ "$1" == "-j" ]; then
    JSON_MODE=true
    shift
fi

URL=$1
SELECTOR=$2
MAPPING_OR_FILTER=$3

if [ -z "$URL" ] || [ -z "$SELECTOR" ] || [ -z "$MAPPING_OR_FILTER" ]; then
    echo "Usage: scrape [-j] <url> <selector> <mapping_or_jq_filter>"
    exit 1
fi

# 1. Determine Cache Path
DOMAIN=$(echo "$URL" | awk -F[/:] '{print $4}')
DATE_STR=$(date +%y%m%d)
CACHE_DIR="$DATA_DIR/$DOMAIN"
CACHE_FILE="$CACHE_DIR/$DATE_STR.json"

mkdir -p "$CACHE_DIR"

# 2. Check Cache
if [ -f "$CACHE_FILE" ]; then
    cat "$CACHE_FILE"
    exit 0
fi

# 3. Perform Scrape (if not cached)
TEMP_OUT=$(mktemp)

if [ "$JSON_MODE" = true ]; then
    curl -s -L -A "Mozilla/5.0" "$URL" | htmlq "$SELECTOR" --text | jq "$MAPPING_OR_FILTER" | jq -s . > "$TEMP_OUT"
else
    # Standard Mode Logic
    HTML_FILE=$(mktemp)
    curl -s -L -A "Mozilla/5.0" "$URL" > "$HTML_FILE"
    
    IFS=',' read -ra ADDR <<< "$MAPPING_OR_FILTER"
    FIELDS=()
    TEMP_FILES=()
    for i in "${ADDR[@]}"; do
        KEY="${i%%:*}"; VAL="${i#*:}"
        FIELDS+=("$KEY"); TF=$(mktemp); TEMP_FILES+=("$TF")
        if [[ "$VAL" == @* ]]; then
            htmlq "$SELECTOR" --attribute "${VAL#@}" < "$HTML_FILE" > "$TF"
        else
            htmlq "$SELECTOR $VAL" --text < "$HTML_FILE" > "$TF"
        fi
    done

    paste "${TEMP_FILES[@]}" | while IFS=$'\t' read -r -a values; do
        if [ -z "${values[0]}" ]; then continue; fi
        JQ_ARGS=(); JQ_OBJ="{"
        for j in "${!FIELDS[@]}"; do
            KEY="${FIELDS[$j]}"
            JQ_ARGS+=("--arg" "$KEY" "${values[$j]}")
            JQ_OBJ="$JQ_OBJ\"$KEY\": \$$KEY,"
        done
        jq -n "${JQ_ARGS[@]}" "${JQ_OBJ%,}}"
    done | jq -s . > "$TEMP_OUT"
    
    rm "$HTML_FILE" "${TEMP_FILES[@]}"
fi

# 4. Save to Cache and Output (only cache non-empty results)
RESULT_COUNT=$(jq 'length' "$TEMP_OUT" 2>/dev/null || echo 0)
if [ -s "$TEMP_OUT" ] && [ "$RESULT_COUNT" -gt 0 ]; then
    mv "$TEMP_OUT" "$CACHE_FILE"
    cat "$CACHE_FILE"
else
    echo "Error: Scrape produced no data" >&2
    rm -f "$TEMP_OUT"
    exit 1
fi
