@startuml

title LimpiaTek: Robot Assignment System



Cliente <|-- ClientePlatinum
Cliente <|-- ClienteClassic
Cliente <|-- ClienteEconomic

Tarea <|-- Limpieza
Tarea <|-- Ordenamiento
Tarea <|-- Lustre

Robot <|-- RobotK311Yfl
Robot <|-- RobotK311Yfu
Robot <|-- RobotP011H
Robot <|-- RobotK311Ya
Robot <|-- RobotS031RTY

SURFACE *-- Pedido
SERVICE *-- Pedido


abstract Cliente {
    - deuda:float
    - ID:int
    - monthlyFee:float
    + realizarPedido():Pedido
    + obtenerRobotMasApropiado(List<Robot>):Robot
    'En el mismo ademas de lo que especifica el enunciado se le pide al cliente la cantidad que va a abonar del total para que en caso de tener deudas, se agregue al archivo de f_deudaXCliente'
}
'try except o switch como en C/C++'
class ClientePlatinum {
    - tarifa:float
}
class ClienteClassic {
    - tarifa:float
    - cantOrdenamientosRestantesMesActual:int
}
class ClienteEconomic {
    - tarifa:float
    - cantLimpiezasRestantesMesActual:int
}


'VER COMO RELACIONAR PEDIDO CON TAREA'
class Pedido {
    - tipoServicio:SERVICE
    - service[3<enum>]:boolean
    - superficie:SURFACE
    - lugar:String
}
enum SURFACE {
    NOT_APPLICABLE
    'Cualquier cosa le preguntamos a Ale'
    PISO
    MUEBLES
    PISO_Y_MUEBLES
}
enum SERVICE {
    LIMPIEZA
    ORDENAMIENTO
    LUSTRE
}


class Pedido {
    -tareas[-CEnumIDTarea-]:boolean
    'true si incluye el tipo de tarea'
    -superficie:Superficie
    -placeDir:String
}

abstract Tarea {
    +getTipo():int-CEnumIDTarea-
}
class Limpieza {
    - esCompleja:boolean
}
class Ordenamiento {
}
class Lustre {
}


abstract class Robot {
    - nombre:String
    - costo:float
    '- disponible:boolean'
    'Se puede preguntar con un pedidosPendientes.size/length'
    - pedidosPendientes:ArrayList<Pedido>
    - funciones:HashSet<Integer-CEnumIDTarea->

    + hasTheFunctionalities(boolean[]):boolean
    + agregarPedido(Pedido):void
    + tieneLasFuncionalidades(tareas[]):boolean
    + realizarTarea(Tarea):void
}
class RobotK311Yfl {
}
class RobotK311Yfu {
}
class RobotP011H {
}
class RobotK311Ya {
}
class RobotS031RTY {
}
'VER CON ALE'
'Cuando los robots finalizan su tarea, lo informan al sistema utilizando un módulo de comunicación; esto'
 'permite saber los pedidos pendientes de cada robot.'

'Para que puedan ser polimorficos los robots:'
'Tendrian que o tener una clase por c/u y que dentro de Robot se incluyan las opciones ordenar, limpiar y lustrar como si todos las tuvieran disponibles'
'o tener una lista de tareas '


'En el main:
'Robot robots[5] = {new(), new(), new(), new(), new()}
'enum ROBOT { K311, S421, ... }'
'Main == tests'

' if cliente instanceof ClientePlatinum:
'
' NO HAY QUE HACER UN MAIN '
' NO VAMOS A USAR HILOS '
' VER LO DE MOCK OBJECT PARA LA PARTE DE PAGOS QUE NO LA IBAMOS A TENER QUE IMPLEMENTAR PERO SI USAR MOCK OBJECTS PARA RESOLVERLA'
interface Pagos {
    + getClientDebt(Cliente):float
    + setClientDebt(float amount)
    + getClientMonthlyFee(Cliente)
    + setClientMonthlyFee(float amount)
    + updateDebt(Cliente)
    + makePayment(float amount)
    + isDebtor(Cliente, float):boolean
    'El float es la cantidad a acutalizar; puede ser positiva o negativa'
}

Sistema <|.. Pagos
Cliente <--Pagos

'


class Sistema {
    -f_regPedidosXRobot:File<Pedido>
    -f_clientesEconomic:File<ClienteEconomic>
    -f_clientesClassic:File<ClienteClassic>
    -f_clientesPlatinum:File<ClientePlatinum>
    '-f_IDClientesPorUsar:File<int(ID)>
    'Ordenado por ID de cliente PUP'
    -Robot robot[5]:Robot
    '-IDClientesPorUsar:ArrayList<Integer>

    + procesarPedido(Pedido):void
    + esCliente(Cliente):boolean
    + validarPedido(Pedido):int(enum)>>>Pagos
    - obtenerRobotsQueTienenLasFuncionalidades(boolean[]):List<Robot>
    + asignarRobot(Pedido):Robot
}






@enduml