#!/bin/bash
set -e

VCS_TYPE=${1:-git}
AGENT_COUNT=${AGENT_COUNT:-10}
COMMIT_COUNT=${COMMIT_COUNT:-100}
RESULTS_DIR="/results/${VCS_TYPE}/concurrent"

mkdir -p "${RESULTS_DIR}"

echo "=== Concurrent Commit Storm Benchmark ==="
echo "VCS: ${VCS_TYPE}"
echo "Agents: ${AGENT_COUNT}"
echo "Commits per agent: ${COMMIT_COUNT}"
echo ""

# Initialize timing CSV
echo "agent_id,commit_id,duration_ms,timestamp,success" > "${RESULTS_DIR}/timings.csv"

# Function to simulate agent committing
agent_worker() {
    local agent_id=$1
    local vcs_type=$2
    local commit_count=$3

    echo "[Agent-${agent_id}] Starting work..."

    for i in $(seq 1 $commit_count); do
        start_time=$(date +%s%3N)

        # Create unique file
        file_path="/repos/test-repo/src/agent_${agent_id}_file_${i}.rs"
        echo "// Generated by agent ${agent_id}, commit ${i}" > "$file_path"
        echo "pub fn agent_${agent_id}_function_${i}() {}" >> "$file_path"

        # Commit based on VCS type
        if [ "$vcs_type" = "git" ]; then
            cd /repos/test-repo
            git add "$file_path" 2>&1
            if git commit -m "Agent ${agent_id}: Commit ${i}" 2>&1; then
                success=true
            else
                success=false
            fi
        else
            # Jujutsu commit
            if [ "${JJ_WORKSPACE_MODE}" = "shared-log" ]; then
                cd "/repos/workspaces/agent-${agent_id}"
            else
                cd /repos/test-repo
            fi

            if jj describe -m "Agent ${agent_id}: Commit ${i}" 2>&1; then
                success=true
            else
                success=false
            fi
        fi

        end_time=$(date +%s%3N)
        duration=$((end_time - start_time))

        # Log timing
        echo "${agent_id},${i},${duration},$(date +%s),${success}" >> "${RESULTS_DIR}/timings.csv"

        # Small delay to simulate realistic work
        sleep 0.1
    done

    echo "[Agent-${agent_id}] Completed ${commit_count} commits"
}

# Launch agents in parallel
echo "Launching ${AGENT_COUNT} agents..."
start_benchmark=$(date +%s)

for agent_id in $(seq 1 $AGENT_COUNT); do
    agent_worker "$agent_id" "$VCS_TYPE" "$COMMIT_COUNT" &
done

# Wait for all agents to complete
wait

end_benchmark=$(date +%s)
total_time=$((end_benchmark - start_benchmark))

echo ""
echo "=== Benchmark Complete ==="
echo "Total time: ${total_time}s"
echo "Total commits: $((AGENT_COUNT * COMMIT_COUNT))"
echo "Commits per second: $(echo "scale=2; ($AGENT_COUNT * $COMMIT_COUNT) / $total_time" | bc)"

# Save throughput data
echo "$((AGENT_COUNT * COMMIT_COUNT)) ${total_time}" > "${RESULTS_DIR}/throughput.txt"

# Analyze lock contention (for Git)
if [ "$VCS_TYPE" = "git" ]; then
    echo ""
    echo "=== Lock Contention Analysis ==="
    failed_commits=$(grep -c "false" "${RESULTS_DIR}/timings.csv" || echo "0")
    total_commits=$((AGENT_COUNT * COMMIT_COUNT))
    success_rate=$(echo "scale=2; 100 * (1 - $failed_commits / $total_commits)" | bc)

    echo "Failed commits: ${failed_commits}"
    echo "Success rate: ${success_rate}%"

    echo "{\"failed_commits\": $failed_commits, \"success_rate\": $success_rate}" > "${RESULTS_DIR}/lock-contention.json"
fi

echo ""
echo "Results saved to: ${RESULTS_DIR}/"
