local export = {}

local m_links = require("Module:links")
local m_ipa = require("Module:IPA")

local Vietnamese = {
	"[[tôi]] (<span style=\"font-variant:small-caps;\">1sg</span>)",
	"[[bạn]] (<span style=\"font-variant:small-caps;\">2sg</span>)",
	"[[anh]] [[ấy]], [[cô]] [[ấy]], [[nó]] (<span style=\"font-variant:small-caps;\">3sg</span>)",
	"[[chúng tôi]] (<span style=\"font-variant:small-caps;\">1pl</span>)",
	"[[các bạn]] (<span style=\"font-variant:small-caps;\">2pl</span>)",
	"[[họ]] (<span style=\"font-variant:small-caps;\">3pl</span>)",
	"[[này]]",
	"[[đó]]",
	"[[đây]]",
	"[[đấy]]",
	"[[ai]]",
	"[[gì]]",
	"[[đâu]]",
	"[[khi nào]]",
	"[[thế nào]]",
	"[[không]]",
	"[[tất cả]]",
	"[[nhiều]]",
	"[[một số]]",
	"[[vài]]",
	"[[khác]]",
	"[[một]]",
	"[[hai]]",
	"[[ba]]",
	"[[bốn]]",
	"[[năm]]",
	"[[to]], [[lớn]]",
	"[[dài]]",
	"[[rộng]]",
	"[[dày]]",
	"[[nặng]]",
	"[[nhỏ]]",
	"[[ngắn]]",
	"[[hẹp]]",
	"[[mỏng]]",
	"[[phụ nữ]]",
	"[[đàn ông]]",
	"[[người]]",
	"[[trẻ]]",
	"[[vợ]]",
	"[[chồng]]",
	"[[mẹ]]",
	"[[bố]]",
	"[[động vật]]",
	"[[cá]]",
	"[[chim]]",
	"[[chó]]",
	"[[rận]], [[chí]]",
	"[[rắn]]",
	"[[giun]]",
	"[[cây]]",
	"[[rừng]]",
	"[[gậy]]",
	"[[quả]], [[trái cây]]",
	"[[hạt]]",
	"[[lá]]",
	"[[rễ]]",
	"[[vỏ]] [[cây]]",
	"[[hoa]]",
	"[[cỏ]]",
	"[[dây]]",
	"[[da]]",
	"[[thịt]]",
	"[[máu]]",
	"[[xương]]",
	"[[mỡ]]",
	"[[trứng]]",
	"[[sừng]]",
	"[[đuôi]]",
	"[[lông chim]]",
	"[[đầu]]",
	"[[tai]]",
	"[[mắt]]",
	"[[mũi]]",
	"[[miệng]]",
	"[[răng]]",
	"[[lưỡi]]",
	"[[móng tay]]",
	"[[chân]]",
	"[[chân]], [[cằng]], [[giò]]",
	"[[đầu gối]]",
	"[[tay]]",
	"[[cánh]]",
	"[[bụng]]",
	"[[ruột]], [[lòng]]",
	"[[cổ]] (danh từ)",
	"[[lưng]]",
	"[[vú]]",
	"[[tim]]",
	"[[gan]]",
	"[[uống]]",
	"[[ăn]]",
	"[[cắn]]",
	"[[hút]]",
	"[[nhổ]]",
	"[[nôn]]",
	"[[thổi]]",
	"[[thở]]",
	"[[cười]]",
	"[[nhìn]]",
	"[[nghe]]",
	"[[biết]]",
	"[[nghĩ]]",
	"[[ngửi]]",
	"[[sợ]]",
	"[[ngủ]]",
	"[[sống]] (động từ)",
	"[[chết]]",
	"[[giết]]",
	"[[đánh nhau]]",
	"[[săn]]",
	"[[đánh]]",
	"[[cắt]]",
	"[[chia]]",
	"[[đâm]]",
	"[[cào]]",
	"[[đào]] (động từ)",
	"[[bơi]]",
	"[[bay]]",
	"[[đi]]",
	"[[đến]]",
	"[[nằm]]",
	"[[ngồi]]",
	"[[đứng]]",
	"[[quay]]",
	"[[ngã]]",
	"[[đưa]]",
	"[[nắm giữ]]",
	"[[vắt]]",
	"[[cọ]]",
	"[[rửa]]",
	"[[chùi]]",
	"[[kéo]] (động từ)",
	"[[đẩy]]",
	"[[ném]]",
	"[[buộc]]",
	"[[may]]",
	"[[đếm]]",
	"[[nói]]",
	"[[hát]]",
	"[[chơi]]",
	"[[nổi]]",
	"[[chảy]]",
	"[[đóng băng]]",
	"[[sưng]]",
	"[[mặt trời]]",
	"[[mặt trăng]]",
	"[[sao]] (danh từ)",
	"[[nước]]",
	"[[mưa]]",
	"[[sông]]",
	"[[hồ]]",
	"[[biển]]",
	"[[muối]]",
	"[[đá]]",
	"[[cát]]",
	"[[bụi]]",
	"[[đất]]",
	"[[mây]]",
	"[[sương mù]]",
	"[[trời]]",
	"[[gió]]",
	"[[tuyết]]",
	"[[băng]]",
	"[[khói]]",
	"[[lửa]]",
	"[[tro]]",
	"[[đốt]] (động từ)",
	"[[đường]] (như đường đi)",
	"[[núi]]",
	"[[đỏ]]",
	"[[xanh lá]]",
	"[[vàng]]",
	"[[trắng]]",
	"[[đen]]",
	"[[đêm]]",
	"[[ngày]]",
	"[[năm]] (danh từ)",
	"[[ấm]]",
	"[[lạnh]]",
	"[[đầy]]",
	"[[mới]]",
	"[[cũ]]",
	"[[tốt]]",
	"[[xấu]]",
	"[[hư]], [[thối]]",
	"[[bẩn]]",
	"[[thẳng]]",
	"[[tròn]]",
	"[[sắc]], [[bén]]",
	"[[cùn]]",
	"[[mượt]]",
	"[[ướt]]",
	"[[khô]]",
	"[[đúng]]",
	"[[gần]]",
	"[[xa]]",
	"[[phải]]",
	"[[trái]]",
	"[[tại]]",
	"[[trong]]",
	"[[với]]",
	"[[và]]",
	"[[nếu]]",
	"[[vì]]",
	"[[tên]]"
}
--array - list of 207 objects in this form {gloss=term}
local data = {}

