local Utilidades = { }


--[[
    trim limpa um parâmetro sem nome (remove espaços iniciais e finais e retorna no início e no final)
retorna nil se o texto estiver vazio ou não for texto. Números não são considerados
como texto.
]]
function Utilidades.trim( texto )
    if type( texto ) == 'string' and texto ~= '' then
        texto = texto:gsub( '^%s*(%S?.-)%s*$', '%1' )
        if texto ~= '' then
            return texto
        end
    end
    return nil
end


--[[
    validTextArg retorna o primeiro parâmetro de string não vazio
    Parâmetro :
        1 - tabela contendo todos os parâmetros
        2, ... - os nomes dos parâmetros que devem ser testados.
]]
function Utilidades.validTextArg( args, name, ... )
    local texto = Utilidades.trim( args[name] )
    if texto then
        return texto
    end
    if select( '#', ... ) > 0 then
        return Utilidades.validTextArg( args, ... )
    end
    return nil
end


--[[
    notEmpty retorna o primeiro parâmetro não vazio ou nulo.
    Parâmetro :
        1, ... - os nomes dos parâmetros que devem ser testados.
]]
function Utilidades.notEmpty( var, ... )
    local texto = Utilidades.trim( var )
    if texto then
        return texto
    end
    local tvar = type( var )
   
    if tvar == 'table' then
        local nextFunc = pairs( var )   -- não use próximo car porque não está definido em par mw.loadData
        if nextFunc( var ) ~= nil then
            return var
        end
    elseif var == true or ( tvar == 'number' and var ~= 0 ) or tvar == 'function' then
        return var
    end
    if select( '#', ... ) > 0 then
        return Utilidades.notEmpty( ... )
    end
end


--[[
    extractArgs recupera os argumentos do modelo, ou a tabela
    passada para a função por outra função de um módulo,
    Parâmetro :
        1 - um objeto de quadro ou uma tabela contendo os parâmetros
        2, ...  - uma lista de nomes de parâmetros para determinar se os parâmetros são passados
        por #invoke. O primeiro parâmetro do frame será sistematicamente testado.
]]
function Utilidades.extractArgs ( frame )
    if type( frame.getParent ) == 'function' then
        local args = frame:getParent().args
        for k,v in pairs( frame.args ) do
            args[k] = v;
        end
        return args
    else
        return frame
    end
end


return Utilidades