@startuml
title Узел аналитики: взаимодействие сервисов и внешних систем

skinparam componentStyle rectangle
skinparam wrapWidth 200
skinparam maxMessageSize 200

'=== Внешние системы ===
cloud "Централ (API5)" as CENTRAL
cloud "Видеоноды" as VNODE

'=== Узел аналитики ===
node "Analytics Node" {
  [ivideon-analytics-controller\n(analytics-controller)] as CTRL
  [ivideon-analytics-video-proxy\n(analytics-video-proxy)] as PROXY
  [ivideon-event-saver\n(analytics-event-saver)] as SAVER
  [ivideon-cloud-vs\n(cloud-vs)] as CLVS
  [ivideon-analytics-visitor-counter\n(analytics-visitor-counter)] as VC

  database "База данных\nMongoDB\ncollections:\n- analytics.channels\n- analytics.events" as DB
}

'=== Связи с Централом (API5) ===
CTRL -down-> CENTRAL : Периодическая синхронизация\n• Получение списка камер\n• Получение/обновление настроек облачных модулей\n• Оповещение об ошибках\n• Передача метрик
PROXY -down-> CENTRAL : Запросы к API5 для получения\nпараметров/доступа к видеопотоку\n(со стороны видеонод)

'=== Поток видео ===
PROXY --> CLVS : Проксирование видеопотока\n(FLV в формате видеонод)
PROXY ..> VNODE : Доступ к потокам с видеонод\n(через API5 Централа)

'=== WebSocket-взаимодействие ===
CTRL -left-> PROXY : WebSocket (к серверу PROXY)\nУведомления об ошибках ivideon-analytics-video-proxy
CLVS -right-> CTRL : WebSocket (к серверу CLVS)\nСобытия облачного видеосервера

'=== Счётчик посетителей ===
VC --> CTRL : События счётчика (по FLV-потоку)\nдля аналитики

'=== Синхронизация состояния через БД ===
CTRL -down-> DB : Обновление состояния каналов\n(collection: analytics.channels)
PROXY -down-> DB : Периодическая вычитка состояния каналов\n• При state=stream_awaited ⇒ выставляет state=streaming\n• Выставление acknowledgment-статусов
PROXY -left-> CTRL : Логическая синхронизация состояния\nчерез общую БД (channels)

'=== Работа с событиями ===
CTRL -down-> DB : Обработка и запись событий\n(collection: analytics.events)
SAVER -down-> DB : Периодическая вычитка событий
SAVER -down-> CENTRAL : Доставка событий в API5\n(тип события ⇒ соответствующий запрос)

'=== Легенда ===
legend right
Каналы связи
● HTTP/API: сплошная стрелка
● WebSocket: подпись "WebSocket"
● БД-синхронизация: стрелка к DB с пояснением

Коллекции
analytics.channels — состояние каналов/ACK
analytics.events  — события для отправки в облако
endlegend

@enduml
