#!/usr/bin/env python3
"""Test analytics reporting system."""

import os
import sys
import time

# Add project root to path
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

# Load .env
try:
    from dotenv import load_dotenv
    load_dotenv()
except ImportError:
    pass

# Check credentials
url = os.environ.get('URL') or os.environ.get('SUPABASE_URL')
key = os.environ.get('SUPABASE_ADMIN')

if not url or not key:
    print("ERROR: Missing Supabase credentials")
    print(f"  URL: {'SET' if url else 'NOT SET'}")
    print(f"  SUPABASE_ADMIN: {'SET' if key else 'NOT SET'}")
    sys.exit(1)

print(f"Supabase URL: {url[:50]}...")
print()

# Test 1: Check queue status
print("=== Queue Status ===")
from src.supabase_client import SupabaseClient
client = SupabaseClient()
stats = client.get_stats()
print(f"PENDING: {stats.get('PENDING', 0)}")
print(f"COMPLETED: {stats.get('COMPLETED', 0)}")
print(f"FAILED: {stats.get('FAILED', 0)}")
print()

# Test 2: Test analytics reporter
print("=== Testing Analytics Reporter ===")
from src.analytics import create_reporter

reporter = create_reporter(
    gpu_id=0,
    supabase_url=url,
    supabase_key=key,
    machine_id="test-machine",
    enabled=True
)

print(f"Worker ID: {reporter.worker_id}")

# Simulate session start
print("  Sending session_start...")
reporter.session_start()

# Simulate pick
print("  Sending pick(test_video_001)...")
reporter.pick("test_video_001")

# Wait for flush
print("  Waiting 6s for background flush...")
time.sleep(6)

# Simulate done
print("  Sending done(test_video_001)...")
reporter.done(
    video_id="test_video_001",
    total_time=45.5,
    audio_min=10.2,
    speakers=3,
    usable_pct=78.5
)

# Wait for flush
print("  Waiting 8s for background flush...")
time.sleep(8)

# Debug: Check queue size
print(f"  Queue size: {reporter._queue.qsize()}")
print(f"  Flush thread alive: {reporter._flush_thread.is_alive()}")

# Check local stats
print()
print("=== Local Stats ===")
local_stats = reporter.get_local_stats()
for k, v in local_stats.items():
    print(f"  {k}: {v}")

# Shutdown (flush remaining)
print()
print("Shutting down reporter (flushing events)...")
reporter.shutdown()

# Give it time to flush
time.sleep(2)

# Query Supabase to verify
print()
print("=== Verifying in Supabase ===")
from supabase import create_client
sb = create_client(url, key)

# Check heartbeats
result = sb.table('worker_heartbeats').select('*').eq('worker_id', reporter.worker_id).execute()
if result.data:
    print(f"worker_heartbeats: Found {len(result.data)} row(s)")
    for row in result.data:
        print(f"  status: {row.get('status')}")
        print(f"  session_videos_done: {row.get('session_videos_done')}")
        print(f"  session_audio_minutes: {row.get('session_audio_minutes')}")
else:
    print("worker_heartbeats: No data found")

# Check events
result = sb.table('processing_events').select('*').eq('worker_id', reporter.worker_id).execute()
if result.data:
    print(f"processing_events: Found {len(result.data)} row(s)")
    for row in result.data:
        print(f"  video_id: {row.get('video_id')}, type: {row.get('event_type')}")
else:
    print("processing_events: No data found")

print()
print("=== Test Complete ===")

# Cleanup test data
print("Cleaning up test data...")
try:
    sb.table('worker_heartbeats').delete().eq('worker_id', reporter.worker_id).execute()
    sb.table('processing_events').delete().eq('worker_id', reporter.worker_id).execute()
    sb.table('worker_metrics').delete().eq('worker_id', reporter.worker_id).execute()
    print("  Cleanup complete")
except Exception as e:
    print(f"  Cleanup failed: {e}")
