@startuml

skinparam class {
  backgroundColor whitesmoke
  arrowColor dimgrey
  borderColor dimgrey
}

' Abstract Factory Patter
' Factory -> MeasurementNetwork

class Client
note right of Client
This is i.e. pyaerocom initiated by a config
or a user with a jupyter notebook
end note

interface pyaro {
  + list_timeseries_engines() : dict[name, timerseries.Engine]
  + open_timeseries_reader(name, args): timeseries.Reader
  + list_profiles_engines() : dict[name, profiles.Engine]
  + open_profiles_reader(name, args): profiles.Reader
}

interface timeseries.Engine {
  + open(args): Reader
  + args(): [str]
  + supported_filters(): str
  + description(): str
  + url(): str_to_docs
}

class EBASTimeseriesEngine {
  + open(args): EbasTimeseriesReader
  ...
}

class EEATimeseriesEngine {
  + open(args): EbasTimeseriesReader
  ...
}

interface timeseries.Reader {
  + __init__(args)
  --
  + data(): Data
  + stations(): dict[str, Station]
  + variables(): [str]
  + close()
}

class EBASTimeseriesReader {
  + __init__(args)
  --
  + data(): TimeseriesData
  ...
}

class EEATimeseriesReader {
  + __init__(args)
  --
  + data(): TimeseriesData
  ...
}

interface profiles.Engine {
  + open(args): Reader
  + args(): [str]
  + supported_filters(): str
  + description(): str
  + url(): str_to_docs
}

interface profiles.Reader {
  + __init__(args)
  --
  TBD
}

class EBASProfilesReader {
}

class EEAProfilesReader {
}

timeseries.Engine <|.. EBASTimeseriesEngine
timeseries.Engine <|.. EEATimeseriesEngine

timeseries.Reader <|.. EBASTimeseriesReader
timeseries.Reader <|.. EEATimeseriesReader

profiles.Engine <|.. EBASProfilesEngine
profiles.Engine <|.. EEAProfilesEngine

profiles.Reader <|.. EBASProfilesReader
profiles.Reader <|.. EEAProfilesReader


EEAProfilesEngine ..> EEAProfilesReader
EEATimeseriesEngine ..> EEATimeseriesReader

EBASProfilesEngine ..> EBASProfilesReader
EBASTimeseriesEngine ..> EBASTimeseriesReader

Client ..> pyaro: import
pyaro ..> timeseries.Engine
pyaro ..> profiles.Engine
Client ..> timeseries.Engine: interacts
Client ..> timeseries.Reader : interacts
Client ..> profiles.Engine : interacts
Client ..> profiles.Reader : interacts


@enduml
