Module:kne-xnn-synonyms



local export = {}

---------------------------------------------
-- DATA
---------------------------------------------

local data = {
	
	northern = {
		name = "Northern / Applai",
		short = "n",
		color = "#f5ffe5",
		categories = {
			mtprovince = {
				name = "Mt. Province", 
				sagada = {
					name = "Sagada",
					lang = "xnn",
				},
				besao = {
					name = "Besao",
					lang = "xnn",
				},
				bauko = {
					name = "<small>parts of</small> Bauko",
					lang = "xnn",
				},
				sabangan = {
					name = "<small>parts of</small> Sabangan",
					lang = "xnn",
				},
				tadian = {
					name = "<small>parts of</small> Tadian",
					lang = "xnn",
				},
			},
		},
	},
	
	southern = {
		name = "Southern / Central",
		short = "s",
		color = "#e6fefe",
		categories = {
			mtprovince = {
				name = "Mt. Province", 
				bauko = {
					name = "Bauko",
					lang = "kne",
				},
				sabangan = {
					name = "Sabangan",
					lang = "kne",
				},
				tadian = {
					name = "Tadian",
					lang = "kne",
				},
			},
			benguet = {
				name = "Benguet", 
				bakun = {
					name = "Bakun",
					lang = "kne",
				},
				buguias = {
					name = "Buguias",
					lang = "kne",
				},
				kapangan = {
					name = "Kapangan",
					lang = "kne",
				},
				kibungan = {
					name = "Kibungan",
					lang = "kne",
				},
				mankayan = {
					name = "Mankayan",
					lang = "kne",
				},
			}
		},
		
	},
	
	others = {
		name = "Others",
		short = "o",
		color = "#f7f0f6",
		categories = {
			benguet = {
				name = "Benguet",
				atok = {
					name = "Atok",
					lang = "kne",
				},
				tuba = {
					name = "Tuba",
					lang = "kne",
				},
				latrinidad = {
					name = "La Trinidad",
					lang = "kne",
				},
				baguio = {
					name = "Baguio",
					lang = "kne",
				},
			},
			ilocos = {
				name = "Ilocos Sur", 
				cervantes = {
					name = "Cervantes",
					lang = "kne",
				},
				quirino = {
					name = "Quirino",
					lang = "kne",
				},
				suyo = {
					name = "Suyo",
					lang = "kne",
				},
				
			},
			launion = {
				name = "La Union", 
				bagulin = {
					name = "Bagulin",
					lang = "kne",
				},
				santol = {
					name = "Santol",
					lang = "kne",
				},
				sudipen = {
					name = "Sudipen",
					lang = "kne",
				},
				sangabriel = {
					name = "San Gabriel",
					lang = "kne",
				},
				sugpon = {
					name = "Sugpon",
					lang = "kne",
				},
				
			},
		}
		
	}
	
	
}

-- convert `data` into the parameters understood by [[Module:parameters]]
function convertDataToParams() 
	
	local output = {}
	
	for k, v in pairs(data) do
		
		-- add the top category
		output[k] = {}
		output[v.short] = {alias_of = k}
		
		-- add categories
		for kcat, vcat in pairs(v.categories) do
			output[kcat] = {}
			output[kcat .. "-" .. v.short] = {}
			
			-- add subcategories
			for ksubcat, vsubcat in pairs(vcat) do
				if ksubcat ~= "name" then
					
					output[ksubcat .. "-" .. v.short] = {}
					
					output[ksubcat] = {}
				end
			end
			
		end
	end
	
		
	return output;
	
end


---------------------------------------------
-- ACTUAL CODE
---------------------------------------------

-- https://stackoverflow.com/a/2705804/14021404
function tablelength(T)
  local count = 0
  for _ in pairs(T) do count = count + 1 end
  return count
end

local function parseArgs(args)
	
	local output = {}
	
	for k, v in pairs(data) do
		
		local outputcat = {}
		-- categories
		for kcat, vcat in pairs(v.categories) do
			
			
			local outputsubcat = {}
			-- add subcategories
			for ksubcat, vsubcat in pairs(vcat) do
				if ksubcat ~= "name" then
				
				-- check for specific subcategory
				if args[ksubcat .. "-" .. v.short] then
					outputsubcat[ksubcat] = args[ksubcat .. "-" .. v.short]
				elseif args[ksubcat] then
					outputsubcat[ksubcat] = args[ksubcat]
				end
				
				
				-- check for category, if so then add to all subcategories
				if args[kcat .. "-" .. v.short] then
					outputsubcat[ksubcat] = outputsubcat[ksubcat] or args[kcat .. "-" .. v.short]
				elseif args[kcat] then
					outputsubcat[ksubcat] = outputsubcat[ksubcat] or args[kcat]
				end
				
				-- check for the entire supercategory
				if args[k] then
					outputsubcat[ksubcat] = outputsubcat[ksubcat] or args[k]
				end
				
				end
			end
			
			-- if not empty then add the subcat to the cat
			if next(outputsubcat)~=nil then
				outputcat[kcat] = outputsubcat
			end
			
		end
		
		-- if not empty then add the cat to the output
		if next(outputcat)~=nil then
			output[k] = outputcat
		end
		
	end
	return output
	
end

-- creates the actual table
local function createTable(frame, parsedArgs)
	--mw.logObject(parsedArgs)
		
	local output = [=[{| class="wikitable" style="clear: right;border-collapse: collapse;text-align: center; width: 100%"]=] .. "\n"
	
	for k, v in pairs(parsedArgs) do -- each supercategory
		output = output .. [[! style="background-color:]] .. data[k].color .. [[;border-right: 1px solid #aaa;border: 1px solid #aaa;" colspan=3| ]] .. data[k].name .. "\n|-\n"
		
		for kcat, vcat in pairs(v) do -- each category (province)
			output = output .. [[| style="border: 1px solid #aaa;background: ]] .. data[k].color .. [[;font-size: smaller;padding:0;" rowspan=]] .. tablelength(vcat) .. [[ | ''']] .. data[k].categories[kcat].name .. [[''' |]]
			
			for ksubcat, vsubcat in pairs(vcat) do -- each subcategory (municipality)
				output = output .. [[| style="border: 1px solid #aaa;background: ]] .. data[k].color .. [[;font-size: smaller;" | ]] .. data[k].categories[kcat][ksubcat].name .. [[ || style="background-color:]] .. data[k].color .. [[;border-right: 1px solid #aaa;border: 1px solid #aaa;"| ]] .. frame:expandTemplate{ title = "l-self", args = {data[k].categories[kcat][ksubcat].lang, vsubcat} } .."\n|-\n"
				
			end
			
			
		end
		
	end
	
	return output .. "|}"
end


-- the main function
function export.show(frame)
	
	local params = convertDataToParams()
	
	-- add parameters from template page
	params["gloss"] = {}
	params["title"] = {}

	local parargs = frame:getParent().args
	local args = require("Module:parameters").process(parargs, params)	
	
	local parsedArgs = parseArgs(args)
	
	return createTable(frame, parsedArgs)
end


return export;