local export = {}

local codepoint_to_script = require("Module:scripts").charToScript

-- FIXME: Temporary hack for script renames.
local alias_mapping = {
	polytonic = "Polyt",
	Latinx = "Latn",
	Latnx = "Latn",
}

-- If there are characters in both scripts (the key and value), the value should be used.
local overridden_by = {
	Grek = "Polyt",
	Cyrl = "Cyrs",
}

local function get_script(text)
	local sc, curr_sc
	for codepoint in mw.ustring.gcodepoint(text) do
		curr_sc = codepoint_to_script(codepoint)
		curr_sc = alias_mapping[curr_sc] or curr_sc
		if curr_sc ~= "None" then
			if sc == nil then
				sc = curr_sc
			elseif curr_sc ~= sc then
				-- For instance, Grek -> Polyt.
				if overridden_by[sc] == curr_sc then
					sc = curr_sc
				
				-- For instance, Grek and Latn.
				elseif overridden_by[curr_sc] ~= sc then
					require("Module:debug").track("also/no sc detected")
					mw.log("Two scripts found in " .. tostring(text) .. ": "
						.. tostring(sc) .. " and " .. tostring(curr_sc) .. ".")
					sc = nil
					break
				end
			end
		end
	end
	return sc
end

local function link(text, sc)
	return '<span class="' .. sc .. '">[[' .. text .. ']]</span>'
end

function export.tag_link(link_innards, text)
	local sc = get_script(text or link_innards) or "None"
	
	return link(link_innards, sc)
end

function export.tag_links(str)
	str = str:gsub('%[%[(.-)%]%]', function (innards)
		local sc
		-- The actual displayed text, whose script we need to detect,
		-- if different from link innards.
		local text
		
		if innards:find("|") then
			text = innards:match("|(.+)%]%]$")
			if not text then
				return
			end
		end
		
		return export.tag_link(innards, text)
	end)
	
	return str
end

function export.tag_links_frame(frame)
	local args = {}
	for k, v in pairs(frame:getParent().args) do
		if k == 1 then
			args[k] = v
		else
			error("The parameter " .. k .. " is not used by this template.")
		end
	end
	
	local text = args[1]
	if text then
		text = mw.text.trim(text)
		return export.tag_links(text)
	end
end

function export.link(frame)
	local args = {}
	for k, v in pairs(frame:getParent().args) do
		if k == 1 then
			args[k] = v
		else
			error("The parameter " .. k .. " is not used by this template.")
		end
	end
	
	local text = args[1]
	if text then
		return export.tag_link(text)
	end
end

return export