local p = {}

local sub = mw.ustring.sub
local find = mw.ustring.find
local gmatch = mw.ustring.gmatch
local match = mw.ustring.match
local trim = mw.text.trim
local insert = table.insert
local concat = table.concat

function p.caserequests ( frame )
	frame = frame or mw.getCurrentFrame()
	local page = mw.title.new('Wikipedia:Arbitration/Requests/Case'):getContent()
	
	local re = '\n==%f[^=](.-)=='
	local sections = {}
	local count, loc = 0, 0
	repeat
		loc = find(page, re, loc+1)
		if (loc) then
			count = count + 1
			sections[count] = {
				id = count, 
				start = loc,
				title = trim(match(page, re, loc))
			}
		end
	until not loc
	
	for i=1, count, 1 do
		local sec = sections[i]
		local content = ''
		if sections[i+1] then
			content = sub( page, sec.start, sections[i+1].start )
		else
			content = sub( page, sec.start )
		end
		
		local redate = '%d%d?%s%a*%s%d%d%d%d%f[(%s%(UTC%)]'
		sec.date = match(content, redate)
		
		local remotion = '\n====?([^\n]*[Mm]otion[^\n]-)====?'
		local m = match(content, remotion)
		if (m) then 
			sec.motion = trim(m)
		end
		
		local revotes = '\n===[^\n]*<(%d+/%d+/%d+)>%s*==='
		sec.votes = match(content, revotes)
	end

	local result = {}
	for i=1, count, 1 do
		local sec = sections[i]
		local s = frame:expandTemplate{
			title = 'ArbComOpenTasks/line',
			args = {
				mode = 'caserequest',
				name = sec.title,
				date = sec.date,
				motion = sec.motion,
				votes = sec.votes
			}
		}
		insert(result, s)
	end
	
	return concat(result, '\n')
end

function p.arca ( frame )
	frame = frame or mw.getCurrentFrame()
	local page = mw.title.new('Wikipedia:Arbitration/Requests/Clarification and Amendment'):getContent()
	
	local re = '\n==%f[^=](.-)=='
	local sections = {}
	local count, loc = 0, 0
	repeat
		loc = find(page, re, loc+1)
		if (loc) then
			count = count + 1
			sections[count] = {
				id = count, 
				start = loc,
				title = trim(match(page, re, loc))
			}
		end
	until not loc
	
	for i=1, count, 1 do
		local sec = sections[i]
		local content = ''
		if sections[i+1] then
			content = sub( page, sec.start, sections[i+1].start )
		else
			content = sub( page, sec.start )
		end
		
		local redate = '%d%d?%s%a*%s%d%d%d%d%f[(%s%(UTC%)]'
		sec.date = match(content, redate)

		local remotion = '\n====?([^\n]*[Mm]otion[^\n]-)====?'
		local m = match(content, remotion)
		if (m) then 
			sec.motion = trim(m)
		end
		
		local relink = '{{RFARlinks%|(.-)}}'
		sec.link = match(content, relink)
	end

	local result = {}
	for i=1, count, 1 do
		local sec = sections[i]
		local s = frame:expandTemplate{
			title = 'ArbComOpenTasks/line',
			args = {
				mode = 'amendment',
				name = sec.title,
				date = sec.date,
				motion = sec.motion,
				link = sec.link
			}
		}
		insert(result, s)
	end
	
	return concat(result, '\n')
end

function p.motions ( frame )
	frame = frame or mw.getCurrentFrame()
	local page = mw.title.new('Wikipedia:Arbitration/Requests/Motions'):getContent()
	local re = '\n==%f[^=](.-)=='
	local sections = {}
	local count, loc = 0, 0
	repeat
		loc = find(page, re, loc+1)
		if (loc) then
			count = count + 1
			sections[count] = {
				id = count, 
				start = loc,
				title = trim(match(page, re, loc))
			}
		end
	until not loc
	
	for i=1, count, 1 do
		local sec = sections[i]
		local content = ''
		if sections[i+1] then
			content = sub( page, sec.start, sections[i+1].start )
		else
			content = sub( page, sec.start )
		end
		
		local redate = '%d%d?%s%a*%s%d%d%d%d%f[(%s%(UTC%)]'
		sec.date = match(content, redate)
	end

	local result = {}
	for i=1, count, 1 do
		local sec = sections[i]
		local s = frame:expandTemplate{
			title = 'ArbComOpenTasks/line',
			args = {
				mode = 'motion',
				name = sec.title,
				date = sec.date,
			}
		}
		insert(result, s)
	end
	
	return concat(result, '\n')
end

return p