-- 工具方法
function tableToString(_table)
    local outputs = {}
    if _table == nil then
        table.insert(outputs, '<nil>')
    elseif type(_table) == 'table' then
        for k, v in pairs(_table) do
            local output
            if type(v) == 'table' then
                output = tableToString(v)
            else
                output = tostring(v)
            end
            table.insert(outputs, tostring(k) .. "=" .. output)
        end
    end
    return '{' .. table.concat(outputs, ",") .. '}'
end

-- Context start
local _NavboxContext = {}
local NavboxContextNewObj = function(_prefix, _level, _type, _parent)
    return {
        ['prefix'] = _prefix,
        ['level'] = _level,
        ['type'] = _type,
        ['_Context'] = {}
    }
end

local NavboxContextMetaFunction = {
    __index = function(_obj, key)
        local _key = tostring(key)
        if _key == 'prefix' or _key == 'level' or _key == 'type' then
            return rawget(_obj, _key)
        else
            return rawget(_obj, '_Context')[_key]
        end
    end,
    __newindex = function(_obj, key, val)
        local _key = tostring(key)
        if _key == 'prefix' or _key == 'level' or _key == 'type' then
            rawset(_obj, _key, val)
        else
            rawget(_obj, '_Context')[_key] = val
        end
    end,
    __tostring = function(_obj)
        local output = {}
        table.insert(output, 'prefix=' .. _obj['prefix'])
        table.insert(output, 'level=' .. _obj['level'])
        table.insert(output, 'type=' .. _obj['type'])
        for k, v in pairs(_obj._Context) do
            local t_v = v
            if t_v == nil then
                t_v = ''
            elseif type(t_v) == 'table' then
                t_v = tableToString(t_v)
            end
            table.insert(output, k .. '=' .. t_v)
        end
        return 'context:{\n' .. table.concat(output, ",\n") .. '\n}'
    end
}

_NavboxContext.new = function(prefix, level, t_type)
    local _prefix = prefix or ""
    local _level = level or 1
    local _type = t_type or ''

    local newobj = NavboxContextNewObj(_prefix, _level, _type)
    setmetatable(newobj, NavboxContextMetaFunction)
    return newobj
end

return _NavboxContext
-- Context end