--[[
  Módulo que devolve as cores ligadas à carta indicada
--]]

local p = {}

-- carregar o módulo de dados
local success, data = pcall(mw.loadData, "Módulo:Cartas/dados")

--[[
   Função realmente manipulando o pedido (veja os parâmetros abaixo)
   Pode ser chamado diretamente de outro módulo sem passar por
   uma chamada de modelo/módulo no wikicode
   
--]]
function p.carta_m(infobox, categoria, tpe, sustenido)
    -- validação dos parâmetros (valor por padrão)
    if (infobox == nil) then infobox = "biografia" end
    if (categoria == nil) then categoria = "primária" end
    if ((tpe == nil) or (tpe == "")) then tpe = "padrão" end
    -- interromper se o carregamento do módulo de dados falhar
    if (not success) then
        return "<span class=\"error\">Problema interno no módulo (dados)</span>"
    end
    
    -- verificação da existência dos dados para a infobox
    if (data[infobox] == nil) then
        infobox = "biografia"
        if (data[infobox] == nil) then
            -- não deveria acontecer !
            return "<span class=\"error\">Problema interno no módulo (infobox)</span>"
        end
    end

    -- se este tipo contiver uma cadeia de texto (ao invés de uma tabela) é um "redireccionamento", nós substítuimos
    if (type(data[infobox][tpe]) == "string") then
        tpe = data[infobox][tpe]
    end
    -- nós checamos a existência do tipo
    if (data[infobox][tpe] == nil) then
        tpe = "padrão"
        if (data[infobox][tpe] == nil) then
            return "<span class=\"error\">Problema interno no módulo (tipo)</span>"
        end
    end

    -- procuramos o número do pedido da categoria
    local n = 1
    if (categoria == "primária" or categoria == "1" or categoria == "principal") then
        n = 1
    elseif (categoria == "secundária" or categoria == "2") then
        n = 2
    elseif (categoria == "terciária" or categoria == "3") then
        n = 3
        -- a 3ª é opcional
        if (data[infobox][tpe][n] == nil) then
            n = 1
        end
    end -- se não for encontrado, fique em "1"
    
    -- nós verificamos se temos um elemento
    if (data[infobox][tpe][n] == nil) then
        return "<span class=\"error\">Problema interno no módulo (elemento)</span>"
    end
    
    -- nós retornamos o valor
    if ((sustenido == "sim") or (sustenido == true)) then
        return "#" .. data[infobox][tpe][n]
    else
        return data[infobox][tpe][n]
    end
end

--[[
   Retorna a cor correspondente ao gráfico solicitado.
   Os parâmetros são:
     tipo: o tipo de carta de cor solicitada (depende da infobox)
     categoria: primária ou secundária (ou terciário), a sub-cor em questão
     infobox: a infobox em questão (valor padrão: biografia)
     sustenido: defina como "sim" para prefixar o valor retornado com um caractere "#"
   Se a categoria não for especificada ou errônea, a principal será retornada
   Se o tipo não for especificado ou inválido, o "padrão" será retornado
   Se a infobox não for especificada ou inválida, a "biografia" é retornada
 
   Os parâmetros podem vir da chamada para o módulo ou da chamada para o modelo (avaliado nesta ordem).
 
   Nota: invólucro recuperando os parâmetros e chamando a função "real"
--]]
function p.carta(frame)
    local infobox = frame.args["infobox"] or frame:getParent().args["infobox"]
    local categoria = frame.args["categoria"] or frame:getParent().args["categoria"]
    local tpe = mw.ustring.lower(frame.args["tipo"] or frame:getParent().args["tipo"] or "")
    local sustenido = frame.args["sustenido"] or frame:getParent().args["sustenido"]
    
    return p.carta_m(infobox, categoria, tpe, sustenido)
end

return p