LeoAltholicInventoryList = ZO_SortFilterList:Subclass()
function LeoAltholicInventoryList:New(control)

    ZO_SortFilterList.InitializeSortFilterList(self, control)

    local sorterKeys =
    {
        ["name"] = {},
        ["bag"] = { tiebreaker = "name" },
        ["gold"] = { tiebreaker = "name" },
        ["soulgems"] = { tiebreaker = "name" },
        ["ap"] = { tiebreaker = "name" },
        ["telvar"] = { tiebreaker = "name" },
        ["writvouchers"] = { tiebreaker = "name" },
    }

    self.masterList = {}
    self.currentSortKey = "name"
    self.currentSortOrder = ZO_SORT_ORDER_UP
    ZO_ScrollList_AddDataType(self.list, 1, "LeoAltholicInventoryListTemplate", 32, function(control, data) self:SetupEntry(control, data) end)

    self.sortFunction = function(listEntry1, listEntry2)
        return ZO_TableOrderingFunction(listEntry1.data, listEntry2.data, self.currentSortKey, sorterKeys, self.currentSortOrder)
    end

    return self
end

local function formatNumber(amount)
    if amount == nil then return nil; end
    if type(amount) == "string" then amount = tonumber( amount ) end
    if type(amount) ~= "number" then return amount; end
    if amount < 1000 then return amount; end
    return FormatIntegerWithDigitGrouping( amount, GetString( SI_DIGIT_GROUP_SEPARATOR ) )
end

function LeoAltholicInventoryList:SetupEntry(control, data)

    control.data = data

    control.name = GetControl(control, "Name")
    control.name:SetText(data.name)

    local color = '|c'..LeoAltholic.color.hex.green
    if data.inventory.free <= 25 then color = '|c'..LeoAltholic.color.hex.orange end
    if data.inventory.free <= 10 then color = '|c'..LeoAltholic.color.hex.red end
    control.bag = GetControl(control, "Bag")
    control.bag:SetText(color .. data.inventory.used .. "|r / " .. data.inventory.size)

    control.soulgems = GetControl(control, "SoulGems")
    control.soulgems:SetText("|c" ..LeoAltholic.color.hex.green.. data.inventory.soulGemFilled .. '|r / ' .. data.inventory.soulGemEmpty)

    control.gold = GetControl(control, "Gold")
    control.gold:SetText(formatNumber(data.inventory.gold))

    control.ap = GetControl(control, "AP")
    control.ap:SetText(formatNumber(data.inventory.ap))

    control.telvar = GetControl(control, "TelVar")
    control.telvar:SetText(formatNumber(data.inventory.telvar))

    control.writVouchers = GetControl(control, "Writ")
    control.writVouchers:SetText(formatNumber(data.inventory.writVoucher))

    control.listButton = GetControl(control, "ListButton")
    control.listButton:SetHandler('OnClicked', function() LeoAltholic.ShowInventoryUI(data.name, BAG_BACKPACK) end)

    ZO_SortFilterList.SetupRow(self, control, data)
end

function LeoAltholicStatsList:ColorRow(control, data, mouseIsOver)

    local color = ZO_SECOND_CONTRAST_TEXT
    local r, g, b = GetInterfaceColor(INTERFACE_COLOR_TYPE_ITEM_QUALITY_COLORS, ITEM_QUALITY_MAGIC)

    for i = 1, control:GetNumChildren() do
        local child = control:GetChild(i)
        if child then
            if data.name == LeoAltholic.CharName then
                child:SetColor(r, g, b)
            else
                child:SetColor(color:UnpackRGBA())
            end
        end
    end
end

function LeoAltholicInventoryList:ColorRow(control, data, mouseIsOver)

    local color = ZO_SECOND_CONTRAST_TEXT
    local r, g, b = GetInterfaceColor(INTERFACE_COLOR_TYPE_ITEM_QUALITY_COLORS, ITEM_QUALITY_MAGIC)

    for i = 1, control:GetNumChildren() do
        local child = control:GetChild(i)
        if child:GetType() == CT_LABEL and string.find(child:GetName(), 'Name$') then
            if data.name == LeoAltholic.CharName then
                child:SetColor(r, g, b)
            else
                child:SetColor(color:UnpackRGBA())
            end
        end
        if not child.nonRecolorable and child.number ~= nil then
            if child.number == child.max then
                child:SetColor(0, 1, 0, 1)
            elseif child.number > child.max * 0.8 then
                child:SetColor(1, 1, 0, 1)
            elseif child.number > child.max * 0.1 then
                child:SetColor(color:UnpackRGBA())
            else
                child:SetColor(1, 0, 0, 1)
            end
        end
    end
end

function LeoAltholicInventoryList:BuildMasterList()
    self.masterList = {}
    local list = LeoAltholic.ExportCharacters(true)
    for k, v in ipairs(list) do
        local data = {
            name = v.bio.name,
            inventory = v.inventory
        }
        data.queueIndex = k
        table.insert(self.masterList, data)
    end
end

function LeoAltholicInventoryList:SortScrollList()
    local scrollData = ZO_ScrollList_GetDataList(self.list)
    table.sort(scrollData, self.sortFunction)
end

function LeoAltholicInventoryList:FilterScrollList()
    local scrollData = ZO_ScrollList_GetDataList(self.list)
    ZO_ClearNumericallyIndexedTable(scrollData)
    for i = 1, #self.masterList do
        local data = self.masterList[i]
        table.insert(scrollData, ZO_ScrollList_CreateDataEntry(1, data))
    end
end

