from session.compression_quality import CompressionQualityEvaluator


def test_quality_metrics_expose_prd_level_fields_by_default():
    messages = [
        {"role": "user", "content": "Use PostgreSQL and AGFS for Project Falcon."},
        {"role": "assistant", "content": "We will keep ContextFS compatibility."},
    ]

    metrics = CompressionQualityEvaluator().evaluate(
        messages,
        overview="Project Falcon uses PostgreSQL, AGFS, and ContextFS.",
        abstract="Project Falcon storage plan",
    )

    assert set(metrics) == {
        "information_retention_ratio",
        "entity_retention_ratio",
        "compression_ratio",
    }
    assert metrics["information_retention_ratio"] == 1.0
    assert metrics["entity_retention_ratio"] == 1.0
    assert 0 < metrics["compression_ratio"] < 1


def test_quality_metrics_include_diagnostics_when_requested():
    metrics = CompressionQualityEvaluator().evaluate(
        [{"role": "user", "content": "Use PostgreSQL for Project Falcon."}],
        overview="Project Falcon",
        abstract="Project Falcon",
        include_details=True,
    )

    assert "details" in metrics
    assert "source_chars" in metrics["details"]
    assert "missing_entities" in metrics["details"]


def test_quality_metrics_handles_empty_source():
    metrics = CompressionQualityEvaluator().evaluate([], overview="", abstract="")

    assert metrics["information_retention_ratio"] == 1.0
    assert metrics["entity_retention_ratio"] == 1.0
    assert metrics["compression_ratio"] == 1.0


def test_quality_metrics_ignore_common_title_case_words_as_entities():
    metrics = CompressionQualityEvaluator().evaluate(
        [{"role": "user", "content": "The API uses Project Falcon. Yes, keep PostgreSQL."}],
        overview="The API uses Project Falcon and PostgreSQL.",
        abstract="API Project Falcon PostgreSQL",
        include_details=True,
    )

    assert "The" not in metrics["details"]["missing_entities"]
    assert "Yes" not in metrics["details"]["missing_entities"]
    assert metrics["entity_retention_ratio"] == 1.0