@startuml
skinparam packageStyle rectangle
skinparam shadowing false
skinparam linetype polyline


skinparam classAttributeIconSize 0

class ApplicationSession
{
    + static getInstance()
    + getCurrentSession()
}

class UserSession
{
    + getUserEmail()
}

class GSM {
}

class Task {
    - String description
    - Integer duration
    - Integer urgency
    - Integer date
    - String green space
    - String state
    - String team
    - String vehicles
}

class Vehicle {
        Vehicle State: string
        Brand: string
        Model: string
        Plate ID: string
        Type: string
        Tare: integer
        Gross Weight: integer
        Current Km: integer
        Register Date: string
        Acquisition Date: string
        Checkup Frequency: integer
}


class Organization {
    - String name
    - String website
    - Integer phone
    - String email

    + anyEmployeeHasEmail(email)
    + Organization(name, webSite, phone)
    + addVehiclesToTask(task, vehicle(s))
    - getEmployeeByEmail(email)

}

class OrganizationRepository {
    + getOrganizationByEmployeeEmail(email)
}

class TasksRepository {
    + getTaskByDescription(taskDescription)
}

class VehiclesRepository {
    + getVehiclesByName(vehicleName(s))
}

class Repositories {
    - Repositories()
    + getInstance() : Repositories
    + getOrganizationRepository()
    + getTasksRepository()
    + getVehiclesRepository()
}

class AssignVehiclesInAgendaController {
    +AssignVehiclesInAgendaController(organizationRepository)
    - getEmployeeFromSession()
}

class VehicleListDTO {
        - Vehicle State: string
        - Brand: string
        - Model: string
        - Plate ID: string
        - Type: string
        - Tare: integer
        - Gross Weight: integer
        - Current Km: integer
        - Register Date: string
        - Acquisition Date: string
        - Checkup Frequency: integer

    + VehicleListDTO(Vehicle State, Brand, Model, Plate ID, Type, Tare, Gross Weight, Current Km, Register Date,
    Acquisition Date, Checkup Frequency)
}

class VehicleListMapper {
    + toDTO(vehicle : Vehicle) : VehicleListDTO
    + toDTO(vehicles : List<Vehicle>) : List<VehicleListDTO>
}

class AgendaDTO {
    - Description: string
    - Duration: integer
    - Urgency: integer
    - Date: integer
    - Green Space: string
    - State: string

    + AgendaDTO(Description, Duration, Urgency, Date, Green Space, State)
}

class AgendaMapper {
    + toDTO(task : Task) : AgendaDTO
    + toDTO(agenda : List<Task>) : List<AgendaDTO>
}

note right of AssignVehiclesInAgendaController
    - userEmail is obtained
    from the user session
end note

note bottom of TasksRepository
    - used for displaying
    the tasks list
end note

note bottom of VehiclesRepository
    - used for displaying
    the vehicles list
end note


class AssignVehiclesInAgendaUI {
}

Repositories -> Repositories : instance
ApplicationSession -> ApplicationSession : instance

AssignVehiclesInAgendaUI .> AssignVehiclesInAgendaController

AssignVehiclesInAgendaController .> Repositories : repositories
AssignVehiclesInAgendaController ..> OrganizationRepository : organizationRepository
AssignVehiclesInAgendaController ..> TasksRepository : tasksRepository
AssignVehiclesInAgendaController ..> VehiclesRepository : vehiclesRepository

Repositories --> "1" OrganizationRepository
Repositories --> "1" TasksRepository
Repositories --> "1" VehiclesRepository

OrganizationRepository --> "*" Organization
ApplicationSession --> "1" UserSession : userSession

AssignVehiclesInAgendaController ..> "1" Organization : organization
AssignVehiclesInAgendaController ..> ApplicationSession
AssignVehiclesInAgendaController ..> UserSession
Organization "1" --> "*" Task : owns
Organization "1" --> "*" Vehicle : owns
Vehicle --> GSM : assigned by
Vehicle --> Task : assigned to

Organization "1" --> "1" GSM : has

VehicleListMapper --> "*" Vehicle : maps
VehicleListMapper --> "*" VehicleListDTO : maps
AssignVehiclesInAgendaController ..> VehicleListMapper : uses

AgendaMapper --> "*" Task : maps
AgendaMapper --> "*" AgendaDTO : maps
AssignVehiclesInAgendaController ..> AgendaMapper : uses

@enduml