"""§22 S2 — collection read helpers: list_collections / get_collection /
subfolder_of."""
from __future__ import annotations

import json
import tempfile
from pathlib import Path

from app import collections as collections_mod, db
from app.config import Config


def _db() -> Config:
    cfg = Config(
        gitea_url="x", gitea_bot_user="x", gitea_bot_token="x", gitea_org="x",
        registry_repo="registry", oauth_client_id="x",
        oauth_client_secret="x", app_url="x", secret_key="x",
        database_path=Path(tempfile.mkdtemp(prefix="colhelp-")) / "t.db",
        owner_gitea_login="x", webhook_secret="x",
    )
    db.run_migrations(cfg)
    if db._CONN is not None:
        db._CONN.close()
        db._CONN = None
    db.init(cfg)
    return cfg


def _seed(project_id="ohm"):
    db.conn().execute(
        "INSERT OR REPLACE INTO projects (id, name, content_repo, visibility, updated_at) "
        "VALUES (?, 'Ohm', 'ohm-rfc', 'public', datetime('now'))", (project_id,))
    for cid, sub, vis, name in [
        ("default", "", "public", "Model"),
        ("features", "features", "public", "Features"),
        ("secret", "secret", "unlisted", "Secret"),
    ]:
        db.conn().execute(
            "INSERT OR REPLACE INTO collections (id, project_id, type, subfolder, initial_state, "
            "visibility, name, created_at, updated_at) VALUES (?,?, 'document', ?, "
            "'super-draft', ?, ?, datetime('now'), datetime('now'))",
            (cid, project_id, sub, vis, name))


def test_list_collections_excludes_unlisted():
    _db()
    _seed()
    ids = [c["id"] for c in collections_mod.list_collections("ohm", include_unlisted=False)]
    assert ids == ["default", "features"]  # default first, then by name; 'secret' omitted


def test_list_collections_include_unlisted():
    _db()
    _seed()
    ids = {c["id"] for c in collections_mod.list_collections("ohm", include_unlisted=True)}
    assert ids == {"default", "features", "secret"}


def test_get_collection_and_subfolder():
    _db()
    _seed()
    assert collections_mod.get_collection("features")["name"] == "Features"
    assert collections_mod.subfolder_of("features") == "features"
    assert collections_mod.subfolder_of("default") == ""
    assert collections_mod.get_collection("nope") is None


# ---- §22.4a SLICE-2: field schema served on the collection ----

def test_get_collection_fields_none_when_unset():
    # INV-5: a collection with no `fields:` exposes fields=None (the default
    # `document` collection sees zero change).
    _db()
    _seed()
    assert collections_mod.get_collection("features")["fields"] is None


def test_get_collection_exposes_field_schema():
    _db()
    _seed()
    schema = {"priority": {"type": "enum", "values": ["P0", "P1"]}}
    db.conn().execute(
        "UPDATE collections SET config_json = ? WHERE id = 'features'",
        (json.dumps({"fields": schema}),))
    assert collections_mod.get_collection("features")["fields"] == schema
