local ffi = require("ffi")
local C = ffi.C
local core = require("pxl8.core")

local gui = {}

local Gui = {}
Gui.__index = Gui

function Gui.new()
    local s = C.pxl8_gui_state_create()
    if s == nil then
        return nil
    end
    return setmetatable({ _ptr = s }, Gui)
end

function Gui:begin_frame()
    C.pxl8_gui_begin_frame(self._ptr, core.gfx)
end

function Gui:button(id, x, y, w, h, label)
    return C.pxl8_gui_button(self._ptr, core.gfx, id, x, y, w, h, label)
end

function Gui:cursor_down()
    C.pxl8_gui_cursor_down(self._ptr)
end

function Gui:cursor_move(x, y)
    C.pxl8_gui_cursor_move(self._ptr, x, y)
end

function Gui:cursor_up()
    C.pxl8_gui_cursor_up(self._ptr)
end

function Gui:destroy()
    if self._ptr then
        C.pxl8_gui_state_destroy(self._ptr)
        self._ptr = nil
    end
end

function Gui:end_frame()
    C.pxl8_gui_end_frame(self._ptr, core.gfx)
end

function Gui:get_cursor_pos()
    local x = ffi.new("i32[1]")
    local y = ffi.new("i32[1]")
    C.pxl8_gui_get_cursor_pos(self._ptr, x, y)
    return x[0], y[0]
end

function Gui:is_hovering()
    return C.pxl8_gui_is_hovering(self._ptr)
end

gui.Gui = Gui

function gui.label(x, y, text, color)
    C.pxl8_gui_label(core.gfx, x, y, text, color)
end

function gui.window(x, y, w, h, title)
    C.pxl8_gui_window(core.gfx, x, y, w, h, title)
end

return gui
