--[[
This module provides the front-end to an index of Meissner and Auden's Latin 
phrasebook.  It includes three data modules.  The exported function `phrasebook' 
retrieves the calling template's argument or, if none exists, the calling page's
name, and passes this into the table found in 
"Module:R:M&A/lemmas_no_collision_to_ix_phrase", which yields a set of phrase 
indices unambiguously containing forms of the given word.  These indices are 
retrieved from the table in "Module:R:M&A/ix_to_phrase", formatted into a 
collapsed phrase list, and returned to the caller.  When no match is found, an
empty string is returned.

Approximately 78% of the words in Meissner and Auden's phrase book can be 
de-stemmed unambigously.  Those which cannot are indexed separately in the 
table exported by this module: "Module:R:M&A/lemmas_collision_to_ix_phrase".
The corresponding additional lines are added to the bottom and prefaced with the
caption: (ambiguous).  If this is too obtrusive they can be perhaps further
collapsed.
]]--

local export = {}

local special_cases = {["a"]={false}, ["de"]={true}}

function print_collapsible_list_html(ls, x)
	local lst = {}
	local count = 0
	for k,x in pairs(ls) do
		table.insert(lst, "<li>"..x.."</li>")
		count = count + 1
	end
	local expandtext = count.." "..x..(count==1 and "" or "s")
	table.insert(lst, 1, "<div class='mw-collapsible mw-collapsed' style='display: inline' data-expandtext='"..expandtext.."><ul>")
    table.insert(lst, "</ul></div>")
	return table.concat(lst)	
end

function map(f, xs)
	local s = {}
	if not (xs == nil) then for i,x in pairs(xs) do s[#s+1] = f(x) end end 
	return s 
end

function is_member(xs, i)
	if (not (xs==nil)) then for k,v in pairs(xs) do if v==i then return true end end end
	return false
end
	
function load_lemma_nc_to_ix(w)
    --return lemmas_no_collision_to_ix_phrase = mw.loadData("Module:R:M&A/lemmas_no_collision_to_ix_phrase")[w]
	return require("Module:data tables").index_table("la_RMA_lemmas_no_collision_to_ix_phrase", w)
end

function print_html(w)
	local lemmas_collision_to_ix_phrase = mw.loadData("Module:R:M&A/lemmas_collision_to_ix_phrase")	--small table, hence loaded unsharded 
	local lsNC, lsC = load_lemma_nc_to_ix(w), lemmas_collision_to_ix_phrase[w]
	local ls = {}
	if lsNC then for k,v in pairs(lsNC) do ls[#ls+1] = v end end
	if lsC then for k,v in pairs(lsC) do ls[#ls+1] = v end end
	--local ix_to_phrase = mw.loadData("Module:R:M&A/ix_to_phrase")		--needs a data_table.select_array function: table_name -> [key] -> (key -> val); TBD
	local ix_to_phrase = (w=="a" or w=="de") and special_cases[w][1] and require("Module:R:M&A/memory special cases")[w] or require("Module:data tables").index_table_all("la_RMA_index_to_phrases", ls)
	function print_phrase(i) 
		local pL, pE = ix_to_phrase[i][1], ix_to_phrase[i][2]
		local prevSubst = 1
		local n = 1
		while prevSubst > 0 do 
		  pL, prevSubst = string.gsub(pL, "_", (n%2==1 and "<i><b>" or "</b></i>"), 1)
		  pE, pS0 = string.gsub(pE, "_", (n%2==1 and "<i>" or "</i>"), 1)
		  prevSubst = prevSubst + pS0
		  n = n + 1
		end
		pL = string.gsub(pL, "%[%d%]", "")
		return (is_member(lsC, i) and "<b><i>(ambiguous)</i></b> " or "").. string.gsub(pE..": "..pL.."<br/>", ".:", ":")
	end
	local ls_html = print_collapsible_list_html(map(print_phrase, ls), "phrase")
	--return true and "True" or "False"
	return ((ls == nil and "") or ls_html)
end

function export.phrasebook(frame)
	local args = frame:getParent().args
	local w = args[1] or mw.title.getCurrentTitle().text
	if (not args[1] or args[1] == "") and mw.title.getCurrentTitle().nsText == "Template" then
		return ""
	else
		return print_html(w)
	end
end


return export