#!/usr/bin/env python3
"""Tests for Story 2.03 (Track B): fast_extract"""
import time
import sys
sys.path.insert(0, '/mnt/e/genesis-system')


def test_fast_extract():
    from core.memory.fast_extract import fast_extract

    # BB1: Python file path in prompt
    result = fast_extract({"prompt": "Fix the bug in core/memory/jit_hydration.py"})
    entities, intent = result
    assert "core/memory/jit_hydration.py" in entities, f"Expected file path, got {entities}"

    # BB2: No recognizable entities
    result = fast_extract({"prompt": "Hello world"})
    entities, intent = result
    assert isinstance(entities, list)
    assert intent == "Hello world"

    # BB3: Empty dict — no exception
    result = fast_extract({})
    entities, intent = result
    assert entities == []
    assert intent == ""

    # BB4: Multiple entity types
    result = fast_extract({
        "prompt": "Connect to redis and update core/schema/redis_schema.py, class RedisKeySchema"
    })
    entities, intent = result
    assert any("redis" in e.lower() for e in entities), f"Expected redis, got {entities}"
    assert any("redis_schema.py" in e for e in entities), f"Expected file path, got {entities}"

    # BB5: UUID extraction
    result = fast_extract({
        "prompt": "Check session 9c42d3ce-e05a-4e34-8083-c91081917637"
    })
    entities, _ = result
    assert "9c42d3ce-e05a-4e34-8083-c91081917637" in entities

    # WB1: No LLM calls — timing < 5ms per call average
    start = time.monotonic()
    for _ in range(100):
        fast_extract({"prompt": "Build the tradie scraper engine for core/scraper.py with redis caching"})
    elapsed_ms = (time.monotonic() - start) * 1000
    avg_ms = elapsed_ms / 100
    assert avg_ms < 5, f"Average time {avg_ms:.2f}ms exceeds 5ms limit"

    # WB2: Intent string capped at 200 chars
    long_prompt = "x" * 500
    _, intent = fast_extract({"prompt": long_prompt})
    assert len(intent) <= 200, f"Intent length {len(intent)} exceeds 200"

    # WB3: Deduplication — redis appears multiple times but deduped to 1
    result = fast_extract({
        "prompt": "Connect redis to redis via Redis client"
    })
    entities, _ = result
    redis_count = sum(1 for e in entities if e.lower() == "redis")
    assert redis_count <= 1, f"Expected dedup, got {redis_count} redis entries"

    print("ALL TESTS PASSED — Story 2.03 (Track B)")


if __name__ == "__main__":
    test_fast_extract()
