Documentation for this module may be created at Module:Infobox road/locations/doc

local p = {}

local function countries(args, country)
    local data = {AFRICA = "no", ARAB = "no", ASIA = "no", EUR = "no", default = "yes"}
    local yesOrNo = data[country] or data.default
    if yesOrNo == "no" then
        return args.countries
    else
        return nil
    end
end

local function regions(args, country)
	local data = {EUR = "no", AUS = "no", AUT = "no", BIH = "no", CAN = "no", CYP = "no", CZE = "no", ESP = "no", GRC = "no", HRV = "no",
	              HUN = "no", ITA = "no", POL = "no", SGP = "no", SRB = "no", SVK = "no", SVN = "no", TUR = "no", UKR = "no", default = "yes"}
	if args.communities then
		return "Autonomous<br>communities", args.communities
	end
	local yesOrNo = data[country] or data.default
	if yesOrNo == "no" then
		return "Regions", args.regions
	else
		return "Regions", nil
	end
end

local function states(args, country)
    local data = {AUS = "no", AUT = "no", BRA = "no", DEU = "no", IND = "no", MEX = "no", MYS = "no", USA = "no", default = "yes"}
    local yesOrNo = data[country] or data.default
    if yesOrNo == "no" then
        return args.states
    else
        return nil
    end
end

local function provinces(args, country)
    local data = {CAN = "no", CRI = "no", ESP = "no", IRN = "no", NLD = "no", PHL = "no", SAU = "no", THA = "no", TUR = "no", default = "yes"}
    local yesOrNo = data[country] or data.default
    if yesOrNo == "no" then
        return args.provinces
    else
        return nil
    end
end

local function counties(args, country)
    local counties = args.counties
    local districts = args.districts
    local municipalities = args.municipalities
    local parishes = args.parishes
    local boroughs = args.boroughs
    if counties then
        return "Counties", counties
    elseif districts then
        return "Districts", districts
    elseif municipalities then
        return "Municipalities", municipalities
    elseif parishes then
        return "Parishes", parishes
    elseif boroughs then
        return "Boroughs", boroughs
    else
        return '', nil
    end
end

local function ruralMunis(args, country)
    local label
    local province = country or ''
    if province == "AB" then
        label = "Specialized<br>and rural<br>municipalities"
    elseif province == "ON" then
    	label = "Municipalities"
    else
        label = "Rural<br>municipalities"
    end
    local data = {AB = "no", BC = "no", MB = "no", NB = "no", NL = "no", ON = "no", PE = "no", QC = "no", SK = "no", default = "yes"}
    local yesOrNo = data[province] or data.default
    if yesOrNo == "no" then
        return label, args.rural_municipalities
    else
        return '', nil
    end
end

local function divisions(args, country)
    local province = country or ''
    local data = {ON = "no", default = "yes"}
    local yesOrNo = data[province] or data.default
    if yesOrNo == "no" then
        return args.divisions
    else
        return nil
    end
end

local function cities(args, country, parameter)
    local data = {USA = "yes", default = "no"}
    local yesOrNo = data[country] or data.default
    if yesOrNo == "no" then
        return args[parameter]
    else
        return nil
    end
end

local function destinations(args, country)
    local label
    if country == "GBR" then
        label = "[[Primary status|Primary<br>destinations]]"
    else
        label = "Primary<br>destinations"
    end
    local data = {AUS = "no", GBR = "no", IMN = "no", IND = "no", IRL = "no", MYS = "no", NIR = "no", NPL = "no", NZL = "no", default = "yes"}
    local yesOrNo = data[country] or data.default
    if yesOrNo == "no" then
        return label, args.destinations
    else
        return '', nil
    end
end

local function lga(args, country)
    local labels = {SA = "[[Local government areas of South Australia|LGA(s)]]", VIC = "[[Local government in Victoria|LGA(s)]]", NSW = "[[Local government areas of New South Wales|LGA(s)]]",
                    QLD = "[[Local government areas of Queensland|LGA(s)]]", NT = "[[Local government areas of the Northern Territory|LGA(s)]]",
                    WA = "[[Local government areas of Western Australia|LGA(s)]]", TAS = "[[Local government areas of Tasmania|LGA(s)]]", ACT = "District(s)"}
    local data = {AUS = "no", default = "yes"}
    local yesOrNo = data[country] or data.default
    if yesOrNo == "no" then
        local state = args.state or ''
        local label = labels[state] or "[[Local government in Australia|LGA(s)]]"
        return label, args.lga
    else
        return '', nil
    end
end

local function locations(args, country)
    local labels = {highway = "Major settlements", ["rural road"] = "Major settlements", freeway = "Major suburbs", ["city highway"] = "Major suburbs", road = "Major suburbs", street = "Suburb"}
    local data = {AUS = "no", default = "yes"}
    local yesOrNo = data[country] or data.default
    if yesOrNo == "no" then
        local type = args.type or ''
        local label = labels[type] or "Primary<br>destinations"
        return label, args.locations
    else
        return '', nil
    end
end

function p.locations(frame)
    local pframe = frame:getParent()
    local config = frame.args -- the arguments passed BY the template, in the wikitext of the template itself
    local args = pframe.args -- the arguments passed TO the template, in the wikitext that transcludes the template
    
    local parameters = {label1 = "Countries", label3 = "States", label4 = "Provinces", label7 = "Divisions", label8 = "Major cities",
                        label9 = "Towns", label10 = "Villages", child = "yes", decat = "yes", labelstyle = "text-align:right", title = "Location"}
    local data = {}
    
    local function emptyParam(param)
        if param == '' then
            return nil
        else
            return param
        end
    end

    local country = emptyParam(args.country)
    local state = emptyParam(args.state)
    local province = emptyParam(args.province)
    if not(country) then
        local stateParam = args.state or args.province
        if not(stateParam) then
            country = ''
        else
            local countryMask = require "Module:Infobox road/meta/mask/country"
            country = countryMask._country(stateParam, country)
        end
    end
    data[1] = countries(args, country)
    parameters.label2, data[2] = regions(args, country)
    data[3] = states(args, country)
    data[4] = provinces(args, country)
    parameters.label5, data[5] = counties(args, country)
    parameters.label6, data[6] = ruralMunis(args, province)
    data[7] = divisions(args, province)
    data[8] = cities(args, country, 'cities')
    data[9] = cities(args, country, 'towns')
    data[10] = cities(args, country, 'villages')
    parameters.label11, data[11] = destinations(args, country)
    parameters.label12, data[12] = lga(args, country)
    parameters.label13, data[13] = locations(args, country)
    
    local hasData = false
    for k,v in pairs(data) do
        if v ~= '' then
            hasData = true
            break
        end
    end
    if not(hasData) then
        return ''
    end
    
    for k,v in pairs(data) do
        parameters["data" .. k] = v
    end
    
    local infoboxModule = require 'Module:Infobox'
    return infoboxModule.infobox(parameters)
end

return p