local data = mw.loadData("Module:ISO 3166/data/National")

function p.list(frame)
--Returns a list of subpages and associated countries
local codes = {}
for alpha2,cdata in pairs(data) do
 codes[#codes+1] = {alpha2,cdata.name}
end
table.sort(codes, function return t1[1]<t2[1] end)

local out = {"* National"}
for _,cdata in ipairs(codes) do
 out[#out+1] = "* [[Module:ISO 3166/data/"..cdata[1].."|"..cdata[1].." ("..cdata[2]..")]]"
end
return table.concat

end

function p.subpagetest(frame)
--Returns a table row indicating the existence of data pages (see User:SiBr4/sandbox#Data subpage test)

local function cell
 local sdata
 if not data[code] then
 return "" --Unassigned or reserved 3166-1 code
 else
 local sname = "Module:ISO 3166/data/"..code
 if not (d or mw.title.new(sname).exists) then
 return "title=\""..data[code].name.."\" style=\"background:#fee;\"|-" --Data subpage doesn't exist
 else
 sdata = mw.loadData(sname)
 end
 end
 for _,_ in pairs(sdata) do
 return "title=\""..data[code].name.."\" style=\"background:#efe;\"|n" --Non-empty 3166-2 entry
 end
 return "title=\""..data[code].name.."\" style=\"background:#eef;\"|e" --Empty 3166-2 entry
end

local letter = frame.args[1]
local out = "|-\n!"..letter.."*"
for i = 65, 90 do
 out = out.."\n|"..cell(letter..string.char(i),frame.args[2])
end
return out

end

function p.testall(frame)
--Search across all subpages for problems with names

local strip = require("Module:ISO 3166").strip

local function subpage(p)
 return "/"..p..""
end
local function testname
 if name then
 	if type(name)~="string" then
 	 dnames[#dnames+1] = "*Unexpected non-string value in "..subpage(page).." ("..code..")"
 	else
 local sname = strip(name)
 if not names[sname] then
 inames[sname] = name
 else
 dnames[#dnames+1] = "*Duplicate name: \""..name.."\" in "..subpage(page)
 ..(names[sname]==name and " (exact)" or " (non-exact)").." ("..code..")"
 end
 end
 end
 return names, inames, dnames
end
local function testnametable
 if tab then
 if type(tab)~="table" then
 dnames[#dnames+1] = "*Unexpected non-table value in "..subpage(page).." ("..code..")"
 else
 for _,name in pairs(tab) do
 names, inames, dnames = testname
 end
 end
 end
 return names, inames, dnames
end
local fields = {name=1,isoname=1,isonames=1,displayname=1,isodisplayname=1,isodisplaynames=1,altnames=1,lang=1,defaultlang=1,alpha3=1,numeric=1,nocode=1}
local function testentry
 for k,_ in pairs(edata) do
 if not fields[k] then
 dnames[#dnames+1] = "*Unknown field \""..k.."\" in "..subpage(page).." ("..code..")"
 end
 end
 local inames = {}
 names, inames, dnames = testname
 names, inames, dnames = testname
 names, inames, dnames = testnametable
 names, inames, dnames = testnametable
 if not edata.nocode then
 names, inames, dnames = testname
 end
 if page=="National" then
 names, inames, dnames = testname
 names, inames, dnames = testname
 end
 for k,v in pairs(inames) do names[k]=v end
 return names, dnames
end

local dnames = {}

--ISO 3166-1
local names = {}
for code,cdata in pairs(data) do
 names, dnames = testentry
end

--ISO 3166-2
for code,_ in pairs(data) do
 names = {}
 local spage = "Module:ISO 3166/data/"..code
 if mw.title.new(spage).exists then
 local sdata = mw.loadData(spage)
 for scode,cdata in pairs(sdata) do
 if type(cdata)=="table" then
 names, dnames = testentry
 end
 end
 end
end

if #dnames>0 then
 return table.concat
else
 return "None"
end

end