Modul:Chronik

local p = {}
local str = require("Modul:String")
local srf = require("Modul:Subrefs")
local com = require("Modul:Common")
local lfd = require("Modul:LinkFormDatum")
local lsd = require("Modul:LinkSubformDatum")

function p.Abfrage(frame)
	local title = mw.title.getCurrentTitle().text
	local page = frame.args[1] or title
	local t = p.abfrage(page)
	return frame:preprocess(t)
end

function p.abfrage(page)
	local results = mw.smw.ask(
		'[[Startjahr::' .. page .. ']] ' ..
		--'[[Artikel::!' .. page .. ']] ' ..
		[[
			|?Schlagzeile
			|?Beschreibung
			|?Startdatum
			|?Starttag
			|?Startjahr
			|?Enddatum
			|?Endtag
			|?Endjahr
			|?Artikel
			|?Option
			|?Thema
		]])
	local t = ''
	for i, r in ipairs(results or {}) do
		t = t .. '* ' .. r["Startdatum"] .. ' - ' 
		t = t .. r["Beschreibung"]
		t = t .. "\n"
	end
	return t
end

function p.AbfrageJahrestag(frame)
	return p.abfrageJahrestag(frame.args[1])
end

function p.abfrageJahrestag(year_day)
	return year_day
end

function p.AbfrageJahr(frame)
	return p.abfrageJahr(frame.args[1])
end

function p.abfrageJahr(year)
	return year
end

function p.Eintrag(frame)
	local title = mw.title.getCurrentTitle().text
	local daterange = frame.args[1]
	local text = frame.args[2] or ""
	local option = frame.args[3]
	local thema = frame.args["Thema"] or "Ereignis"
	local year = nil
	if com.istJahreszahl(title) then
		year = title
	end
	local data = p.dateParser(daterange, year)
	local ds = ''
	if not com.isEmpty(data['Starttag']) then
		if data['Starttag']:match("^%d") then
			ds = '[[' .. data['Starttag'] .. ']] '
		else
			ds = data['Starttag'] .. ' '
		end
	end
	if not year then
		ds = ds .. '[[' .. data['Startjahr'] .. ']]'
	end
	if data['Enddatum'] then
		ds = ds .. "- [[" .. data['Endtag'] .. "]]"
		if not year then
			ds = ds .. "[[" .. data['Endjahr'] .. "]]"
		end
	end
	data['Beschreibung'] = text
	data['Option'] = option
	data['Thema'] = thema
	data['Artikel'] = title
	mw.smw.subobject(data)
	
	local t
	if option == "nodate" then
		t = srf.subrefs(text)
	else
		t = ds .. ': ' .. srf.subrefs(text)
	end
	return frame:preprocess(t)
end

function p.dateParser(s, year)
	local start_date, end_date = p.splitDateString(s, year)
	start_date, end_date = p.completeDates(start_date, end_date, year)
	local sdf = lfd.humanToFormDate(start_date)
	local data = {
		['Startdatum'] = sdf,
		['Startjahr'] = lsd.getYear(sdf),
		['Starttag'] = lsd.getMonthday(sdf)
	}
	if end_date then
		local edf = lfd.humanToFormDate(end_date)
		data['Enddatum'] = edf
		data['Endjahr'] = lsd.getYear(edf)
		data['Endtag'] = lsd.getMonthday(edf)
	end
	mw.logObject(data)
	return data
end

function p.completeDates(start_date, end_date, year)
	--[[Jetzt müssen die gesplitteten Datum vervollständigt werden. Kann ja 
	sein, daß etwas wie 6. - 10. Januar angegeben ist. Und das Jahr, wenn nicht
	gegeben, muß auch aus dem year entnommen werden können.]]
	
	--start_date = str.strip(start_date)
	--end_date = str.strip(end_date)
	
	local sd = str.split(start_date, ' ')
	if not com.isEmpty(end_date) then
		-- Wenn ein Enddatum gegeben ist
		local ed = str.split(end_date, ' ')
		mw.logObject(ed)
		if com.len(ed) == 2 then
			-- Wenn das Enddatum kein Jahr enthält, füge es aus year hinzu
			ed[3] = year
			end_date = end_date .. " " .. ed[3]
		end
		if com.len(sd) == 2 then
			-- Wenn das Startdatum kein Jahr enthält, hole es von Enddatum
			start_date = start_date .. " " .. ed[3]
		elseif com.len(sd) == 1 then
			-- Startdatum enthält weder Monat noch Jahr, hole sie von Enddatum
			start_date = start_date .. " " .. ed[2] .. " " .. ed[3]
		end
	else
		-- Wenn nur ein Startdatum gegeben ist
		if year == nil then
			return start_date, end_date
		end
		if com.len(sd) == 2 then
			-- Wenn das Startdatum kein Jahr enthält, hole es aus year
			sd[3] = year
			start_date = start_date .. " " .. sd[3]
		elseif com.len(sd) == 1 then
			sd[3] = year
			start_date = start_date .. " " .. sd[3]
		end
	end
	return start_date, end_date
end

function p.splitDateString(s)
	-- Teilt ein von/bis Datum in Start- und End-Datum auf.
	local dates = str.split(s, "-")
	-- Wenn splitten mit "-" nur ein Ergebnis bringt, splitte mit "bis"
	if com.len(dates) == 1 then
		dates = str.split(s, "bis")
	end
	-- Alle Leerzeichen links und rechts in den Ergebnissen entfernen
	for i, v in ipairs(dates) do
		dates[i] = str.strip(dates[i])
	end
	return dates[1], dates[2]
end

return p