-- Versionsnummer. Diese dient vor allem zu Diagnosezwecken.
-- Ich weiss jetzt noch nicht, wie viele verschiedene Versionen von dem Script spaeter herumfliegen werden.
KsKitVer=0

Kennzahl=34

local Callbacks = {}

function On(Name, Funktion)
  -- Erlaube es, Signal und Weichen via Nummer zu referenzieren
  if type(Name) == "number" then
    if EEPGetSwitch(Name) > 0 then
      Name = "EEPOnSwitch_"..tostring(Name)
    elseif EEPGetSignal(Name) > 0 then
      Name = "EEPOnSignal_"..tostring(Name)
    end
  end
  if type(Name) == "table" then
    for _, Newname in pairs(Name) do
      On(Newname, Funktion)
    end
    return
  end
  if type(Name) ~= "string" or string.match(Name, "EEP.+") == nil then
    print("Verweigere Callback von "..type(Name).." "..tostring(Name))
    return
  end
  if not Callbacks[Name] then
    Callbacks[Name] = {}
    if _G[Name] ~= nil then
      print("Warnung: "..Name.."() von KsKit adoptiert")
      table.insert(Callbacks[Name], _G[Name])
    end
    _G[Name] = function(...)
      for cnt = 1, #Callbacks[Name] do
        Callbacks[Name][cnt](...)
      end
      -- Nur EEPMain braucht dies, aber dringends
      return 1
    end
    -- Bei Weichen und Signalen muss EEP vorher informiert werden
    -- Item ist normal "Switch" oder "Signal"
    local Item, Number = string.match(Name, 'EEPOn(.+)_(%d+)')
    if Number ~= nil then
      _G["EEPRegister"..Item](Number)
    end
  end
  table.insert(Callbacks[Name], Funktion)
end

-- EEPMain-Callback registrieren
function Main(Funktion)
  On("EEPMain", Funktion)
end

-- Signal-Callback registrieren
function OnSignal(Signal, Funktion)
  On("EEPOnSignal_"..tostring(Signal), Funktion)
end

-- Weichen-Callbacks registrieren
function OnSwitch(Switch, Funktion)
  On("EEPOnSwitch_"..tostring(Switch), Funktion)
end

-- Referenz-Datenbank mit Signalen, Fahrstrassen & Weichen
-- Geordnet nach Signal-ID
KsSignale = {}

-- KsSignale von GK3 sind sehr systematisch benannt, die moeglichen Stellungen lassen sich aus dem Namen herleiten
function GK3KsBegriffe(Modell)
  local Teile = {}
  for str in string.gmatch(Modell, "([^_ ]+)") do
    Teile[str]=true
  end
  local Stellungen = {}

  -- Halt am Hauptsignal
  if Teile["A"] or Teile["B"] then
    table.insert(Stellungen, {"Hp0"})
  end

  -- Halt erwarten
  -- ... am Wiederholer 
  if Teile["VSigWdh"] then
    table.insert(Stellungen, {"Ks2","Kl"})
  end
  -- ... An MAS oder Vorsignalen
  if Teile["MAS"] or Teile["VSig"] then
    if Teile["verkuerzt"] then
      table.insert(Stellungen, {"Ks2","Kl"})
    end
    table.insert(Stellungen, {"Ks2"})
    if Teile["Kl"] then
      table.insert(Stellungen, {"Ks2","Kl"})
    end
  end

  -- Fahrt/Fahrt erwarten
  table.insert(Stellungen, {"Ks1"})

  -- Langsamfahrt erwarten
  -- ... am Wiederholer
  if Teile["VSigWdh"] then
    table.insert(Stellungen, {"Ks1bl","Kl"})
  end
  -- ... am MAS oder Vorsignalen
  if Teile["MAS"] or Teile["VSig"] or Teile["VSigWdh"] then
    if Teile["verkuerzt"] then
      table.insert(Stellungen, {"Ks1bl","Kl"})
    end
    table.insert(Stellungen, {"Ks1bl"})
    if Teile["Kl"] then
      table.insert(Stellungen, {"Ks1bl","Kl"})
    end
  end

  -- Rangierfahrt an Ausfahrsignalen
  if Teile["A"] then
    table.insert(Stellungen, {"Sh1"})
  end

  -- Ersatzsignal an Ausfahrsignalen und Blocksignalen ohne Vorsichtssignal
  if Teile["A"] or (Teile["B"] and not Teile["V"]) then
    table.insert(Stellungen, {"Zs1"})
  end

  -- Vorsichtssignal an Hauptsignalen
  if Teile["V"] then
    table.insert(Stellungen, {"Zs7"})
  end

  -- Kennlicht
  if Teile["Kl"] or Teile["VSigWdh"] or Teile["verkuerzt"] then
    table.insert(Stellungen, {"Kl"})
  end

  -- Dunkel geschaltet
  table.insert(Stellungen, {})
  return Stellungen
end

local GK3KsBauarten={
  "Ks_Sig_A",
  "Ks_Sig_A_MAS",
  "Ks_Sig_A_MAS_Kl",
  "Ks_Sig_A_V",
  "Ks_Sig_A_V_MAS",
  "Ks_Sig_A_V_MAS_Kl",
  "Ks_Sig_B",
  "Ks_Sig_B_MAS",
  "Ks_Sig_B_V",
  "Ks_Sig_B_V_MAS",
  "Ks_Sig_B_V_MAS_Kl",
  "Ks_Sig_VSig",
  "Ks_Sig_VSigWdh",
  "Ks_Sig_VSig_verkuerzt"
}

for cnt=1, #GK3KsBauarten do
  _G[GK3KsBauarten[cnt]]=function(Meta)
    Signal=Meta[1]
    Meta[1] = nil
    -- Falls kein name gegeben, einen generieren
    if Meta.Name == nil then
      Meta.Name = string.format("%d", Signal)
    end
    if type(Meta.Schild) == "number" then
      Meta.Schild="#"..tostring(Meta.Schild)
    end
    Meta.Kennzahl = Kennzahl
    Meta.Begriffe = GK3KsBegriffe(GK3KsBauarten[cnt])
    KsSignale[Signal] = Meta
  end
end

function KsSignalBezeichner()
  for Signal, Meta in ipairs(KsSignale) do
    if Meta.Schild ~= nil then
      EEPStructureSetTextureText(Meta.Schild, 1, Meta.Kennzahl)
      EEPStructureSetTextureText(Meta.Schild, 2, Meta.Name)
    end
  end
end
