---@type Diesal.GUI
local DiesalGUI = LibStub("DiesalGUI-2.0")

local Type = "DiesalContainer"
local Version = 1

---@class Diesal.GUI.Container.Methods
local ContainerMethods = {
    ---@param self Diesal.GUI.Container
    OnAcquire = function(self)
        self:ResetSettings(true)
        self:Show()
    end,

    ---@param self Diesal.GUI.Container
    OnRelease = function(self)
        self:ReleaseChildren()
    end,

    ---@param self Diesal.GUI.Container
    ApplySettings = function(self)
        local content = self.content
        content:SetPoint("TOPLEFT")
        content:SetPoint("BOTTOMRIGHT")
        self.frame:SetToplevel(true)
    end,

    ---@param self Diesal.GUI.Container
    SetTopLevel = function(self)
        self.frame:SetToplevel(true)
    end,

    ---@param self Diesal.GUI.Container
    ---@param element Diesal.GUI.ObjectBase
    SetElement = function(self, element)
        element.container = self
        element:SetParentObject(self)
        self:AddChild(element)
        self.element = element
    end,
}

---@alias DiesalContainer Diesal.GUI.Container

local function Constructor()
    ---@class Diesal.GUI.Container : Diesal.GUI.ObjectBase, Diesal.GUI.Container.Methods
    ---@field content Frame
    ---@field element? Diesal.GUI.ObjectBase
    local self = DiesalGUI:Create(Type, true)
    self.isContainer = true
    local frame = CreateFrame("Frame", nil, UIParent)
    self.frame = frame

    self.defaults = {}

    local content = self:CreateRegion("Frame", "content", frame)
    frame:SetToplevel(true)
    for k, v in pairs(ContainerMethods) do
        self[k] = v
    end
    return self
end

DiesalGUI:RegisterObjectConstructor(Type, Constructor, Version)
