@startuml
!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Context.puml
!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml

SHOW_PERSON_OUTLINE()
AddElementTag("BackendService", $shape=EightSidedShape(), $bgColor="CornflowerBlue", $fontColor="white", $legendText="backend service\neight sided")
AddElementTag("Storage", $shape=RoundedBoxShape(), $bgColor="lightSkyBlue", $fontColor="white")

System_Boundary(c2, "SciTranslate") {
    Container(webUI, "Web интерфейс", "Streamlit, Python", "Позволяет пользователю настраивать и/или создавать рабочее окружение для задач перевода")
    Container(nllbmodel, "ML сервис", "NLLB model", "Настройка и/или дообучение шаблонов модели (стиль ред.издания, предметная область и т.п.)", $tags = "BackendService")
    Container(messagebus, "Message Bus", "RabbitMQ", "Передача данных зарегистрированных на основе сработанных задач перевода")
    Person(translator, "Переводчик", "Авторизованный пользователь с доступом к инструменту итеративного либо полного перевода")
    Person(editortranslator, "Редактор", "Авторизованный пользователь с доступом к результату работы переводчика")
    Person(datascientist, "ML-специалист", "Дообучение и подготовка данных для NLP модели")
    ContainerDb(customer_db, "Database", "PostgreSQL", "Хранение информации по конечному переводу", $tags = "storage")
}


Rel_R(translator, webUI, "Uses", "HTTPS")
Rel_L(editortranslator, webUI, "Uses", "HTTPS")
Rel_U(datascientist, nllbmodel, "Uses", "HTTPS")


Rel_D(nllbmodel, webUI, "Отправляет события для оповещения на UI по", "WebSocket")
Rel_D(webUI, nllbmodel, "Обновление пользовательской информации используя", "async, JSON/HTTPS")


Rel_L(nllbmodel, messagebus, "Асинхронный перевод", "async, JSON/HTTPS")
Rel_R(nllbmodel, customer_db, "Хранение перевода", "JDBC")

Rel_D(webUI, messagebus, "Запрос на получение асинхронного перевода")


SHOW_LEGEND()
@enduml