"""Contrat JSON de `POST /v1/process` — voir `schemas.py`/`routes/process.py`.

Le service s'entraîne désormais lui-même au démarrage sur le vrai corpus
(`training_data.TECH_STEP_TRAINING_DATA`, voir `conftest.py`'s fixture
`client` partagée) — ces tests vérifient donc le contrat HTTP contre des
phrases réelles du corpus, plus besoin d'un `POST /v1/train` préalable avec
des données jouets.
"""

from fastapi.testclient import TestClient

from intent_service.config import settings

_HEADERS = {"X-Intent-Service-Secret": settings.intent_service_secret}


def test_process_against_an_unsupported_locale_returns_empty_result(client: TestClient):
    # "de" n'a aucun modèle spaCy connu (`SUPPORTED_LOCALES`) — se comporte
    # comme "jamais entraîné" côté `/v1/process`, jamais une erreur (voir
    # `PipelineRegistry.process`).
    response = client.post(
        "/v1/process", headers=_HEADERS, json={"locale": "de", "text": "faire mijoter à feu doux"}
    )
    assert response.status_code == 200
    assert response.json() == {"entities": [], "intent": None, "score": 0.0}


def test_process_returns_entities_and_intent_for_a_real_corpus_sentence(client: TestClient):
    response = client.post(
        "/v1/process", headers=_HEADERS, json={"locale": "fr", "text": "Faire mijoter à feu doux"}
    )
    assert response.status_code == 200
    body = response.json()
    assert body["intent"] == "simmer"
    assert body["score"] > 0
    assert [entity["uid"] for entity in body["entities"]] == ["simmer"]


def test_process_matches_english_text_against_the_english_trained_vocabulary(client: TestClient):
    response = client.post(
        "/v1/process", headers=_HEADERS, json={"locale": "en", "text": "Chop the onions finely"}
    )
    assert response.status_code == 200
    body = response.json()
    assert [entity["uid"] for entity in body["entities"]] == ["chop"]


def test_process_with_blank_text_returns_empty_result(client: TestClient):
    response = client.post("/v1/process", headers=_HEADERS, json={"locale": "fr", "text": "   "})
    assert response.status_code == 200
    assert response.json() == {"entities": [], "intent": None, "score": 0.0}
