@startuml util

' Externe Packages
package Toolbox {}
note left of Toolbox: beinhaltet ZoomMaps, CodeCharts, EyeTracking
package AnalyseClient {}

package Util {
    ' --- TUTORIAL ---
    abstract Tutorial<t: ToolType> {
      - toolType: ToolType
      - configClient: ConfigClient
      __public method__
      + Tutorial(configClient: ConfigClient,toolType: ToolType)
      + start() : void
      __private methods__
      - getConfigState() : boolean
      - show() : boolean
      __abstract methods__
      - {abstract} tutorial() : void
    }

    enum ToolType {
        CODECHARTS
        EYETRACKING
        ZOOMMAPS
    }

    ' --- BILD ---

    abstract Bild {
        # location : String
        + Bild(url: String)
        + show() : void
        + hide() : void
    }

    ' DATA

    class "TrialData<t: ToolType>" as td {
        - toolType: ToolType
        - trialId: String
        - configId: String
        - startTime: DateTime
        - dataPoints: ArrayList<DataPoint>
    }

    class "DataPoint" as dp {
        - dataId : int
        - timeOffset : float
        - coordinates : int[2]
        - rasterSize : int[2]
        - zoomLevel : float
        + DataPoint()
    }

    note left of td::distanceToMonitor
        EyeTracking
    end note
    td -- dp

    ' note left of dp
    '     CodeCharts:
    '         time: float
    '         Koordinaten: int[2] // abhängig vom Raster
    '         rasterSize: int[2]
    '         Bild: String
    '         -> Array
    '     ZoomMaps:
    '         time: float
    '         BildKoordinaten: int[2] // je nach Bildauflösung
    '         zoomLevel: float
    '         Bild: String
    '         -> Array
    ' end note

    package Config {
        class ConfigClient {
            - configuration : Configuration
            + getConfig() : Configuration
            + loadConfiguration(trialId: String) : boolean
        }
        class ConfigLoader {
            + loadConfiguration(configID: String) : Configuration
        }
        class ConfigWriter {
            + writeConfiguration(configuration: Configuration) : String
        }
        class ConfigGui {
            # configState: Configuration
            + showEditor() : void
        }
        class Configuration {
            - tool : ToolType
            - trialId : String
            - codeChartsConfiguration : CodeChartsConfiguration
            - eyeTrackingConfiguration : EyetrackingConfiguration
            - zoomMapsConfiguration : ZoomMapsConfiguration
            __public methods__
            + getTool() : ToolType
            + gettrialId() : String
            + getCodeChartsConfiguration() : CodeChartsConfiguration
            + getEyeTrackingConfiguration() : EyeTrackingConfiguration
            + getZoomMapsConfiguration() : ZoomMapsConfiguration
            __private methods__
            - checkToolInput(tools: ToolType[*])
        }
        class CodeChartsConfiguration {
            - strings : String[*]
            - initialSize : int[2]
            - timings : float[2]
            + getStrings(): String[*]
            + getInitialSize(): float
            + getTimings(): float[2]
        }
        class EyetrackingConfiguration {
            - pollIntervall : float
            + getPollIntervall() : float
        }
        class ZoomMapsConfiguration {
            - speed : float
            + getSpeed() : float
        }
        abstract ToolConfiguration {
            - imageUrls : String[*]
            - tutorial : boolean
            + getImageUrls() : String
            + getTutorial() : boolean
        }

        ' ConfigClient ..> Configuration

        ConfigClient o-d- ConfigLoader : < lädt Konfiguration

        ConfigClient o-d- ConfigWriter : < schreibt Konfiguration

        ConfigClient -l- ConfigGui : < Konfigurationsbearbeitung

        Configuration ..> ZoomMapsConfiguration
        Configuration ..> CodeChartsConfiguration
        Configuration ..> EyetrackingConfiguration

        ZoomMapsConfiguration --|> ToolConfiguration
        CodeChartsConfiguration --|> ToolConfiguration
        EyetrackingConfiguration --|> ToolConfiguration
    }

    ' SpeicherUtilities
    class SpeicherUtilities {
        - Location: String
        + SpeicherUtilities(location: String)
        + getLocation() : String
        + setLocation(location: String) : boolean
        + deleteData(inputString: String) : boolean
        + searchData(inputString: String) : TrialData
        + saveData(inputData: TrialData) : boolean
    }

    ' Interaktionen
    ' Tutorial -- ToolType
    ' Tutorial -u- Config
    ' td -- ToolType
    ' ConfigClient -r- Speichermedium

}
' Externe Module
ConfigClient -u- Toolbox
SpeicherUtilities -- Toolbox : < TrialData
SpeicherUtilities -- AnalyseClient : > TrialData

@enduml
