# BCF integrační vrstva

Samostatná aplikační vrstva pro **BIM Collaboration Format** (BCF 2.1 / 3.0) nad IFC
prohlížečem. Není součástí UI vieweru — je to vlastní BCF platforma, která používá
IFC viewer pouze jako jednu ze svých služeb (přes `ViewerAdapter`).

- **Verze:** 1.0.0 · plně offline (ZIP i XML řešeny nativně, bez externích knihoven)
- **Formáty:** BCF 2.1, BCF 3.0, `.bcf`, `.bcfzip`
- **Identifikace prvků:** vždy `IfcRoot.GlobalId` (+ `modelId` pro federaci)
- **Decoupling:** BCF core/services/workflow/UI nikdy neimportují konkrétní IFC SDK

## Architektura (§2, §44)

```
UI  →  BCFClient  →  TopicService / ViewpointService / WorkflowService / CommentService / Validation
                         │                       │
                     BCF Core            ComponentResolver
                         │                       │
        BCF File Adapter (parser/writer)   ViewerAdapter  →  IFCViewerAdapter  →  IFC Viewer SDK
                                                (výměnný — Flinker / That Open / xeokit / vlastní)
```

Náhrada IFC enginu = nový `ViewerAdapter`, beze změny BCF logiky (§36).

## Rychlý start

```html
<script src="/sdk/ifc-viewer-sdk.js"></script>
<script src="/bcf/bcf-sdk.js"></script>
<script>
  const viewer = new IFCViewerSDK.IFCViewer({ container: "#viewer" });
  await viewer.init();
  await viewer.loadModel({ url: "/models/model.ifc" });

  const bcf = new BCFSDK.BCFClient({ viewer, currentUser: () => "jan@firma.cz", currentRole: () => "reviewer" });

  // Vytvořit připomínku z aktuálního pohledu (kamera + výběr + viditelnost + řez + snímek)
  const { topic } = await bcf.createIssueFromCurrentView({ title: "Kolize", priority: "high", dueDate: "2026-09-01" });

  // Otevřít téma = obnovit pohled v modelu (prostorová záložka)
  await bcf.openTopic(topic.id);

  await bcf.addComment(topic.id, { text: "Nalezena kolize." });
  await bcf.changeStatus(topic.id, "assigned");   // workflow kontroluje přechody i pravidla
  const zip = await bcf.export("3.0");             // .bcfzip (Uint8Array)
</script>
```

Velké serverové modely lze místo `loadModel` načíst streamovaně přes
`viewer.loadStream({ base: "/models/model.ifc.stream/", ifcUrl: "/models/model.ifc" })`;
BCF vrstva pracuje beze změny a viewpointy jsou zaměnitelné s klasickým načtením.
Koordinační plocha (`examples/bcf-integration/`) přebírá modely z vieweru přes
`?ifc=<url>` a ve stejném pořadí `?stream=<báze dlaždic>` (prázdná hodnota = klasické
načtení). Bez parametrů `stream` sama zjistí, zda má model připravené dlaždice;
`?nostream=1` vynutí klasické načtení. Když stream selže, načte celý IFC.

## Veřejné API (BCFClient, §26)

| Metoda | Popis |
|--------|-------|
| `load(file, {mode})` | Import `.bcfzip` (mode: `IMPORT_NEW`\|`MERGE`\|`REPLACE`). |
| `export("2.1"\|"3.0")` | Export do `.bcfzip` (Uint8Array). |
| `createTopic/updateTopic/deleteTopic/getTopic/listTopics/filterTopics` | Správa témat. |
| `createIssueFromCurrentView(data)` | Téma + viewpoint + snímek z aktuálního stavu vieweru. |
| `openTopic(id, {viewpointId})` | Obnoví kameru/výběr/viditelnost/řezy dle viewpointu. |
| `captureViewpoint(topicId?)` / `applyViewpoint(id)` | Práce s viewpointy. |
| `addComment/listComments` | Komentáře (volitelně s viewpointem). |
| `changeStatus(id, status, {role,userId})` / `assign(id, user)` / `allowedTransitions(id)` | Workflow. |
| `validate()` | Validace (ERROR/WARNING/INFO). |
| `on(event, handler)` | Event bus (`bcf.topic.created`, `bcf.viewpoint.applied`, `bcf.workflow.changed`, …). |

## Workflow (§18–§21)

Konfigurovatelné, nikoli natvrdo Open/Closed. Výchozí *coordination*:
`new → assigned → in_progress → review → (closed | in_progress)`, se znovuotevřením
`closed → in_progress`. Role (Reporter/Assignee/Reviewer/Administrator) a pravidla
(uzavření jen kontrolorem, autor neschvaluje vlastní, termín u vysoké priority,
komentář před uzavřením, odpovědná osoba před kontrolou) — viz `WorkflowDefinition`.
Vlastní workflow: `new BCFClient({ workflow: {...} })`.

## Úložiště (§24, §25)

`BCFRepository` rozhraní; implementace `MemoryBCFRepository` (výchozí, párováno s
`.bcfzip`) a `IndexedDBBCFRepository` (perzistence v prohlížeči). REST/SharePoint/CDE
lze doplnit jako další repository/adapter bez zásahu do domény.

## Bezpečnost (§38)

XML parser odmítá externí entity/DTD (XXE). ZIP čtení blokuje path traversal
(`..`, absolutní cesty). Importované obrázky se nespouští. Snímky se omezují velikostí.

## Rozsah MVP a co je připraveno, ne však hotovo

Hotovo (§43): BCF 2.1/3.0 import+export, Topics, Comments, Viewpoints (kamera,
selection, visibility, clipping, snapshot), GlobalId resolver s federací, workflow
engine, audit, event bus, validace, IndexedDB. Architektura umožňuje doplnit (bez
přepsání domény): BCF API server, SharePoint/CDE/CAFM, web-worker import, e-mail
notifikace — ty v MVP nejsou.
