@startuml ClassDiagram
enum Direction
{
    N,NO,O,SO,S,SW,W,NW
}

enum SnowProblem
{
    Neuschnee, Triebschnee, Nassschnee, Altschnee, Gleitschnee
}

enum AvalancheLevel
{
    gering, mäßig, erheblich, groß, sehr_groß
}

enum RiskLevel
{
    niedrig,mittel,hoch
}

struct Position
{
    + int longitude <<get>>, <<set>>
    + int latitude <<get>>, <<set>>
}

struct AvalancheLevel_Height
{
    + int UpperLimit <<get>>, <<set>>
    + AvalancheLevel AvalancheLevel <<get>>, <<set>>
}

class AvalancheStatusReport
{
    - List<AvalancheLevel_Height> AvalancheLevel_ac2Height
    - Dictionary<Direction, List<SnowProblem>> SnowProblem_Direction
    + void printReport(string filepath)
    + void printReport()
    + AvalancheLevel getAvalancheLevel_Height(height int)
    + SnowProblem getSnowProblem_Dircetion(direction Direction)
    + AvalancheStatusReport()
    + AvalancheStatusReport(object)
}

class Map
{
    - Position NWReference
    - Position SEReference
    - double[][] MapData
    - Position NWReference
    - Position SEReference
    - string UTMZoneReference
    + bool PositionOnMap(Position position)
    + int getGradient(Position position)
    + Direction getDirection(Position position)
    + int getHeightAboveSL(Position position)
    + Map()
}

class Warnings
{
    + void PushMessage(object,RiskEventArgs)
    + void Sound(object,RiskEventArgs)
    + void MessagewithFlashingLight(object,RiskEventArgs)
}

class Logging
{
    - static string? Filepath;
    + void LogPosition(object,PositionChangedEventArgs)
    + void LogWarning(object,RiskEventArgs)
    + Logging(string filepath)
}

class PositionChangedEventArgs
{
    + Position Position
    + DateTime Time
}

class RiskEventArgs
{
    + Position Position
    + DateTime Time
    + RiskLevel RiskLevel
    + SnowProblem SnowProblem
}

class AvalancheWarnSystem
{
    + event EventHandler<PositionChangedEventArgs>? OnPositionChanged
    + event EventHandler<RiskEventArgs>? OnRiskAbove1
    + event EventHandler<RiskEventArgs>? OnRiskAbove2
    - Logging? myLogging
    + Map thisMap
    + AvalancheStatusReport myAVSReport
    + RiskLevel[][] RiskMatrix
    - Position CurrentPosition 
    + void manipulatePosition(Position position)
    + void EvaluatePosition()
    + void CountinuousEvaluatePosition(int SleepTime)
    - void InitiateLogging()
    - void ConfigurateWarnings()
    - RiskLevel[][] RiskMatrixFromTxt(string path)
    + AvalancheWarnSystem()
    + AvalancheWarnSystem(object test)
}

struct WorkingPosition
{
    Time:int
    Postion:Position    
}
class SimulationSystem
{
    - AvalancheWarnSystem myWarnSystem
    - List<WorkingPosition> Route
    - ReadinTestRoute():List<WorkingPosition>
    - PositionSimulation()
    + Main()
}

RiskEventArgs --* Warnings
PositionChangedEventArgs --* Logging
EventArgs <|-- RiskEventArgs
EventArgs <|-- PositionChangedEventArgs
AvalancheLevel_Height --> AvalancheStatusReport
Position --* RiskEventArgs
Position --* PositionChangedEventArgs
Position --* AvalancheWarnSystem
AvalancheStatusReport --* AvalancheWarnSystem
Map --* AvalancheWarnSystem
AvalancheWarnSystem --* SimulationSystem
WorkingPosition --* SimulationSystem

@enduml