function LeoAltholicUI.InitInventory()
    local panel = WINDOW_MANAGER:GetControlByName("LeoAltholicWindowInventoryPanel")
    local list = GetControl(panel, "ListScroll")

    local charTotalRow = WINDOW_MANAGER:CreateControlFromVirtual("LeoAltholicWindowInventoryPanelCharTotalRow", panel, "LeoAltholicInventoryListTemplate")
    charTotalRow:SetAnchor(TOPLEFT, list, BOTTOMLEFT, 20, 0)
    local control = GetControl(charTotalRow, "Name")
    control:SetText(ZO_CachedStrFormat(GetString(LEOALT_TOTAL_INVENTORY)))
    local gold = 0
    local soulGemFilled = 0
    local soulGemEmpty = 0
    local ap = 0
    local telvar = 0
    local writVoucher = 0
    for _, char in ipairs(LeoAltholic.ExportCharacters()) do
        gold = gold + char.inventory.gold
        ap = ap + char.inventory.ap
        telvar = telvar + char.inventory.telvar
        writVoucher = writVoucher + char.inventory.writVoucher
        soulGemFilled = soulGemFilled + char.inventory.soulGemFilled
        soulGemEmpty = soulGemEmpty + char.inventory.soulGemEmpty
    end
    GetControl(charTotalRow, "Gold"):SetText(formatNumber(gold))
    GetControl(charTotalRow, "AP"):SetText(formatNumber(ap))
    GetControl(charTotalRow, "TelVar"):SetText(formatNumber(telvar))
    GetControl(charTotalRow, "Writ"):SetText(formatNumber(writVoucher))
    control = GetControl(charTotalRow, "SoulGems")
    control:SetText("|c" ..LeoAltholic.color.hex.green.. soulGemFilled .. '|r / ' .. soulGemEmpty)
    GetControl(charTotalRow, "ListButton"):SetHidden(true)

    local bankRow = WINDOW_MANAGER:CreateControlFromVirtual("LeoAltholicWindowInventoryPanelBankRow", panel, "LeoAltholicInventoryListTemplate")
    bankRow:SetAnchor(TOPLEFT, list, BOTTOMLEFT, 20, 30)
    control = GetControl(bankRow, "Name")
    control:SetText(ZO_CachedStrFormat(GetString(SI_CURRENCYLOCATION1)))
    control = GetControl(bankRow, "ListButton")
    control:SetHandler('OnClicked', function() LeoAltholic.ShowInventoryUI(nil, BAG_BANK) end)

    local totalRow = WINDOW_MANAGER:CreateControlFromVirtual("LeoAltholicWindowInventoryPanelTotalRow", panel, "LeoAltholicInventoryListTemplate")
    totalRow:SetAnchor(TOPLEFT, list, BOTTOMLEFT, 20, 60)
    control = GetControl(totalRow, "Name")
    control:SetText(ZO_CachedStrFormat(GetString(LEOALT_TOTAL)))
    GetControl(totalRow, "ListButton"):SetHidden(true)

    GetControl(totalRow, "Gold"):SetText(formatNumber(gold + LeoAltholic.globalData.AccountData.inventory.money))
    GetControl(totalRow, "AP"):SetText(formatNumber(ap + LeoAltholic.globalData.AccountData.inventory.ap))
    GetControl(totalRow, "TelVar"):SetText(formatNumber(telvar + LeoAltholic.globalData.AccountData.inventory.telvar))
    GetControl(totalRow, "Writ"):SetText(formatNumber(writVoucher + LeoAltholic.globalData.AccountData.inventory.writVoucher))
    control = GetControl(totalRow, "SoulGems")
    control:SetText("|c" ..LeoAltholic.color.hex.green.. (soulGemFilled+LeoAltholic.globalData.AccountData.inventory.soulGemFilled)
            .. '|r / ' .. (soulGemEmpty+LeoAltholic.globalData.AccountData.inventory.soulGemEmpty))

    LeoAltholicUI.UpdateInventory()
end

function LeoAltholicUI.UpdateInventory()

    local data = LeoAltholic.globalData.AccountData
    local bankRow = WINDOW_MANAGER:GetControlByName("LeoAltholicWindowInventoryPanelBankRow")

    local free = data.inventory[BAG_BANK].free + data.inventory[BAG_SUBSCRIBER_BANK].free
    local used = data.inventory[BAG_BANK].used + data.inventory[BAG_SUBSCRIBER_BANK].used
    local size = data.inventory[BAG_BANK].size + data.inventory[BAG_SUBSCRIBER_BANK].size
    local color = '|c'..LeoAltholic.color.hex.green
    if free <= 25 then color = '|c'..LeoAltholic.color.hex.orange end
    if free <= 10 then color = '|c'..LeoAltholic.color.hex.red end
    control = GetControl(bankRow, "Bag")
    control:SetText(color .. used .. "|r / " .. size)

    control = GetControl(bankRow, "Gold")
    control:SetText(formatNumber(data.inventory.money))

    control = GetControl(bankRow, "SoulGems")
    if data.inventory.soulGemFilled ~= nil then
        control:SetText("|c" ..LeoAltholic.color.hex.green.. data.inventory.soulGemFilled .. '|r / ' .. data.inventory.soulGemEmpty)
    end

    control = GetControl(bankRow, "AP")
    control:SetText(formatNumber(data.inventory.ap))

    control = GetControl(bankRow, "TelVar")
    control:SetText(formatNumber(data.inventory.telvar))

    control = GetControl(bankRow, "Writ")
    control:SetText(formatNumber(data.inventory.writVoucher))
end