#!/usr/bin/env python
# Copyright (c) 2022 Clément Martin <twisla@twis.la. All rights reserved.
# Unauthorized copying of this file, via any medium is strictly prohibited

"""Home network diagram
"""

from diagrams import Cluster, Diagram
from diagrams.generic.network import Firewall, Router, Switch
from diagrams.onprem.network import Internet
from diagrams.onprem.client import User, Users
from diagrams.onprem.compute import Server
from diagrams.generic.storage import Storage

from audio import Amplifier, AudioStreamer, TubeAmp, TurnTable
from consoles import NintendoSwitch, PlayStation4
from devices import AndroidPhone, IPhone, Laptop, NUC, Printer, Rpi4, WashingMachine
from edges import MyEdge, Legend
from electricity import Boxx, CPL
from fitbit import Aria
from lights import HueBridge, HueBulb, HueSpot, SmartPlug, Tradfri
from network import Modem, UniFiAP
from video import ProximusTV, Television, UltraWideScreen

GRAPH_ATTRS = {
        'layout'  : 'dot',
        'compound': 'True',
        'splines' : 'spline',
        'clusterrank':'local',
        'ordering':'in'}


with Diagram('Konijnenberg', direction='BT', graph_attr=GRAPH_ATTRS):

    with Cluster('Users'):
        alistair = User('Alistair')
        clement  = User('Clément')
        maithe   = User('Maïthé')

        guests   = Users('Guests')


    with Cluster('Mobile'):
        laptop_clement  = Laptop('Laptop Clément')
        laptop_maithe   = Laptop('Laptop Maïthé')
        nintendo_switch = NintendoSwitch('Switch Alistair')
        tel_alistair    = AndroidPhone('Téléphone Alistair')
        tel_clement     = AndroidPhone('Téléphone Clément')
        tel_maithe      = IPhone('Téléphone Maïthé')

        wifi_devices = [ nintendo_switch, laptop_clement, laptop_maithe,
                         tel_alistair, tel_maithe, tel_clement ]


    with Cluster('Salon'):
        boxx            = Boxx()
        hue             = HueBridge('Hue Bridge')
        living_cpl      = CPL('CPL salon')
        malkovitch      = Firewall('malkovitch')
        proximus        = Internet('Proximus')
        proximus_router = Modem('Proximus')
        telenet         = Internet('Telenet')
        telenet_router  = Modem('Telenet')
        wifi_ap         = UniFiAP('NanoHD')


        with Cluster('Sono'):
            ampli     = Amplifier('Ampli')
            hifi      = AudioStreamer('HiFi')
            preamp    = TubeAmp('Preampli phono')
            turntable = TurnTable('Platine')

            ampli << MyEdge('audio') >> [ hifi, preamp ]
            preamp << MyEdge('audio') >> turntable


        with Cluster('Video'):
            tv = Television('TV')
            jack = Rpi4('Jack')
            proximus_tv = ProximusTV('Decodeur')

            tv << MyEdge('hdmi') << [ jack, proximus_tv ]


        with Cluster('Lights'):
            with Cluster('Salon'):
                lumieres_salon = [ HueBulb('Boule Salon'), HueBulb('Lustre Canapé'), HueBulb('Lustre Table'),
                                   SmartPlug('Vinyls'), SmartPlug('Mappemonde'),
                                   Tradfri('Vaisselier') ]

            with Cluster('Veranda'):
                lumieres_veranda = [ HueSpot(f'Veranda {x}') for x in range(6) ]


        wifi_ap << MyEdge('wifi') >> [ tv, jack, boxx, hifi ]
        malkovitch << MyEdge('ethernet') >> [telenet_router, proximus_router, wifi_ap]
        telenet_router << MyEdge('cable') >> telenet
        proximus_router << MyEdge('adsl') >> proximus
        malkovitch << MyEdge('ethernet') >> living_cpl
        proximus_router << MyEdge('ethernet') >> [ hue, proximus_tv ]
        hue << MyEdge('zigbee') >> lumieres_salon
        hue << MyEdge('zigbee') >> lumieres_veranda


    with Cluster('Bureau'):
        tv_bureau = Television()
        ecran_bureau = UltraWideScreen()
        walter = NUC('walter')
        switch = Switch('dlink')
        office_cpl = CPL('CPL bureau')
        printer = Printer()
        rainbow = Rpi4('Rainbow')
        rpi4_1 = Rpi4('RPI4/1')
        rpi4_2 = Rpi4('RPI4/2')
        rpi4_3 = Rpi4('RPI4/3')
        rpi4_4 = Rpi4('RPI4/4')
        rpi4_5 = Rpi4('RPI4/5')
        ps4 = PlayStation4()
        zippo = Storage('Zippo')
        lumieres_bureau = [ HueSpot('Plafond bureau 1'), HueSpot('Plafond bureau 2') ]

        ecran_bureau << MyEdge('hdmi') >> walter
        tv_bureau << MyEdge('hdmi') >> [ ps4, rainbow ]
        switch << MyEdge('ethernet') >> [ office_cpl, printer, walter, ps4,
                                          rainbow, rpi4_1, rpi4_2, rpi4_3,
                                          rpi4_4, rpi4_5, zippo ]


    with Cluster('Salle de bain'):
        balance = Aria('Balance')


    with Cluster('Cuisine'):
        flex2i = AudioStreamer('Flex 2i')


    with Cluster('Garage'):
        lessiveuse = WashingMachine('Lave linge')

    living_cpl << MyEdge('electric') >> office_cpl
    wifi_ap << MyEdge('ethernet') >> malkovitch
    wifi_ap << MyEdge('wifi') >> wifi_devices
    wifi_ap << MyEdge('wifi') >> balance
    wifi_ap << MyEdge('wifi') >> flex2i
    wifi_ap << MyEdge('wifi') >> lessiveuse
    hue << MyEdge('zigbee') >> lumieres_bureau

    alistair >> [ nintendo_switch, tel_alistair ]
    maithe >> [ tel_maithe, laptop_maithe ]
    clement >> [ tel_clement, laptop_clement, walter ]
