' C4-PlantUML, version 1.0.0
' https://github.com/RicardoNiepel/C4-PlantUML

' Colors
' ##################################

!procedure ELEMENT_FONT_COLOR()
#FFFFFF
!endprocedure

' Styling
' ##################################

!$TECHN_FONT_SIZE=12

skinparam defaultTextAlignment center

skinparam wrapWidth 200
skinparam maxMessageSize 150

skinparam rectangle {
    StereotypeFontSize 12
    shadowing false
}

skinparam actor {
    StereotypeFontSize 12
    shadowing false
    Style AWESOME
    StereoTypeFontColor #666666
    FontColor #666666
}

skinparam database {
    StereotypeFontSize 12
    shadowing false
}

skinparam Arrow {
    Color #666666
    FontColor #666666
    FontSize 12
}

skinparam rectangle<<boundary>> {
    Shadowing false
    StereotypeFontSize 0
    FontColor #444444
    BorderColor #444444
    BorderStyle dashed
}

' Layout
' ##################################

!procedure LAYOUT_AS_SKETCH()
skinparam backgroundColor #EEEBDC
skinparam handwritten true
skinparam defaultFontName "Comic Sans MS"
center footer <font color=red>Warning:</font> Created for discussion, needs to be validated
!endprocedure

!procedure LAYOUT_TOP_DOWN()
    top to bottom direction
!endprocedure

!procedure LAYOUT_LEFT_RIGHT()
    left to right direction
!endprocedure

' Boundaries
' ##################################

!unquoted procedure Boundary(e_alias, e_label)
    rectangle "==e_label" <<boundary>> as e_alias
!endprocedure

!unquoted procedure Boundary(e_alias, e_label, e_type)
    rectangle "==e_label\n<size:$TECHN_FONT_SIZE>[e_type]</size>" <<boundary>> as e_alias
!endprocedure

' Relationship
' ##################################

!unquoted procedure Rel_(e_alias1, e_alias2, e_label, e_direction="")
    e_alias1 e_direction e_alias2 : "===e_label"
!endprocedure

!unquoted procedure Rel_(e_alias1, e_alias2, e_label, e_techn, e_direction="")
    e_alias1 e_direction e_alias2 : "===e_label\n//<size:$TECHN_FONT_SIZE>[e_techn]</size>//"
!endprocedure

!unquoted procedure Rel(e_from,e_to, e_label)
    Rel_(e_from,e_to, e_label, "-->")
!endprocedure

!unquoted procedure Rel(e_from,e_to, e_label, e_techn)
    Rel_(e_from,e_to, e_label, e_techn, "-->")
!endprocedure

!unquoted procedure Rel_Back(e_to, e_from, e_label)
    Rel_(e_to, e_from, e_label, "<--")
!endprocedure

!unquoted procedure Rel_Back(e_to, e_from, e_label, e_techn)
    Rel_(e_to, e_from, e_label, e_techn, "<--")
!endprocedure

!unquoted procedure Rel_Neighbor(e_from, e_to, e_label)
    Rel_(e_from,e_to, e_label, "->")
!endprocedure

!unquoted procedure Rel_Neighbor(e_from, e_to, e_label, e_techn)
    Rel_(e_from,e_to, e_label, e_techn, "->")
!endprocedure

!unquoted procedure Rel_Back_Neighbor(e_to, e_from, e_label)
    Rel_(e_to, e_from, e_label, "<-")
!endprocedure

!unquoted procedure Rel_Back_Neighbor(e_to, e_from, e_label, e_techn)
    Rel_(e_to, e_from, e_label, e_techn, "<-")
!endprocedure

!unquoted procedure Rel_D(e_from,e_to, e_label)
    Rel_(e_from,e_to, e_label, "-DOWN->")
!endprocedure

!unquoted procedure Rel_D(e_from,e_to, e_label, e_techn)
    Rel_(e_from,e_to, e_label, e_techn, "-DOWN->")
!endprocedure

!unquoted procedure Rel_Down(e_from,e_to, e_label)
    Rel_D(e_from,e_to, e_label)
!endprocedure

!unquoted procedure Rel_Down(e_from,e_to, e_label, e_techn)
    Rel_D(e_from,e_to, e_label, e_techn)
!endprocedure

!unquoted procedure Rel_U(e_from,e_to, e_label)
    Rel_(e_from,e_to, e_label, "-UP->")
!endprocedure

!unquoted procedure Rel_U(e_from,e_to, e_label, e_techn)
    Rel_(e_from,e_to, e_label, e_techn, "-UP->")
!endprocedure

!unquoted procedure Rel_Up(e_from,e_to, e_label)
    Rel_U(e_from,e_to, e_label)
!endprocedure

!unquoted procedure Rel_Up(e_from,e_to, e_label, e_techn)
    Rel_U(e_from,e_to, e_label, e_techn)
!endprocedure

!unquoted procedure Rel_L(e_from,e_to, e_label)
    Rel_(e_from,e_to, e_label, "-LEFT->")
!endprocedure

!unquoted procedure Rel_L(e_from,e_to, e_label, e_techn)
    Rel_(e_from,e_to, e_label, e_techn, "-LEFT->")
!endprocedure

!unquoted procedure Rel_Left(e_from,e_to, e_label)
    Rel_L(e_from,e_to, e_label)
!endprocedure

!unquoted procedure Rel_Left(e_from,e_to, e_label, e_techn)
    Rel_L(e_from,e_to, e_label, e_techn)
!endprocedure

!unquoted procedure Rel_R(e_from,e_to, e_label)
    Rel_(e_from,e_to, e_label, "-RIGHT->")
!endprocedure

!unquoted procedure Rel_R(e_from,e_to, e_label, e_techn)
    Rel_(e_from,e_to, e_label, e_techn, "-RIGHT->")
!endprocedure

!unquoted procedure Rel_Right(e_from,e_to, e_label)
    Rel_R(e_from,e_to, e_label)
!endprocedure

!unquoted procedure Rel_Right(e_from,e_to, e_label, e_techn)
    Rel_R(e_from,e_to, e_label, e_techn)
!endprocedure

' Layout Helpers
' ##################################

!unquoted procedure Lay_D(e_from, e_to)
    e_from -[hidden]D- e_to
!endprocedure

!unquoted procedure Lay_U(e_from, e_to)
    e_from -[hidden]U- e_to
!endprocedure

!unquoted procedure Lay_R(e_from, e_to)
    e_from -[hidden]R- e_to
!endprocedure

!unquoted procedure Lay_L(e_from, e_to)
    e_from -[hidden]L- e_to
!endprocedure