local map = {
    map_tiles = {
        { "-", "-", "w", "w", "-", "-", "-", "-", "-", "-" },
        { "-", "_", "w", "w", "-", "-", "-", "-", "-", "-" },
        { "-", "-", "w", "w", "-", "w", "-", "-", "-", "-" },
        { "w", "-", "-", "-", "w", "w", "-", "-", "-", "-" },
        { "w", "-", "ww", "-", "-", "w", "w", "w", "-", "-" },
        { "w", "-", "ww", "-", "-", "w", "-", "-", "-", "-" },
        { "-", "-", "ww", "-", "-", "w", "-", "w", "-", "-" },
        { "-", "-", "-", "-", "-", "-", "-", "w", "-", "-" },
        { "-", "-", "ww", "-", "-", "-", "-", "w", "w", "-" },
        { "-", "-", "ww", "-", "-", "-", "-", "-", "w", "-" }
    },
    tileset = {
        display = { "-", "_", "w", "ww" },
        db = { "floor_stone,", "floor_wood", "wall_stone", "wall_wood" }
    },
    mapCrypt = function(self, tile)
        -- stores tiles as detailed names within the DB
        for i=1, #self.tileset.display do
            if self.tileset.display[i] == tile then
               return self.tileset.db[i]
           end
        end
    end,
    mapDecrypt = function(self, tile)
        -- Decodes tiles into their type (represented by char) and their material
        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
    end,
    -- Map Populate / check if map exists
    populate = function(self, map, game)
        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 = "",
                    game_ref = game
                })
            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