function export.python_dictionary(frame)
	local args = frame:getParent().args
	local dataurl = args['lang']
	if args['var'] then dataurl = dataurl .. '/' .. args['var'] end
	local data = require("Module:Swadesh/data/" .. dataurl)
	local lang = require("Module:languages").getByCode(args.lang, "lang", "allow etym")
	local res = "{'name': '" .. lang:getCanonicalName2()
	if data['header'] ~= nil then res = res .. ' (' .. data['header'] .. ')' end
	res = res .. "',"
	
	for word = 1, #Vietnamese do
		res = res .. "'" .. word .. "': ["
		if data[word] ~= nil then
			for _, termdata in ipairs(data[word]) do
				local translit = (lang:transliterate(termdata.alt or termdata.term))
				res = res .. '{'
				if termdata.term then res = res .. "'term': '" .. termdata.term:gsub("'", "&#39;") .. "', " end
				if termdata.alt then res = res .. "'alt': '" .. termdata.alt:gsub("'", "&#39;") .. "', " end
				if termdata.tr or translit then res = res .. "'translit': '" ..  (termdata.tr or translit):gsub("'", "&#39;") .. "', " end
				if termdata.ts then res = res .. "'transcript': '" ..  termdata.ts:gsub("'", "&#39;") .. "', " end
				if termdata.id then res = res .. "'id': '" ..  termdata.id:gsub("'", "&#39;") .. "', " end
				if termdata.ipa then res = res .. "'ipa': '" ..  termdata.ipa:gsub("'", "&#39;") .. "', " end
				if termdata.nolink then res = res .. "'nolink': '" .. termdata.nolink:gsub("'", "&#39;") .. "', " end
				if termdata.notes then res = res .. "'notes': '" ..  termdata.notes:gsub("'", "&#39;") .. "', " end
				res = res .. '},'
			end
		end
		res = res .. "],"
	end
	res = res .. "}"
	
	return "<pre>" .. require("Module:string/nowiki")(res) .. "</pre>"
end


