local utils = require "lib.utils.utils"
--- @class TileGrid : Grid
local map = setmetatable({}, require "lib.level.grid.base")
map.__index = map

--- create new map
--- @param type "procedural"|"handmaded"
--- @param template Procedural|Handmaded
--- @param size? Vec3
local function new(type, template, size)
    local tMap = require('lib.level.' .. type).new(template, size)
    local grid = setmetatable({ __grid = tMap }, map)
    grid:refreshBatch()
    return grid
end

function map:refreshBatch()
    -- Находим атлас первого попавшегося тайла (предполагаем, что он один для всех)
    local _, firstTile = next(self.__grid)
    if not firstTile then return end

    local atlas = firstTile.atlasData.atlas
    local count = 0
    for _ in pairs(self.__grid) do count = count + 1 end

    self.batch = love.graphics.newSpriteBatch(atlas, count)
    for _, tile in pairs(self.__grid) do
        -- 1/32 это масштаб, так как размер тайла в мире 1x1 метр, а в атласе 32x32 пикселя
        self.batch:add(tile.atlasData.quad, tile.position.x, tile.position.y, 0, 1 / 32, 1 / 32)
    end
end

function map:draw()
    if not self.batch then return end
    Tree.level.render:enqueue(Tree.level.render.LAYERS.FLOOR, 0, function()
        love.graphics.draw(self.batch)
    end)
end

return { new = new }
