LeoAltholicSkillsList = ZO_SortFilterList:Subclass()
function LeoAltholicSkillsList: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, "LeoAltholicSkillsListTemplate", 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 LeoAltholicSkillsList:SetupEntry(control, data)

    control.data = data

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

    control.craft = {}
    for i = 1, 7 do
        control.craft[i] = GetControl(control, "Craft"..i)
        if data.skills.craft[i] then
            control.craft[i]:SetText(data.skills.craft[i].rank)
            control.craft[i].number = tonumber(data.skills.craft[i].rank)
            control.craft[i].tooltip = {
                name = data.skills.craft[i].name,
                rank = data.skills.craft[i].rank,
                id = data.skills.craft[i].id,
                list = {}
            }
            for k, skill in ipairs(data.skills.craft[i].list) do
                if data.skills.craft[i].list[k].level == nil or data.skills.craft[i].list[k].level > 0 then
                    table.insert(control.craft[i].tooltip.list, data.skills.craft[i].list[k].name)
                end
            end
        else
            control.craft[i]:SetText("-")
            control.craft[i].number = tonumber(0)
        end
        control.craft[i].max = tonumber(50)
    end

    control.armor = {}
    for i = 1, 3 do
        control.armor[i] = GetControl(control, "Armor"..i)
        if data.skills.armor[i] then
            control.armor[i]:SetText(data.skills.armor[i].rank)
            control.armor[i].number = tonumber(data.skills.armor[i].rank)
            control.armor[i].tooltip = {
                name = data.skills.armor[i].name,
                rank = data.skills.armor[i].rank,
                id = data.skills.armor[i].id,
                list = {}
            }
            for k, skill in ipairs(data.skills.armor[i].list) do
                if data.skills.armor[i].list[k].level == nil or data.skills.armor[i].list[k].level > 0 then
                    table.insert(control.armor[i].tooltip.list, data.skills.armor[i].list[k].name)
                end
            end
        else
            control.armor[i]:SetText("-")
            control.armor[i].number = tonumber(0)
        end
        control.armor[i].max = tonumber(50)
    end

    control.weapon = {}
    for i = 1, 6 do
        control.weapon[i] = GetControl(control, "Weapon"..i)
        if data.skills.weapon[i] then
            control.weapon[i]:SetText(data.skills.weapon[i].rank)
            control.weapon[i].number = tonumber(data.skills.weapon[i].rank)
            control.weapon[i].tooltip = {
                name = data.skills.weapon[i].name,
                rank = data.skills.weapon[i].rank,
                id = data.skills.weapon[i].id,
                list = {}
            }
            for k, skill in ipairs(data.skills.weapon[i].list) do
                if data.skills.weapon[i].list[k].level == nil or data.skills.weapon[i].list[k].level > 0 then
                    table.insert(control.weapon[i].tooltip.list, data.skills.weapon[i].list[k].name)
                end
            end
        else
            control.weapon[i]:SetText("-")
            control.weapon[i].number = tonumber(0)
        end
        control.weapon[i].max = tonumber(50)
    end

    control.class = {}
    for i = 1, 3 do
        control.class[i] = GetControl(control, "Class"..i)
        if data.skills.class[i] then
            control.class[i]:SetText(data.skills.class[i].rank)
            control.class[i].number = tonumber(data.skills.class[i].rank)
            control.class[i].tooltip = {
                name = data.skills.class[i].name,
                rank = data.skills.class[i].rank,
                id = data.skills.class[i].id,
                list = {}
            }
            for k, skill in ipairs(data.skills.class[i].list) do
                if data.skills.class[i].list[k].level == nil or data.skills.class[i].list[k].level > 0 then
                    table.insert(control.class[i].tooltip.list, data.skills.class[i].list[k].name)
                end
            end
        else
            control.class[i]:SetText("-")
            control.class[i].number = tonumber(0)
        end
        control.class[i].max = tonumber(50)
    end

    control.racial = GetControl(control, "Racial")
    if data.skills.racial[1] then
        control.racial:SetText(data.skills.racial[1].rank)
        control.racial.number = tonumber(data.skills.racial[1].rank)
        control.racial.tooltip = {
            name = data.skills.racial[1].name,
            rank = data.skills.racial[1].rank,
            list = {}
        }
        if data.skills.racial[1].list then
            for k, skill in ipairs(data.skills.racial[1].list) do
                if data.skills.racial[1].list[k].level == nil or data.skills.racial[1].list[k].level > 0 then
                    table.insert(control.racial.tooltip.list, data.skills.racial[1].list[k].name)
                end
            end
        end
    else
        control.racial:SetText("-")
        control.racial.number = tonumber(0)
    end
    control.racial.max = tonumber(50)


    ZO_SortFilterList.SetupRow(self, control, data)
end

function LeoAltholicSkillsList: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 child:GetType() == CT_LABEL and child:GetName() 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
end

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

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

function LeoAltholicSkillsList: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_SELECTED_TEXT 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_TOOLTIP_DEFAULT_COLOR 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.TooltipSkill(control, visible)

    if visible and control.tooltip and control.tooltip.name then
        if not parent then parent = control end

        InitializeTooltip(InformationTooltip, control, LEFT, 5, 0)

        local title = ZO_CachedStrFormat(SI_ABILITY_NAME, control.tooltip.name)
        if  control.tooltip.rank then
            title = title  .." - ".. control.tooltip.rank
        end
        addLineTitle(InformationTooltip, title)

        for _, skill in pairs(control.tooltip.list) do
            addLine(InformationTooltip, ZO_CachedStrFormat(SI_ABILITY_NAME, skill))
        end
        InformationTooltip:SetHidden(false)
        InformationTooltipTopLevel:BringWindowToTop()
    else
        ClearTooltip(InformationTooltip)
        InformationTooltip:SetHidden(true)
    end
end