local map = {
    map_tiles = {
        { "-", "-", "w", "w", "-", "-", "-", "-", "-", "-" },
        { "-", "_", "w", "w", "-", "-", "-", "-", "-", "-" },
        { "-", "-", "w", "w", "-", "w", "-", "-", "-", "-" },
        { "w", "-", "-", "-", "w", "w", "-", "-", "-", "-" },
        { "w", "-", "w", "-", "-", "w", "w", "w", "-", "-" },
        { "w", "-", "w", "-", "-", "w", "-", "-", "-", "-" },
        { "-", "-", "w", "-", "-", "w", "-", "w", "-", "-" },
        { "-", "-", "-", "-", "-", "-", "-", "w", "-", "-" },
        { "-", "-", "w", "-", "-", "-", "-", "w", "w", "-" },
        { "-", "-", "w", "-", "-", "-", "-", "-", "w", "-" }
    },
    mapCrypt = function(self, tile)
        if tile == "-" then
            return "floor_stone"
        elseif tile == "_" then
            return "floor_wood"
        elseif tile == "w" then
            return "wall_stone"
        end
    end,
    mapDecrypt = function(self, tile)
        -- TODO: Rework function so it returns both char and mat type
        -- This introduces breaking changes
        local tileset = {}
        if string.find(tile, "wall") then
            tileset.char = "w"
        elseif string.find(tile, "floor") then
            tileset.char = "-"
        end
        if string.find(tile, "stone") then
            tileset.material = "stone"
        elseif string.find(tile, "wood") then
            tileset.material = "wood"
        end
        return tileset

        -- if tile == "floor_stone" then
        --     return "-"
        -- elseif tile == "wall_stone" then
        --    return "w"
        -- end
    end,
    -- Map Populate / check if map exists
    populate = function(self, map)
        for h = 1, 10 do
            for i = 1, 10 do
                local tile = map:create({
                    x = h,
                    y = i,
                    occupied_by_type = self:mapCrypt(self.map_tiles[h][i]),
                    occupied_by_id = ""
                })
            end
        end
    end,
    mapExists = function(self, map)
        local f = map:select("limit 1")
        if not f[1] then
            return false
        else
            return true
        end
    end,
}

return map
