local WIT, core = ...

local AceGUI = LibStub("AceGUI-3.0")

local GridColumns = core.GridColumns

function GridColumns.GridColumn(options)
    options = options or {}
    options.Visible = options.Visible == nil and true or options.Visible
    options.Name = options.Name or ''
    options.Sortable = options.Sortable == nil and true or options.Sortable
    options.IsFixedSize = options.IsFixedSize or false

    local self = {
        Visible = options.Visible,
        Name = options.Name,
        DisplayName = core.GetString(options.Name),
        Sortable = options.Sortable,
        IsFixedSize = options.IsFixedSize,
        IsHidden = options.IsHidden or false
    }

    function self.Value(data)
        return 0
    end

    function self.GetCell(row)
        local cell = AceGUI:Create("Label")

        cell:SetText(self.GetRowText(row))

        return cell
    end

    function self.IsVisible()
        return self.Visible
    end

    function self.IsSortable()
        return self.Sortable
    end

    function self.GetSortValue(row)
        row[self.Name] = row[self.Name] or self.Value(row.Data)

        return row[self.Name] or 0
    end

    function self.GetRowText(row)
        row[self.Name] = row[self.Name] or self.Value(row.Data)

        return row[self.Name] or ''
    end

    function self.GetColumnMinWidth(rows)
        local label = AceGUI:Create("Label")
        label:SetText(self.DisplayName or self.Name)

        local maxWidth = label.label:GetStringWidth() + 5

        for _, row in pairs(rows) do
            label:SetText(self.GetRowText(row))
            local width = label.label:GetStringWidth() + 5

            if width > maxWidth then
                maxWidth = width
            end
        end

        label:Release()

        return maxWidth
    end

    function self.GetHeaderCell(onClickHandler)
        local container = AceGUI:Create("SimpleGroup")
        local cell = AceGUI:Create("InteractiveLabel")
            
        cell:SetText(self.DisplayName or self.Name)
        cell:SetWidth(cell.label:GetStringWidth() + 5)

        if self.Description then
            cell:SetCallback("OnEnter", function()
                GameTooltip:SetOwner(cell.frame, "ANCHOR_PRESERVE")
	            GameTooltip:ClearAllPoints()
	            GameTooltip:SetPoint("LEFT", cell.frame, "RIGHT")
                GameTooltip:ClearLines()
                GameTooltip:AddLine(self.Description)
                GameTooltip:Show()
            end)
            cell:SetCallback("OnLeave", function()
                GameTooltip:Hide()
            end)
        end

        cell:SetCallback("OnClick", function()
            if onClickHandler then
                onClickHandler(self)
            end
        end)

        container:AddChild(cell)

        return container
    end
    
    return self
end
