@startuml
skinparam dpi 300
skinparam classFontSize 8
skinparam classFontName Helvetica
autonumber

box "Application" #LightGreen
    participant "Demo" as Demo
    participant "Metrics Collector" as Metrics
    participant "Report Builder" as Report
end box

box "Libraries" #LightBlue
    participant "Defender Library" as Defender
    participant "MQTT Client" as MQTT
    participant "JSON Library" as JSON
end box

box "AWS IoT Broker" #Yellow
    participant "AWS IoT Broker" as Broker
end box

activate Demo
Demo --> MQTT : Establish MQTT session

activate MQTT
MQTT --> Broker : Establish MQTT session
Broker --> MQTT : MQTT session established
MQTT --> Demo : MQTT session established
deactivate MQTT

Demo --> Defender : Generate accepted and rejected topic strings for JSON report (DEFENDER_API_JSON_ACCEPTED, DEFENDER_API_JSON_REJECTED)
activate Defender
Defender --> Demo : Accepted and rejected topic strings for JSON report
deactivate Defender

Demo --> MQTT : Subscribe to the accepted and rejected topics for JSON report
activate MQTT
MQTT --> Broker : Subscribe to the accepted and rejected topics for JSON report
Broker --> MQTT : Subscribe successful
MQTT --> Demo : Subscribe successful
deactivate MQTT

Demo --> Metrics : Collect device metrics
activate Metrics
Metrics --> Demo : Device metrics
deactivate Metrics

Demo --> Report : Construct JSON report
activate Report
Report --> Demo : JSON report
deactivate Report

Demo --> Defender : Generate publish topic string for JSON report (DEFENDER_API_JSON_PUBLISH)
activate Defender
Defender --> Demo :  Publish topic string for JSON report
deactivate Defender

Demo --> MQTT : Publish report
activate MQTT
MQTT --> Broker : Publish report
Broker --> MQTT : Publish successful
MQTT --> Demo : Publish successful
deactivate MQTT

Broker --> MQTT :  Publish message
activate MQTT
MQTT --> Demo : Incoming publish message received
deactivate MQTT

Demo --> Defender : Is this a Defender Message (Defender_MatchTopic)?
activate Defender
Defender ---> Demo : Yes
deactivate Defender

Demo --> JSON : Is the response a valid JSON?
activate JSON
JSON --> Demo : Yes
deactivate JSON

Demo --> JSON : Extract report ID from the response
activate JSON
JSON --> Demo : Report ID
deactivate JSON

Demo --> Demo : Verify that the report Id is same as was sent in the report

Demo --> MQTT : Unsubscribe from the accepted and rejected topics for JSON report
activate MQTT
MQTT --> Broker : Unsubscribe from the accepted and rejected topics for JSON report
Broker --> MQTT : Unsubscribe successful
MQTT --> Demo : Unsubscribe successful
deactivate MQTT

Demo --> MQTT : Disconnect MQTT session
activate MQTT
MQTT --> Broker : Disconnect MQTT session
Broker --> MQTT : MQTT session disconnected
MQTT --> Demo : MQTT session disconnected
deactivate MQTT

deactivate Demo

@enduml