
local detailsFramework = _G.DetailsFramework
if (not detailsFramework or not DetailsFrameworkCanLoad) then
	return
end

local CreateFrame = CreateFrame

---@class df_roundedpanel : frame, blz_backdrop, df_optionsmixin, df_titlebar
---@field cornerTextures texture[]
---@field edgeTextures texture[]
---@field Constructor fun(self:df_roundedpanel)

---@class blz_backdrop : table
---@field TopLeftCorner texture
---@field TopRightCorner texture
---@field BottomLeftCorner texture
---@field BottomRightCorner texture
---@field TopEdge texture
---@field BottomEdge texture
---@field LeftEdge texture
---@field RightEdge texture
---@field Center texture

detailsFramework.RoundedCornerPanelMixin = {
    Constructor = function(self)
        self.cornerTextures = {}
        self.edgeTextures = {}

        local red, green, blue, alpha = detailsFramework:GetDefaultBackdropColor()

		self:SetBackdrop({edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true})
		self:SetBackdropColor(red, green, blue, alpha * 0.95)
		self:SetBackdropBorderColor(0, 0, 0, 0.95)

        self.__background = self:CreateTexture(nil, "border", nil, -6)
        self.__background:SetColorTexture(red, green, blue)
        self.__background:SetAllPoints()

        self:SetSize(self.options.width, self.options.height)

        if (self.options.use_titlebar) then
            detailsFramework:CreateTitleBar(self)
            self:SetTitle(self.options.title)
        end

        if (self.options.use_scalebar) then
            detailsFramework:CreateScaleBar(self, self.options)
            self:SetScale(self.options.scale)
        end

        --fill the corner and edge textures table
        for index, cornerName in ipairs({"TopLeftCorner", "TopRightCorner", "BottomLeftCorner", "BottomRightCorner"}) do
            local thisTexture = self[cornerName]
            self.cornerTextures[cornerName] = thisTexture
            thisTexture:SetTexture([[Interface\CHARACTERFRAME\TempPortraitAlphaMaskSmall]])

            --local bIsOdd = index % 2 == 1
            --thisTexture:SetTexCoord(bIsOdd and 0 or 0.5, index < 3 and 0 or 0.5, bIsOdd and 0.5 or 1, index < 3 and 0.5 or 1)

            if (cornerName == "TopLeftCorner") then
                thisTexture:SetTexCoord(0, 0.5, 0, 0.5)
            elseif (cornerName == "TopRightCorner") then
                thisTexture:SetTexCoord(0.5, 1, 0, 0.5)
            elseif (cornerName == "BottomLeftCorner") then
                thisTexture:SetTexCoord(0, 0.5, 0.5, 1)
            elseif (cornerName == "BottomRightCorner") then
                thisTexture:SetTexCoord(0.5, 1, 0.5, 1)
            end
        end

        for _, edgeName in ipairs({"TopEdge", "BottomEdge", "LeftEdge", "RightEdge"}) do
            self.edgeTextures[edgeName] = self[edgeName]
        end
    end,
}

local defaultOptions = {
    width = 200,
    height = 200,
    use_titlebar = true,
    use_scalebar = true,
    title = "",
    scale = 1,
}

---create a regular panel with rounded corner
---@param parent frame
---@param name string|nil
---@param optionsTable table|nil
---@return df_roundedpanel
function detailsFramework:CreateRoundedPanel(parent, name, optionsTable)
    ---@type df_roundedpanel
    local newRoundedPanel = CreateFrame("frame", name, parent, "BackdropTemplate")
    newRoundedPanel:EnableMouse(true)
    newRoundedPanel.__dftype = "df_roundedpanel"

    detailsFramework:Mixin(newRoundedPanel, detailsFramework.RoundedCornerPanelMixin)
    detailsFramework:Mixin(newRoundedPanel, detailsFramework.OptionsFunctions)

    newRoundedPanel:BuildOptionsTable(defaultOptions, optionsTable or {})

    newRoundedPanel:Constructor()

    return newRoundedPanel
end
