!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/v2.0.1/C4.puml
' uncomment the following line and comment the first to use locally
' !include C4.puml

' Scope: A single software system.
' Primary elements: The software system in scope.
' Supporting elements: People and software systems directly connected to the software system in scope.
' Intended audience: Everybody, both technical and non-technical people, inside and outside of the software development team.

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

!global $PERSON_BG_COLOR = "#08427B"
!global $EXTERNAL_PERSON_BG_COLOR = "#686868"
!global $SYSTEM_BG_COLOR = "#1168BD"
!global $EXTERNAL_SYSTEM_BG_COLOR = "#999999"

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

skinparam rectangle<<person>> {
    StereotypeFontColor $ELEMENT_FONT_COLOR
    FontColor $ELEMENT_FONT_COLOR
    BackgroundColor $PERSON_BG_COLOR
    BorderColor #073B6F
}

skinparam rectangle<<external_person>> {
    StereotypeFontColor $ELEMENT_FONT_COLOR
    FontColor $ELEMENT_FONT_COLOR
    BackgroundColor $EXTERNAL_PERSON_BG_COLOR
    BorderColor #8A8A8A
}

skinparam rectangle<<system>> {
    StereotypeFontColor $ELEMENT_FONT_COLOR
    FontColor $ELEMENT_FONT_COLOR
    BackgroundColor $SYSTEM_BG_COLOR
    BorderColor #3C7FC0
}

skinparam rectangle<<external_system>> {
    StereotypeFontColor $ELEMENT_FONT_COLOR
    FontColor $ELEMENT_FONT_COLOR
    BackgroundColor $EXTERNAL_SYSTEM_BG_COLOR
    BorderColor #8A8A8A
}

sprite $person [48x48/16] {
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
0000000000000000000049BCCA7200000000000000000000
0000000000000000006EFFFFFFFFB3000000000000000000
00000000000000001CFFFFFFFFFFFF700000000000000000
0000000000000001EFFFFFFFFFFFFFF80000000000000000
000000000000000CFFFFFFFFFFFFFFFF6000000000000000
000000000000007FFFFFFFFFFFFFFFFFF100000000000000
00000000000001FFFFFFFFFFFFFFFFFFF900000000000000
00000000000006FFFFFFFFFFFFFFFFFFFF00000000000000
0000000000000BFFFFFFFFFFFFFFFFFFFF40000000000000
0000000000000EFFFFFFFFFFFFFFFFFFFF70000000000000
0000000000000FFFFFFFFFFFFFFFFFFFFF80000000000000
0000000000000FFFFFFFFFFFFFFFFFFFFF80000000000000
0000000000000DFFFFFFFFFFFFFFFFFFFF60000000000000
0000000000000AFFFFFFFFFFFFFFFFFFFF40000000000000
00000000000006FFFFFFFFFFFFFFFFFFFE00000000000000
00000000000000EFFFFFFFFFFFFFFFFFF800000000000000
000000000000007FFFFFFFFFFFFFFFFFF100000000000000
000000000000000BFFFFFFFFFFFFFFFF5000000000000000
0000000000000001DFFFFFFFFFFFFFF70000000000000000
00000000000000000BFFFFFFFFFFFF500000000000000000
0000000000000000005DFFFFFFFFA1000000000000000000
0000000000000000000037ABB96100000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000025788300000000005886410000000000000
000000000007DFFFFFFD9643347BFFFFFFFB400000000000
0000000004EFFFFFFFFFFFFFFFFFFFFFFFFFFB1000000000
000000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFD200000000
00000006FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE10000000
0000003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0000000
000000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5000000
000003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD000000
000009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF200000
00000DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF600000
00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF800000
00001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA00000
00001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB00000
00001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB00000
00001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB00000
00001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA00000
00000EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF700000
000006FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE100000
0000008FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3000000
000000014555555555555555555555555555555300000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
}

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

!procedure LAYOUT_WITH_LEGEND()
hide stereotype
legend right
|<color:$LEGEND_TITLE_COLOR>**Legend**</color> |
|<$PERSON_BG_COLOR> person |
|<$SYSTEM_BG_COLOR> system|
|<$EXTERNAL_PERSON_BG_COLOR> external person |
|<$EXTERNAL_SYSTEM_BG_COLOR> external system |
endlegend
!endprocedure

' Elements
' ##################################

!function $getPerson($label, $descr, $sprite)
!if ($descr == "") && ($sprite == "")
!return '<$person>\n=='+$label
!endif
!if ($descr == "") && ($sprite != "")
!return '<$'+$sprite+'>\n=='+$label
!endif
!if ($descr != "") && ($sprite == "")
!return '<$person>\n=='+$label+'\n\n '+$descr
!endif
!if ($descr != "") && ($sprite != "")
!return '<$'+$sprite+'>\n=='+$label+'\n\n '+$descr
!endif
!endfunction

!function $getSystem($label, $descr, $sprite)
!if ($descr == "") && ($sprite == "")
!return '=='+$label
!endif
!if ($descr == "") && ($sprite != "")
!return '<$'+$sprite+'>\n=='+$label
!endif
!if ($descr != "") && ($sprite == "")
!return '=='+$label+'\n\n '+$descr
!endif
!if ($descr != "") && ($sprite != "")
!return '<$'+$sprite+'>\n=='+$label+'\n\n '+$descr
!endif
!endfunction

!unquoted procedure Person($alias, $label, $descr="", $sprite="")
rectangle "$getPerson($label, $descr, $sprite)" <<person>> as $alias
!endprocedure

!unquoted procedure Person_Ext($alias, $label, $descr="", $sprite="")
rectangle "$getPerson($label, $descr, $sprite)" <<external_person>> as $alias
!endprocedure

!unquoted procedure System($alias, $label, $descr="", $sprite="")
rectangle "$getSystem($label, $descr, $sprite)" <<system>> as $alias
!endprocedure

!unquoted procedure System_Ext($alias, $label, $descr="", $sprite="")
rectangle "$getSystem($label, $descr, $sprite)" <<external_system>> as $alias
!endprocedure

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

!unquoted function Enterprise_Boundary($alias, $label)
!return Boundary($alias, $label, "Enterprise")
!endfunction
!unquoted function System_Boundary($alias, $label)
!return Boundary($alias, $label, "System")
!endfunction
