@startuml
title "Prozess & Event-Flow: Startlisten-Generierung"

!theme vibrant

actor Meldestelle

participant "API Gateway / Frontend" as Gateway
participant "Nennungs_Context" as Nenn
queue "Message Bus" as Bus
participant "Ergebnis_Context" as Ergebnis

Meldestelle -> Gateway : POST /startlisten\n(fuer pruefungAbteilungId)

' 1. Command wird an den zuständigen Context gesendet
Gateway -> Nenn : **Command:** ErstelleStartliste(pruefungAbteilungId)
activate Nenn
note right of Nenn: Empfängt den Befehl,\ndie Startliste für eine\nPrüfungsabteilung zu generieren.

' 2. Interne Datenbeschaffung und Logik
Nenn -> Nenn : getAkzeptierteNennungen(pruefungAbteilungId)
note right of Nenn: Holt alle Nennungen mit Status\n"STARTBERECHTIGT_BESTAETIGT"\naus der eigenen Datenbank.

Nenn -> Nenn : wendeSortierUndLosverfahrenAn(nennungen)
note right of Nenn: Hier findet die Kernlogik statt:\n- Zufälliges Losen\n- oder Setzen nach Rangliste\n- Vergabe der Startnummern

Nenn -> Nenn : Startlisten-Aggregat erstellen\nund speichern (Status: Final)

note left of Nenn
  **Neues Aggregat: Startliste**
  Die erstellte Startliste könnte
  ein eigenes Aggregate Root im
  Nennungs_Context sein, das
  eine geordnete Liste von
  Startern enthält.
end note

' 3. Asynchrones Event wird veröffentlicht
Nenn ->> Bus : **Event:** StartlisteWurdeFinalisiert {startlisteId, pruefungAbteilungId, starter[]}
note right of Bus: Das Event informiert das restliche\nSystem über die finale Startliste.\nEs enthält alle nötigen Daten,\n damit die Empfänger nicht extra\nzurückfragen müssen.

Gateway --> Meldestelle : HTTP 200 OK (Startliste wurde erstellt)
deactivate Nenn


' 4. Der Ergebnis-Context reagiert auf das Event
Bus ->> Ergebnis : **Event:** StartlisteWurdeFinalisiert
activate Ergebnis
Ergebnis -> Ergebnis : erstelleBewerbsergebnis(event.pruefungAbteilungId)
Ergebnis -> Ergebnis : erstelleEinzelergebnisProStarter(event.starter[])
note right of Ergebnis: Der Ergebnis-Context bereitet sich vor.\nEr legt das `Bewerbsergebnis`-Aggregat an\nund erzeugt für jeden Starter einen leeren\n`Einzelergebnis`-Eintrag, der nun auf\ndie Eingabe der Leistung wartet.
deactivate Ergebnis

@enduml