function export.show(frame)
	local parent_args = frame:getParent().args
	local data = {}
	local langs = {}
	
	local res = mw.html.create("table"):addClass("wikitable sortable")
	
	local headers = res:tag("tr")
	for _, text in ipairs { "STT", "Tiếng Việt" } do
		headers:tag("th"):node(text)
	end

	local params = {
		[1] = {list = true, disallow_holes = true},
		["var"] = {list = true, allow_holes = true},
		["translit"] = {type = "boolean"},
		["ipa"] = {type = "boolean"},
		["from"] = {type = "number"},
		["to"] = {type = "number"},
	}

	local args = require("Module:parameters").process(parent_args, params, nil, "Swadesh", "show")

	local from = args.from or 1
	local to = args.to or #Vietnamese

	for i, arg in ipairs(args[1]) do
		local lang = arg
		local header = arg
		local lang_obj = require("Module:languages").getByCode(lang, i, "allow etym")
		langs[i] = lang_obj
		local var = args["var"][i]
		if var then
			arg = arg .. "/" .. var
		end
		local data_module = require("Module:Swadesh/data/" .. arg)
		data[i] = data_module
		local header = lang_obj:getCanonicalName2()
		local header_in_data = data_module["header"]
		if header_in_data ~= nil and args.translit then
			header = header .. " (" .. header_in_data .. ")"
		end
		local nativename = data_module["nativename"]
		if nativename ~= nil then
			header = header .. "<br><small>" .. m_links.full_link{lang = lang_obj, alt = nativename} .. "</small>"
		end
		local count = 0
		for k, v in pairs(data_module) do
    		if (type(k) == "number") then count = count + 1 end
    	end
		header = header .. "<br><small><sup>[[Module:Swadesh/data/" .. arg .. "|edit (" .. count .. ")]]</sup></small>"
		headers:tag("th"):node(header)
	end
	
	local show_ipa = #args[1] < 2 and not args.translit
	if show_ipa then
		show_ipa = args.ipa
		
		-- do not display IPA by default for reconstructed languages
		if not show_ipa then
			show_ipa = not langs[1]:hasType("reconstructed")
		end
		
		if show_ipa then
			local has_ipa = false
			for word = from, to do
				if data[1][word] then
					for _, termdata in ipairs(data[1][word]) do
						if termdata.ipa then
							has_ipa = true
							break
						end
					end
				end
				if has_ipa then break end
			end
			show_ipa = has_ipa
		end
		
		if show_ipa then
			local key = ""
			if mw.loadData("Module:IPA/data").langs_with_infopages[langs[1]:getCode()] then
				key = "<br><small>([[Phụ lục:Cách phát âm trong " .. langs[1]:getCanonicalName() .. "|ghi chú]])</small>"
			end
			headers:tag("th"):node("IPA" .. key)
		end
	end

	for word = from, to do
		local row = mw.html.create("tr")
		row:tag("td"):node(word)
		row:tag("td"):node(Vietnamese[word])
		
		for lang, arg in ipairs(args[1]) do
			local res = ""
			local count = 0
			local terms = data[lang][word]
			local lang_obj = langs[lang]
			if terms then
				for _, termdata in ipairs(terms) do
					if count ~= 0 then res = res .. ", " end
					local term = termdata.term
					if args["translit"] then
						res = res .. '<span class="swadesh-translit">'
						local alt = termdata.ts or termdata.tr or (lang_obj:transliterate(termdata.alt or term)) or term
							or (termdata.ipa and '<span class="IPA">' .. termdata.ipa .. "</span>")
							or "?"
						if not termdata.nolink and term ~= nil and term ~= "" then
							res = res .. m_links.language_link{lang = lang_obj, term = term or "?",
								alt = alt}
						else
							res = res .. alt
						end
					else
						res = res .. '<span class="swadesh-term">'
						if termdata.nolink == nil then
							res = res .. m_links.full_link{lang = lang_obj, term = term, alt = termdata.alt, tr = termdata.tr, ts = termdata.ts, id = termdata.id}
						else
							res = res .. term
						end
					end
					local notes = termdata.notes
					if notes then
						if #args[1] < 2 then res = res .. " (''<span class=\"swadesh-note\">" .. notes .. "</span>'')"
						else res = res .. '<abbr title = "' .. notes .. ">*</abbr>" end
					end
					res = res .. "</span>"
					count = count + 1
				end
			end
			row:tag("td"):node(res)
		end
		
		if show_ipa then
			local ipas = ""
			local count = 0
			if data[1][word] then
				for _, termdata in ipairs(data[1][word]) do
					if count ~= 0 then
						ipas = ipas .. ", "
					end
					if termdata.ipa then
						ipas = ipas .. '<span class="IPA">' .. termdata.ipa .. "</span>"
						count = count + 1
					end
				end
			end
			row:tag("td"):node(ipas)
		end
		res:node(row)
	end
	
	
	return res;
end

return export