@startuml
skinparam monochrome true
skinparam packageStyle rectangle
skinparam shadowing false

title Sequence Diagram (SD)

autonumber

actor "Vehicle Fleet\nManager" as FM
participant ":RegisterVehicleUI" as UI
participant ":RegisterVehicleController" as CTRL
participant ":Repositories" as RepositorySingleton
participant "repositories\n:Repositories" as PLAT
participant "brandRepository\n:BrandRepository" as brandRep
participant "brand\n:Brand" as brand
participant "vehicleTypeRepository\n:VehicleTypeRepository" as vehicleTypeRep
participant "vehicleRepository\n:VehicleRepository" as vehicleRep
participant "vehicle\n:Vehicle" as vehicle

activate FM

    FM -> UI : ask to register a vehicle
    activate UI

        UI -> CTRL** : create

        UI --> FM : request data (i.e. plate, type, tare, gross weight, current Km,\nacquisition date, maintenance frequency)
    deactivate UI

    FM -> UI : types requested data
    activate UI

        UI -> UI : keepData

        UI -> CTRL : getVehicleTypes()
        activate CTRL

            CTRL -> RepositorySingleton : getInstance()
            activate RepositorySingleton

                RepositorySingleton --> CTRL : repositories
            deactivate RepositorySingleton

            CTRL -> PLAT : getVehicleTypeRepository()
            activate PLAT

                PLAT --> CTRL : vehicleTypeRepository
            deactivate PLAT

            CTRL -> vehicleTypeRep : getTypes()
            activate vehicleTypeRep

                vehicleTypeRep --> CTRL : vehicleTypeList
            deactivate vehicleTypeRep

            CTRL --> UI : vehicleTypeList
        deactivate CTRL

        UI --> FM : shows a list of vehicle types
    deactivate UI

    FM -> UI : selects a type

    activate UI

        UI -> UI : keepTypeId

        UI -> CTRL : getBrands()
        activate CTRL

            CTRL -> RepositorySingleton : getInstance()
            activate RepositorySingleton

                RepositorySingleton --> CTRL : repositories
            deactivate RepositorySingleton

            CTRL -> PLAT : getBrandRepository()
            activate PLAT

                PLAT --> CTRL : brandRepository
            deactivate PLAT

            CTRL -> brandRep : getBrands()
            activate brandRep

                brandRep --> CTRL : brandList
            deactivate brandRep

            CTRL --> UI : brandList
        deactivate CTRL


        UI --> FM : shows a list of vehicle brands
    deactivate UI

    FM -> UI : selects a brand
    activate UI

        UI -> UI : keepBrandId

        UI -> CTRL : getModels(brandId)
        activate CTRL

            CTRL -> RepositorySingleton : getInstance()
            activate RepositorySingleton

                RepositorySingleton --> CTRL : repositories
            deactivate RepositorySingleton

            CTRL -> PLAT : getBrandRepository()
            activate PLAT

                PLAT --> CTRL : brandRepository
            deactivate PLAT

            CTRL -> brandRep : getBrandById()
            activate brandRep

                brandRep --> CTRL : brand
            deactivate brandRep

            CTRL -> brand : getModels()
            activate brand

                brand --> CTRL : modelList
            deactivate brand

            CTRL --> UI : modelList
        deactivate CTRL

        UI --> FM : shows a list of vehicle models from the brand
    deactivate UI

    FM -> UI : selects a model
    activate UI

        UI -> UI : keepModelId

        UI -> CTRL : getRegisterDate()
        activate CTRL

            CTRL --> UI : registerDate
        deactivate CTRL

        UI --> FM : shows all data with the register date and requests confirmation
    deactivate UI

    FM -> UI : confirms data
    activate UI

        UI -> CTRL : createVehicle(plate, typeId, tare, grossWeight, currentKm, acquisitionDate,\nmaintenanceFrequency, brandId, modelId, registerDate)
        activate CTRL

            CTRL -> RepositorySingleton : getInstance()
            activate RepositorySingleton

                RepositorySingleton --> CTRL : repositories
            deactivate RepositorySingleton

            CTRL -> PLAT : getVehicleRepository()
            activate PLAT

                PLAT --> CTRL : vehicleRepository
            deactivate PLAT

            CTRL -> PLAT : getBrandRepository()
            activate PLAT

                PLAT --> CTRL : brandRepository
            deactivate PLAT

            CTRL -> PLAT : getVehicleTypeRepository()
            activate PLAT

                PLAT --> CTRL : vehicleTypeRepository
            deactivate PLAT

            CTRL -> brandRep : getBrandById(modelId)
            activate brandRep

                brandRep --> CTRL : brand
            deactivate brandRep

            CTRL -> brand : getModelById()
            activate brand

                brand --> CTRL : model
            deactivate brand

            CTRL -> vehicleTypeRep : getTypeById(typeId)
            activate vehicleTypeRep

                vehicleTypeRep --> CTRL : type
            deactivate vehicleTypeRep

            CTRL -> vehicleRep : createVehicle(plate, type, tare, grossWeight, currentKm, acquisitionDate,\nmaintenanceFrequency, brand, model, registerDate)
            activate vehicleRep

                vehicleRep -> vehicle** : create(plate, type, tare, grossWeight, currentKm, acquisitionDate,\nmaintenanceFrequency, brand, model, registerDate)

                vehicleRep -> vehicleRep : addVehicle(vehicle)
                activate vehicleRep

                    vehicleRep -> vehicleRep : validateVehicle(vehicle)

                    activate vehicleRep

                        vehicleRep --> vehicleRep : true/false
                    deactivate vehicleRep

                    vehicleRep --> vehicleRep : true/false
                deactivate vehicleRep

                vehicleRep --> CTRL : true/false
            deactivate vehicleRep

            CTRL --> UI : true/false
        deactivate CTRL

        UI --> FM : displays operation success
    deactivate UI

@enduml