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

    ZO_SortFilterList.InitializeSortFilterList(self, control)

    local sorterKeys =
    {
        ["name"] = {}
    }

    self.masterList = {}
    self.currentSortKey = "name"
    self.currentSortOrder = ZO_SORT_ORDER_UP
    ZO_ScrollList_AddDataType(self.list, 1, "LeoAltholicResearchListTemplate", 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

function LeoAltholicResearchList:SetupEntry(control, data)

    control.data = data

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

    local color
    control.craft = {}
    for _,craft in pairs(LeoAltholic.craftResearch) do
        local i = 1
        local researching = 0
        control.craft[craft] = GetControl(control, "Craft" .. craft)
        local lowest = -1
        local lowestTraitData = 0
        local list = {}
        for line = 1, GetNumSmithingResearchLines(craft) do
            local lineName, lineIcon = GetSmithingResearchLineInfo(craft, line)
            for trait = 1, LeoAltholic.maxTraits do
                local traitType = GetSmithingResearchLineTraitInfo(craft, line, trait)
                local traitName = GetString('SI_ITEMTRAITTYPE',traitType)
                local traitData = data.research[craft][line][trait]
                if type(traitData) == 'number' then
                    local diff = traitData - GetTimeStamp()
                    if lowest == -1 or diff < lowest then
                        lowest = diff
                        lowestTraitData = traitData
                    end
                    table.insert(list, {
                        craft = craft,
                        line = line,
                        trait = trait,
                        lineName = lineName,
                        lineIcon = lineIcon,
                        traitName = traitName,
                        timer = LeoAltholic.GetTime(diff),
                        traitData = traitData
                    })
                    i = i + 1
                    if traitData - GetTimeStamp() > 0 then
                        researching = researching + 1
                    end
                end
            end
        end
        color = '|c21A121'
        if researching < data.research[craft].max then
            color = '|cCB110E'
        end
        if researching > data.research[craft].max then researching = data.research[craft].max end
        local output = color .. researching .. '/' .. data.research[craft].max .. '|r'
        color = '|cFFFFFF'
        if lowest <= 3600 then
            color = '|cFFFF00'
        end
        if #list > 0 then
            output = output .. " " .. color..LeoAltholic.GetTime(lowest) .. '|r'
        end
        control.craft[craft]:SetText(output)
        control.craft[craft].list = list
        control.craft[craft].timerData = {
            researching = researching,
            max = data.research[craft].max,
            lowest = lowest,
            showLowest = #list > 0,
            lowestTraitData = lowestTraitData
        }
    end

    ZO_SortFilterList.SetupRow(self, control, data)
end


function LeoAltholicResearchList:ColorRow(control, data, mouseIsOver)

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

    local child = GetControl(control, "Name")
    if data.name == LeoAltholic.CharName then
        child:SetColor(r, g, b)
    else
        child:SetColor(color:UnpackRGBA())
    end
end

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

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

function LeoAltholicResearchList: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

local function addLine(tooltip, text, color)
    if not color then color = ZO_TOOLTIP_DEFAULT_COLOR end
    local r, g, b = color:UnpackRGB()
    tooltip:AddLine(text, "", r, g, b, CENTER, MODIFY_TEXT_TYPE_NONE, TEXT_ALIGN_LEFT, true)
end

local function addLineTitle(tooltip, text, color)
    if not color then color = ZO_SELECTED_TEXT end
    local r, g, b = color:UnpackRGB()
    tooltip:AddLine(text, "ZoFontHeader3", r, g, b, CENTER, MODIFY_TEXT_TYPE_NONE, TEXT_ALIGN_CENTER, true)
end

function LeoAltholicUI.TooltipResearch(control, visible)

    if visible then
        if #control.list == 0 then return end
        if not parent then parent = control end

        InitializeTooltip(InformationTooltip, control, LEFT, -30, 0)

        addLineTitle(InformationTooltip, GetCraftingSkillName(control.list[1].craft))

        for _, trait in pairs(control.list) do
            addLine(InformationTooltip, "|t30:30:"..trait.lineIcon.."|t "..trait.lineName.." "..trait.traitName.." "..trait.timer)
        end

        InformationTooltip:SetHidden(false)
    else
        ClearTooltip(InformationTooltip)
        InformationTooltip:SetHidden(true)
    end
end

function LeoAltholicUI:updateResearch()
    local control = LeoAltholicWindowResearchPanelListScrollListContents
    for i = 1, control:GetNumChildren() do
        for j = 2, 5 do
            local child = control:GetChild(i):GetChild(j)
            local color = '|c21A121'
            if child.timerData.researching < child.timerData.max then
                color = '|cCB110E'
            end
            local output = color .. child.timerData.researching .. '/' .. child.timerData.max .. '|r'
            color = '|cFFFFFF'
            if child.timerData.lowest <= 3600 then
                color = '|cFFFF00'
            end
            if child.timerData.showLowest then
                output = output .. " " .. color..LeoAltholic.GetTime(child.timerData.lowestTraitData - GetTimeStamp()) .. '|r'
            end
            child:SetText(output)
        end
    end
end