classDiagram    
    class GridObject
    class Unit
    class Building
    
    class Action
    class Interact
    class Attack
    class Movement

    class Ability
    class AbilityEffect

    class TurnManager
    
    class Squad
    class PlayerSquad
    class AllySquad
    class EnemySquad
    class Spawner
    class BuildingSquad

    class Health
    class Interactable
    class EscapePod
    class McGuffin

graph TD
TurnManager *-- Squad
PlayerSquad *-- Unit
EnemySquad *-- Unit
AllySquad *-- Unit
BuildingSquad *-- Building
GridObject <|-- Unit
GridObject <|-- Building
GridObject *-- Interactable
GridObject *-- Health
Unit *-- Action
Unit *-- Ability
Ability *-- AbilityEffect
Action <|-- Interact
Action <|-- Attack
Action <|-- Movement
Squad <|-- PlayerSquad
Squad <|-- AllySquad
Squad <|-- EnemySquad
Squad <|-- Spawner
Squad <|-- BuildingSquad
Interactable <|-- McGuffin
Interactable <|-- EscapePod
classDiagram
Singleton --|> CombatManager 
GridObject --|> Unit
GridObject --|> Building
CombatManager --> Unit : Association
CombatManager --> CombatEventsChannelSO : invokes and listens to
CombatManager --> GameState : Association

Unit --> CombatEventsChannelSO : invokes and listens to

class GameState{ 
    <<enum>>
    PlayerTurn
    EnemyTurn
    EnemySpawn
}

class CombatManager{ 
    -Dictionary<Unit,bool> playerUnits
    -Dictionary<Unit,bool> enemyUnits
-CombatEventsChannelSO _CombatChannel

+Unit ActiveUnit
+int turnCount
+GameState currentState

-void PopulateCombatList()
-void SortUnitsByInitiative()
-void FindNextEnemy()
-bool CheckIfAllUnitsExhausted(Dictionary<Unit,bool>)
-void OnUnitExhaust(object, CombatEventChannelSO.OnUnitExhaustEventArgs)
-void OnUnitAPChange(object, CombatEventChannelSO.OnUnitAPGainEventArgs)
+void SetActiveUnit(Unit newActiveUnit)
-void StartEnemyTurn()
+void NextGameState()
-void EndTurn()
}
     
class CombatEventsChannelSO{ 
+event EventHandler<OnUnitExhaustEventArgs> OnUnitExhaust
+class OnUnitExhaustEventArgs
+event EventHandler<OnUnitAPGainEventArgs> OnUnitAPGain
+class OnUnitAPChangeEventArgs
+event EventHandler<OnActiveUnitChangeArgs> OnActiveUnitChange
+class OnActiveUnitChangeArgs
+event EventHandler<OnGameStateChangeEventArgs> OnGameStateChange;
+class OnGameStateChangeEventArgs
+ event EventHandler<OnTurnEndEventArgs> OnTurnEnd
+class OnTurnEndEventArgs

+void RaiseOnUnitExhaustEvent(Unit)
+void RaiseOnUnitAPGainEvent(Unit)
void RaiseActiveUnitChangeEvent(Unit)
void RaiseOnGameStateChangeEvent(GameState)
void RaiseOnTurnEndEvent(int)
}

class Unit { 
-Tilemap _tilemap
-GridData _gridData
-Vector3Int _currentCellPos
+bool playerSquad
+string unitName
+CustomTile tileOverlay
+Tilemap overlayTilemap

-CombatEventsChannelSO _CombatChannel
-bool _activeUnit

+int MoveDistance
-int maxAP
+int currentAP

 -void Spawn()
 -void ResetAP()
 -void OnUnitSelected(object, CombatEventsChannelSO.OnActiveUnitChangeArgs)
 +void ExecuteAction()
 -void OnTurnEnd(object, CombatEventsChannelSO.OnTurnEndEventArgs)
 +void Move(List<TileInfo>)
 -void UpdatePositionOnGrid()
 +public List<Vector3Int> FindWalkableTiles()
}

class Singleton{ 
-static T instance;
+static T Instance

+static bool IsInitialized

#virtual void Awake()
#virtual void OnDestroy()
}

class GridObject { 
    <<Interface>>
    var position
    void Remove()
}

class Building{ 

}

classDiagram

class GridObject

class Unit

class Building

class Action

class Interact

class Attack

class Movement

class Ability

class HP_Change

class Build

class Construct

class Utility

class CrowdControl

class TurnManager

class Squad

class PlayerSquad