from fastapi.testclient import TestClient

from app.main import app

client = TestClient(app)

SAMPLE_LISTING = (
    "Bán căn hộ chung cư cao cấp 85m² tại quận 7, 2 phòng ngủ, 2 WC, "
    "3 tầng, nội thất đầy đủ. Có hồ bơi, phòng gym, bảo vệ 24/7. "
    "Gần trường học và siêu thị. Sổ hồng chính chủ. Giá 3.5 tỷ."
)


def test_analyze_returns_tags():
    resp = client.post("/nlp/analyze", json={"text": SAMPLE_LISTING})
    assert resp.status_code == 200
    data = resp.json()

    tags = data["tags"]
    tag_names = [t["tag"] for t in tags]

    # Amenities
    assert "hồ bơi" in tag_names
    assert "phòng gym" in tag_names
    assert "bảo vệ 24/7" in tag_names

    # Location
    assert "gần trường học" in tag_names
    assert "gần siêu thị" in tag_names

    # Condition / legal
    assert "sổ hồng" in tag_names
    assert "chính chủ" in tag_names


def test_analyze_quality_scores():
    resp = client.post("/nlp/analyze", json={"text": SAMPLE_LISTING})
    assert resp.status_code == 200
    quality = resp.json()["quality"]

    assert 0 < quality["overall"] <= 1
    assert 0 < quality["completeness"] <= 1
    assert 0 < quality["readability"] <= 1
    assert 0 < quality["information_density"] <= 1
    assert quality["moderation_score"] is not None
    assert quality["moderation_score"] == 0.0  # clean listing


def test_analyze_completeness_low_for_sparse_text():
    resp = client.post("/nlp/analyze", json={"text": "Bán nhà đẹp giá tốt"})
    assert resp.status_code == 200
    quality = resp.json()["quality"]
    assert quality["completeness"] < 0.3


def test_analyze_tokens_present():
    resp = client.post("/nlp/analyze", json={"text": SAMPLE_LISTING})
    assert resp.status_code == 200
    data = resp.json()
    assert len(data["tokens"]) > 0
    assert len(data["sentences"]) > 0


def test_analyze_no_moderation():
    resp = client.post(
        "/nlp/analyze",
        json={"text": SAMPLE_LISTING, "include_moderation": False},
    )
    assert resp.status_code == 200
    quality = resp.json()["quality"]
    assert quality["moderation_score"] is None


def test_analyze_flagged_content_reduces_quality():
    flagged_text = (
        "Bán căn hộ 80m² 2 phòng ngủ quận 1. Liên hệ 0912345678. "
        "Sổ hồng chính chủ. Giá 5 tỷ."
    )
    resp = client.post("/nlp/analyze", json={"text": flagged_text})
    assert resp.status_code == 200
    quality = resp.json()["quality"]
    assert quality["moderation_score"] > 0  # phone number flagged


def test_batch_analyze():
    resp = client.post(
        "/nlp/batch-analyze",
        json={
            "texts": [
                "Bán căn hộ 60m² có hồ bơi gần trường học. Sổ đỏ. 2 tỷ.",
                "Bán đất nền 200m² mặt tiền đường lớn. Pháp lý rõ ràng.",
            ],
            "include_moderation": True,
        },
    )
    assert resp.status_code == 200
    data = resp.json()
    assert len(data["results"]) == 2
    assert any(t["tag"] == "hồ bơi" for t in data["results"][0]["tags"])
    assert any(t["tag"] == "mặt tiền đường" for t in data["results"][1]["tags"])


def test_analyze_location_tags():
    text = "Căn hộ ven sông Sài Gòn, gần metro số 1, trung tâm thành phố."
    resp = client.post("/nlp/analyze", json={"text": text})
    assert resp.status_code == 200
    tag_names = [t["tag"] for t in resp.json()["tags"]]
    assert "ven sông" in tag_names
    assert "gần metro" in tag_names
    assert "trung tâm thành phố" in tag_names


def test_analyze_condition_tags():
    text = "Nhà mới xây, hoàn thiện cơ bản, 3 tầng, đang thi công sắp bàn giao."
    resp = client.post("/nlp/analyze", json={"text": text})
    assert resp.status_code == 200
    tag_names = [t["tag"] for t in resp.json()["tags"]]
    assert "mới xây" in tag_names
    assert "hoàn thiện cơ bản" in tag_names
