local p = {}
local arguments = {
	{'Canada'},
	{'United States'},
	{'The United States of America'},
	{'US'},
	{'US', 'New York'},
	{'USA', 'New York'},
	{'US-New York'},
	{'USA-New York'},
	{'US-NY'},
	{'USA-NY'},
	{'United States', 'New York'},
	{'United States', 'New York (State)'},
	{'United States', '[[New York (State)]]'},
	{'United States', '[[New York (State)|Test]]'},
	{'Guinea-Bissau'},
	{'Guinea-Bissau-L'},
	{'Guinea-Bissau', 'L'},
	{'United-States'},
	{'United States-New-York'},
	{'GuineaBissau'},
	{'GuineaBissau-L'},
	{'GuineaBissau', 'L'},
	{'GB-ENG'},
	{'GB-ENG-Greenwich'},
	{'GB-ENG', 'Greenwich'},
	{'Wales-Belfast'},
	{'Northern Ireland-Belfast'},
	{'UK-Stoke-on-Trent'},
	{'UK', 'Stoke-on-Trent'},
	{'UK', 'Stoke on Trent'},
	{'[[United States|THE PLACE]]'},
	{'[[File:Flag_of_Canada.svg|20px]]'},
	{'{{flag|India}}'},
	{'{{CAN}}'},
	{[[C"A'NA‘DA(AAA)']]},
	--[[
	{'Taiwan, Province of China'},
	{'Taiwan'},
	{'Republic of China'},
	{'Republic of China', isoname='yes'},
	{'TW'},
	{'TWN'},
	{'158'},
	{'20'},
	{'{{PRC}}'},
	{'[ [Canada ] ]'},
	{'Áfghanistan'},
	]]
	{'United States<ref name=A>{{cite web|url=http://www.example.com}}</ref>'},
	{'United States<ref name="B" />'},
	{'[[Russia]]', '[[Sakha Republic]]'},
	{'CA', 'BC', lang='fr'},
}
local function stripOnly(params, special)
	local code = (special == 'code' and '<td><code><nowiki>' or '<td>')
	if params[1] then
		code = code..(special == 'sandbox' and '{{#invoke:ISO 3166/sandbox' or '{{#invoke:ISO 3166')..'|strip'..'|'..params[1]..'}}'
	end
	if params[2] then
		code = code..' '..(special == 'sandbox' and '{{#invoke:ISO 3166/sandbox' or '{{#invoke:ISO 3166')..'|strip'..'|'..params[2]..'}}'
	end
	return code..(special == 'code' and '</nowiki></code></td>' or '</td>')
end
local function makeCell(func, params, special)
	if func == 'strip' then
		return stripOnly(params, special)
	end
	local code = ''
	code = code..(special == 'code' and '<td><code><nowiki>' or '<td>')..'{{'
	code = code..(special == 'sandbox' and '#invoke:ISO 3166/sandbox' or '#invoke:ISO 3166')
	code = code..'|'..func
	for k,v in ipairs(params) do
		code = code..'|'..v
	end
	for k,v in pairs(params) do
		if type(k) ~= 'number' then
			code = code..'|'..k..'='..v
		end
	end
	code = code..'}}'..(special == 'code' and '</nowiki></code></td>' or '</td>')
	return code
end
local function makeRow(frame, func, params)
	local out = ''
	out = out..makeCell(func, params) -- Live
	out = out..makeCell(func, params, 'sandbox') -- Sandbox
	out = out..makeCell(func, params, 'code') -- Code
	return frame:preprocess('<tr>'..out..'</tr>')
end
function p.run(frame)
	local out = '<tr><th>Live</th><th>Sandbox</th><th>Code</th></tr>'
	for k,v in ipairs(arguments) do
		out = out..makeRow(frame, frame.args[1], v)
	end
	return '<table class="wikitable">'..out..'</table>'
end
return p