from app.utils.search_highlight import highlight_segments


def test_highlight_segments_case_insensitive():
    segments = highlight_segments("Ramesh Kumar", "mesh")
    assert segments is not None
    assert any(seg["match"] for seg in segments)
    assert "".join(seg["text"] for seg in segments) == "Ramesh Kumar"


def test_highlight_segments_no_match():
    segments = highlight_segments("Ramesh Kumar", "xyz")
    assert segments == [{"text": "Ramesh Kumar", "match": False}]


def test_global_search_by_customer_name(client, auth_headers, seed_data):
    response = client.get("/api/v1/search", headers=auth_headers, params={"q": "Ramesh"})
    assert response.status_code == 200
    body = response.json()
    assert body["query"] == "Ramesh"
    assert body["total"] >= 1
    item = body["items"][0]
    assert item["matched_value_segments"] is not None
    assert any(seg["match"] for seg in item["matched_value_segments"])


def test_global_search_by_policy_number(client, auth_headers, seed_data):
    policy_no = seed_data["policy"].policy_number
    response = client.get(
        "/api/v1/search",
        headers=auth_headers,
        params={"q": policy_no[:6]},
    )
    assert response.status_code == 200
    assert response.json()["total"] >= 1
    assert any(item["type"] == "policy" for item in response.json()["items"])


def test_global_search_pagination(client, auth_headers, seed_data):
    response = client.get(
        "/api/v1/search",
        headers=auth_headers,
        params={"q": "Ramesh", "page": 1, "page_size": 1},
    )
    assert response.status_code == 200
    body = response.json()
    assert body["page"] == 1
    assert body["page_size"] == 1
    assert len(body["items"]) <= 1
    assert body["total"] >= len(body["items"])


def test_global_search_minimum_query(client, auth_headers):
    response = client.get("/api/v1/search", headers=auth_headers, params={"q": "a"})
    assert response.status_code == 422


def test_global_search_requires_auth(client):
    response = client.get("/api/v1/search", params={"q": "test"})
    assert response.status_code == 401


def test_search_by_engine_number(client, auth_headers, db, seed_data):
    vehicle = seed_data["vehicle"]
    vehicle.engine_number = "ENG123456789"
    db.commit()

    response = client.get("/api/v1/search", headers=auth_headers, params={"q": "ENG123"})
    assert response.status_code == 200
    assert response.json()["total"] >= 1
    assert any(item.get("matched_field") == "engine" for item in response.json()["items"])
