"""§22.4a S6 — the type-driven entry noun.

The displayed noun for an entry is a framework concept keyed on the
collection's immutable type: document→"RFC", specification→"Spec", bdd→"Feature".
The chrome reads it from the API rather than hardcoding "RFC", so the propose
CTA + entry chrome name entries correctly per collection type with no
per-deployment config.
"""
from __future__ import annotations

from fastapi.testclient import TestClient

from app import collections, db
from test_propose_vertical import (  # noqa: F401
    app_with_fake_gitea, provision_user_row, sign_in_as, tmp_env,
)


def test_entry_noun_map():
    assert collections.entry_noun("document") == "RFC"
    assert collections.entry_noun("specification") == "Spec"
    assert collections.entry_noun("bdd") == "Feature"
    # An unknown/future type falls back to the generic noun, never label-less.
    assert collections.entry_noun("mystery") == "RFC"


def test_collection_api_surfaces_entry_noun(app_with_fake_gitea):
    app, _ = app_with_fake_gitea
    with TestClient(app) as client:
        provision_user_row(user_id=1, login="ben", role="owner")
        sign_in_as(client, user_id=1, gitea_login="ben", display_name="Ben",
                   role="owner", email="ben@test")
        # Flip the default collection to a bdd type and confirm the noun follows.
        db.conn().execute("UPDATE collections SET type='bdd' WHERE id='default'")
        r = client.get("/api/projects/default/collections/default")
        assert r.status_code == 200, r.text
        assert r.json()["entry_noun"] == "Feature"


def test_directory_items_carry_entry_noun(app_with_fake_gitea):
    app, _ = app_with_fake_gitea
    with TestClient(app) as client:
        db.conn().execute("UPDATE projects SET visibility='public' WHERE id='default'")
        db.conn().execute("UPDATE collections SET type='specification' WHERE id='default'")
        r = client.get("/api/deployment")
        assert r.status_code == 200, r.text
        item = next(p for p in r.json()["projects"] if p["id"] == "default")
        assert item["entry_noun"] == "Spec"
