Documentation for this module may be created at વિભાગ:Infobox road/color/doc

local p = {}

Country = {}

function Country:new(obj)
    obj = obj or {}
    setmetatable(obj, self)
    self.__index = self
    return obj
end

function Country:color(args)
    local type = args.type
    return self[type] or self.default
end

function Country:addTypesAsColor(types, color)
    for i,type in pairs(types) do
        self[type] = color
    end
end

local colors = {}
do
    function colors:color(args)
        local headerType = args.headerType
        local countryArg = args.country
        local headerTypeColor = self[headerType]
        if headerTypeColor then return headerTypeColor end
        local success, country = pcall(self.country, self, countryArg)
        if not(success) then
            return 'background:#cedff2;'
        else
            return country:color(args)
        end
    end
    function colors:country(name)
        local color = self[name]
        if color then return color end
        local module = require(string.format("Module:Infobox road/color/%s", name))
        return module.colors
    end
    
    do -- Single-color countries
        colors.BEL = Country:new{default = "background:#0071B3; color:#fff;"}
        colors.BGD = Country:new{default = "background:#2C6700; color:white;"}
        colors.CHN = Country:new{default = "background:#006A4D; color:white;"}
        colors.EUR = Country:new{default = "background:#08842C; color:#fff;"}
        colors.HKG = Country:new{default = "background:#006A4D; color:#fff;"}
        colors.ISL = Country:new{default = "background:#FFD200; border:1px solid #000;"}
        colors.NLD = Country:new{default = "background:#0079C1; color:#fff;"}
        colors.NZL = Country:new{default = "background:#006A4D; color:#fff;"}
        colors.UKR = Country:new{default = "background:#003F87; color:white;"}
        colors.URY = Country:new{default = "background:#006A4D; color:white;"}
        colors.VNM = Country:new{default = "background:#003399; color:white;"}
    end -- Single-color countries
    
    do -- Multi-color countries
        do -- Albania
            local ALB = Country:new{default = "background:#00408B; color:#fff;"}
            ALB:addTypesAsColor({"A"}, "background:#08842C; color:#fff;")
            colors.ALB = ALB
        end -- Albania
        do -- Australia
            local AUS = Country:new{default = "background:#3A7119; color:#FFE133;"}
            AUS:addTypesAsColor({"freeway"}, "background:#D2E2F9;")
            AUS:addTypesAsColor({"highway", "city highway"}, "background:#E9F9D2;")
            AUS:addTypesAsColor({"road", "rural road"}, "background:#FFFFE0;")
            AUS:addTypesAsColor({"street"}, "background:#F9E2D2;")
            AUS:addTypesAsColor({"track"}, "background:#fee8ab;")
            colors.AUS = AUS
        end -- Australia
        do -- Austria
            local AUT = Country:new{default = "background:#fff; border:1px solid #000;"}
            AUT:addTypesAsColor({"A", "S", "B"}, "background:#276FB7; color:#fff;")
            colors.AUT = AUT
        end -- Austria
        do -- Bulgaria
            local BGR = Country:new{default = "background:#003F87; color:white;"}
            BGR:addTypesAsColor({"A"}, "background:#006A4D; color:white;")
            colors.BGR = BGR
        end -- Bulgaria
        do -- Croatia
            local HRV = Country:new{default = "background:#cedff2;"}
            HRV:addTypesAsColor({"E", "A"}, "background:#08842C; color:#fff;")
            HRV:addTypesAsColor({"D"}, "background:#0066CC; color:#fff;")
            HRV:addTypesAsColor({"Z"}, "background:#FFCC33; color:black;")
            colors.HRV = HRV
        end -- Croatia
        do -- Cyprus
            local CYP = Country:new{default = "background:#003F87; color:#FFC000;"}
            CYP:addTypesAsColor({"A"}, "background:#005024; color:#FFC000;")
            colors.CYP = CYP
        end -- Cyprus
        do -- Czech Republic
            local CZE = Country:new{default = "background:#003F87; color:white;"}
            CZE:addTypesAsColor({"D", "R"}, "background:#006A4D; color:white;")
            colors.CZE = CZE
        end -- Czech Republic
        do -- France
            local FRA = Country:new{default = "background:#fff; border:1px solid #000;"}
            FRA:addTypesAsColor({"A"}, "background:#0079C1; color:#fff;")
            FRA:addTypesAsColor({"N"}, "background:#006A4D; color:#fff;")
            colors.FRA = FRA
            colors.MTQ = FRA
        end -- France
        do -- Georgia
            local GEO = Country:new{default = "background:#cedff2;"}
            GEO:addTypesAsColor({"A", "International"}, "background:#039; color:#fff;")
            colors.GEO = GEO
        end -- Georgia
        do -- Germany
            local DEU = Country:new{default = "background:#cedff2;"}
            DEU:addTypesAsColor({"A", "Autobahn"}, "background:#039; color:#fff;")
            DEU:addTypesAsColor({"B", "Bundesstraße", "Bundesstrasse"}, "background:#FC3; color:black")
            colors.DEU = DEU
        end -- Germany
        do -- Greece
            local GRC = Country:new{default = "background:#0079C1; color:#FFF;"}
            GRC:addTypesAsColor({"A"}, "background:#006A4D; color:#FFF;")
            colors.GRC = GRC
        end -- Greece
        do -- Hungary
            local HUN = Country:new{default = "background:#006A4D; color:#fff;"}
            HUN:addTypesAsColor({"M"}, "background:#0079C1; color:#fff;")
            colors.HUN = HUN
        end -- Hungary
        do -- Republic of Ireland
            local IRL = Country:new{default = "background:#cedff2;"}
            IRL:addTypesAsColor({"M"}, "background:#0079C1; color:#fff;")
            IRL:addTypesAsColor({"N"}, "background:#00703C; color:#FFD200;")
            IRL:addTypesAsColor({"R"}, "background:#fff; border:1px solid #000;")
            colors.IRL = IRL
        end -- Republic of Ireland
        do -- Italy
            local ITA = Country:new{default = "background:#cedff2;"}
            ITA:addTypesAsColor({"A"}, "background:#08842C; color:#fff;")
            ITA:addTypesAsColor({"SS"}, "background:#003F87; color:#fff;")
            colors.ITA = ITA
        end -- Italy
        do -- Malaysia
            local MYS = Country:new{default = "background:#0079C1; color:#fff;"}
            MYS:addTypesAsColor({"E"}, "background:#006A4D; color:#fff;")
            colors.MYS = MYS
        end -- Malaysia
        do -- Poland
            local POL = Country:new{default = "background:#006A4D; color:#fff;"}
            POL:addTypesAsColor({"A", "S"}, "background:#0079C1; color:#fff;")
            colors.POL = POL
        end --Poland
        do -- Slovakia
            local SVK = Country:new{default = "background:#0079C1; color:#fff;"}
            SVK:addTypesAsColor({"D", "R"}, "background:#006A4D; color:#fff;")
            colors.SVK = SVK
        end -- Slovakia
        do -- South Africa
            local ZAF = Country:new{default = "background:#006A4D; color:#FFF;"}
            ZAF:addTypesAsColor({"M", "N"}, "background:#0079C1; color:#FFF;")
            colors.ZAF = ZAF
        end -- South Africa
        do -- Spain
            local ESP = Country:new{default = "background:#E8E8E8;"}
            ESP:addTypesAsColor({"A", "AP"}, "background:#039; color:#fff;")
            ESP:addTypesAsColor({"N"}, "background:#f00; color:#fff;")
            colors.ESP = ESP
        end -- Spain
        do -- Sri Lanka
            local LKA = Country:new{default = "background:#006A4D; color:#fff;"}
            LKA:addTypesAsColor({"E"}, "background:#0000CD; color:#fff;")
            LKA:addTypesAsColor({"A"}, "background:#006A4D; color:#fff;")
            colors.LKA = LKA
        end -- Sri Lanka
        do -- Turkey
            local TUR = Country:new{default = "background:#006A4D; color:#fff;"}
            TUR:addTypesAsColor({"state", "D"}, "background:#003F87; color:#fff;")
            colors.TUR = TUR
        end -- Turkey
        do -- United States
            local USA = Country:new{default = "background:#006A4D; color:white;"}
            USA:addTypesAsColor({"FFH", "FR", "NER", "Rec", "RE", "Park"}, "background:#704214; color:white;")
            colors.USA = USA
        end -- United States
    end -- Multi-color countries
    
    do -- Built-in header types
        colors["under construction"] = "background:#fc6;"
        colors["const"] = "background:#fc6;"
        colors["uc"] = "background:#fc6;"
        colors["historic"] = "background:#704214; color:white;"
        colors["historical"] = "background:#704214; color:white;"
        colors["hist"] = "background:#704214; color:white;"
        colors["scenic"] = "background:#704214; color:white;"
        colors["decommissioned"] = "background:#AAA;"
        colors["former"] = "background:#AAA;"
    end -- Built-in header types
end

function p._color(args)
    return colors:color(args)
end

function p.color(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 function emptyParam(param)
        local empty = {[''] = true, ['¬'] = true}
        if not(param) or empty[param] then
            return nil
        else
            return param
        end
    end
    
    local state = config.state or args.state
    state = emptyParam(state)
    local province = config.province or args.province
    province = emptyParam(province)
    local type = config.type or args.type
    local subtype = config.subtype or args.subtype or nil
    
    local headerType = args.header_type or config.header_type
    headerType = emptyParam(headerType)
    if headerType then
        headerType = string.lower(headerType)
    end
    
    local countryArg = config.country or args.country
    countryArg = emptyParam(countryArg)
    local country = countryArg
    if not(country) then
        if headerType then
            country = ''
        else
            local stateParam = state or province
            if not(stateParam) then
                country = ''
            else
                local countryMask = require "Module:Infobox road/meta/mask/country"
                country = countryMask._country(stateParam, countryArg)
            end
        end
    end
    
    return p._color{country=country, state=state, province=province, type=type, subtype=subtype, headerType=headerType}
end

return p