local gears_obj = require("gears.object")

local screen, meta = awesome._shim_fake_class()

screen.count = 1

local function create_screen(args)
    local s = gears_obj()
    s.data = {}

    -- Copy the geo in case the args are mutated
    local geo = {
        x      = args.x     ,
        y      = args.y     ,
        width  = args.width ,
        height = args.height,
    }

    function s._resize(args2)
        geo.x      = args2.x      or geo.x
        geo.y      = args2.y      or geo.y
        geo.width  = args2.width  or geo.width
        geo.height = args2.height or geo.height
    end

    local wa = args.workarea_sides or 10

    return setmetatable(s,{ __index = function(_, key)
        if key == "geometry" then
            return {
                x      = geo.x or 0,
                y      = geo.y or 0,
                width  = geo.width ,
                height = geo.height,
            }
        elseif key == "workarea" then
            return {
                x      = (geo.x or 0) + wa  ,
                y      = (geo.y or 0) + wa  ,
                width  = geo.width    - 2*wa,
                height = geo.height   - 2*wa,
            }
        else
            return meta.__index(_, key)
        end
    end,
    __newindex = function(...) return meta.__newindex(...) end
})
end

local screens = {}

function screen._add_screen(args)
    local s = create_screen(args)
    table.insert(screens, s)
    s.index = #screens
    screen[#screen+1] = s
    screen[s] = s
end

function screen._get_extents()
    local xmax, ymax
    for _, v in ipairs(screen) do
        if not xmax or v.geometry.x+v.geometry.width > xmax.geometry.x+xmax.geometry.width then
            xmax = v
        end
        if not ymax or v.geometry.y+v.geometry.height > ymax.geometry.y+ymax.geometry.height then
            ymax = v
        end
    end

    return xmax.geometry.x+xmax.geometry.width, ymax.geometry.y+ymax.geometry.height
end

function screen._clear()
    for i=1, #screen do
        screen[screen[i]] = nil
        screen[i] = nil
    end
    screens = {}
end

function screen._setup_grid(w, h, rows, args)
    args = args or {}
    screen._clear()
    for i, row in ipairs(rows) do
        for j=1, row do
            args.x      = (j-1)*w + (j-1)*10
            args.y      = (i-1)*h + (i-1)*10
            args.width  = w
            args.height = h
            screen._add_screen(args)
        end
    end
end

screen._add_screen {width=320, height=240}

return screen

-- vim: filetype=lua:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:textwidth=80