@startuml
'https://plantuml.com/sequence-diagram


skinparam style strictuml
skinparam classAttributeIconSize 0
skinparam classFontStyle Bold
hide enum methods

interface AntFacadeController {
setParameters(Integer evaporationParam, Integer foodParam, Integer pheromoneParam)
createGrid(Integer width, Integer height)
putObstacle(Integer row, Integer column)
putFood(Integer row, Integer column, Integer quantity)
createColony(Integer row, Integer column)
createSoldiers(Integer amount)
createWorkers(Integer amount)
setAntFile(String antLogFile)
play(Integer duration, boolean record) : BitSet[*]
}

class Controller implements AntFacadeController {
- displaySize:Integer
- iterationWait:Integer
+ evaporationParam:Integer
+ foodParam:Integer
+ pheromoneParam:Integer

+setParameters( Integer evaporationParam, Integer foodParam, Integer pheromoneParam)
+createGrid( Integer width, Integer height)
+putObstacle(Integer row, Integer column)
+putFood(Integer row, Integer column, Integer quantity)
+createColony(Integer row, Integer column)
+createSoldiers(Integer amount)
+createWorkers(Integer amount)
+setAntFile(String antLogFile)
+play( Integer duration, boolean record ) : BitSet[*]
}

Controller "+graph\n1" -- "1" Graph : > has

class Graph {
}

class RectangleGraph extends Graph {
+sizeX:Integer
+sizeY:Integer

+RectangleGraph(x:Integer, y:Integer)
+generateRectangleGrid()
+getNodeFromXY(x:Integer, y:Integer):Node
+getNodeXY(Node node):Integer[2]
+toBitSet():BitSet[*]

}

Graph "+nodes\n1" *-- "sizeX*sizeY" Node : > contains
Graph "+anthillNode\n1" -- "1" Node : > knows

class Node {
+ getContent():NodeType
+ setAsObstacle()
+ setAsFood(amount:Integer)
+ setAsFree()
+ setAsAnthill()
}

Node "+neighbors\n*" -- "*" Node : > knows
Node "-content \n 1" o-- "-parentNode \n 1" NodeType : > contains

abstract class NodeType {
+ NodeType(parent:Node)
+ getParentNode():Node
}

class ObstacleType extends NodeType {
+ObstacleType(parent:Node)
}

abstract class FreeType extends NodeType {
+ getSoldierAmount():Integer
+ getWorkerAmount():Integer
}

FreeType "+ants\n1" o-- "*" Ant : contains >

class FoodType extends FreeType {
- amount:Integer
+ FoodType(parent:Node, amount:Integer)
+ getAmount():Integer
+ eat(amount:Integer):Integer
+ drop(amount:Integer)
}

class PheromoneType extends FreeType {
- amount:Integer
+ PheromoneType(parent:Node)
+ getAmount():Integer
+ add(amount:Integer)
+ evaporate(amount:Integer)
}

class Anthill extends FoodType {
+Anthill(parent:Node)
+spawnSoldier(amount:Integer)
+spawnWorkers(amount:Integer)
}

class Queen extends Ant {
+Queen(anthillNode:Node)
}

abstract class Ant {
# switchNode(destination:Node)
+ getCurrentNode():Node
}

Ant "-currentNode\n1" o-- "*" Node : is in >

interface MovableInterface {
+ move(neighbors:Nodes[*])
}

class Soldier extends Ant implements MovableInterface {
{static}-random:Random
+ Soldier(anthillNode:Node)
+ move(neighbors:Nodes[*])
}

class Worker extends Ant implements MovableInterface {
{static}-random:Random
- foodAmount:Integer
+ Worker(anthillNode:Node)
+ move(neighbors:Nodes[*])
- depositPheromone()
- dropFood()
- eat()
- lookForFood(neighbors:Nodes[*]):Node
}

Worker "-history\n1" *-- "*" NodeHistory : has >

class NodeHistory {
+ add(node:Node)
+ clear()
+ goBack():Node
}

NodeHistory "-nodes\n*" o-- "*" Node : contains >


@enduml