TashDLPhraseList = ZO_SortFilterList:Subclass()


function TashDLPhraseList:New(control, tooltipControl)
    local sorterKeys = {
        ["NPC"] = {},
        ["timestamp"] = {tiebreaker="NPC"},
        ["bodyText"] = {tiebreaker="NPC"},
        ["optionText"] = {tiebreaker="NPC"},
    }

    self.duplicatesMode = TashDialogueLog.savedVariables.duplicatesMode
    self.tooltipControl = tooltipControl
    self.authorSearchBox = GetControl(control, "AuthorSearchBox")
    self.authorSearchBox:SetHandler("OnTextChanged", function() self:OnSearchTextChanged(self.authorSearchBox) end)
    self.fullTextSearchBox = GetControl(control, "FullTextSearchBox")
    self.fullTextSearchBox:SetHandler("OnTextChanged", function() self:OnSearchTextChanged(self.fullTextSearchBox) end)

    ZO_SortFilterList.InitializeSortFilterList(self, control)
    self:BuildMasterList()
    ZO_ScrollList_AddDataType(
        self.list, 1, "TashDLPhraseRow", 70, function(control, data) self:SetupEntry(control, data) end
    )
    ZO_ScrollList_EnableHighlight(self.list, "ZO_ThinListHighlight")

    self.currentSortKey = "timestamp"

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

    -- Searching
    self:RefreshData()

    return self
end


function TashDLPhraseList:SetAuthor(NPCName)
    self.authorSearchBox:SetText(NPCName)
end


function TashDLPhraseList:OnSearchTextChanged(control)
    ZO_EditDefaultText_OnTextChanged(control)
    self:RefreshFilters()
end


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

function TashDLPhraseList:FilterScrollList()

    -- If you want to add a filter

    local scrollData = ZO_ScrollList_GetDataList(self.list)
    ZO_ClearNumericallyIndexedTable(scrollData)

    local author = self.authorSearchBox:GetText():lower()
    local search_term = self.fullTextSearchBox:GetText():lower()

    for i = 1, #self.masterList do
        local data = self.masterList[i]
        local term_found = true
        if search_term ~= "" then
            term_found = zo_plainstrfind(data.bodyText:lower(), search_term) or zo_plainstrfind((data.optionText or ""):lower(), search_term)
        end
        local author_found = true
        if author ~= "" then
            author_found = zo_plainstrfind(data.NPC:lower(), author)
        end
        if term_found and author_found then
            table.insert(scrollData, ZO_ScrollList_CreateDataEntry(1, data))
        end
    end
end

function TashDLPhraseList:BuildMasterList()
    self.masterList = TashDialogueLog:BuildPhrasesTable(
        function(data) return data.bodyText ~= nil end, self.duplicatesMode
    )
end


function TashDLPhraseList:OnMouseEnter(control)
    self.tooltipControl:Update(control)
    self.tooltipControl:Show(control)
    self:Row_OnMouseEnter(control)
end


function TashDLPhraseList:OnMouseExit(control)
    self.tooltipControl:Hide()
    self:Row_OnMouseExit(control)
end


function TashDLPhraseList:OnShow()
    local tc = TashDialogueLog.constants
    local buttonAll = GetControl(self.control, "ShowDuplicatesAll")
    local buttonFirst = GetControl(self.control, "ShowDuplicatesFirst")
    local buttonLast = GetControl(self.control, "ShowDuplicatesLast")

    local buttons = {
        [tc.IGNORE_DUPLICATES_SHOW_ALL] = buttonAll,
        [tc.IGNORE_DUPLICATES_SHOW_FIRST] = buttonFirst,
        [tc.IGNORE_DUPLICATES_SHOW_LAST] = buttonLast,
    }

    local r,g,b = GetInterfaceColor(INTERFACE_COLOR_TYPE_TEXT_COLORS, INTERFACE_TEXT_COLOR_DISABLED)
    for i=1, #buttons do
        buttons[i]:SetColor(r, g, b)
        buttons[i].list = self
    end

    r,g,b = GetInterfaceColor(INTERFACE_COLOR_TYPE_TEXT_COLORS, INTERFACE_TEXT_COLOR_NORMAL)
    buttons[self.duplicatesMode]:SetColor(r, g, b)
end


function TashDLPhraseList:OnDuplicatesModeButtonClick(value)
    self.duplicatesMode = value
    self:RefreshData()
    self:OnShow()
end



function TashDLPhraseList:SetupEntry(control, data)
    control.data = data
    control.obj = self
    control.NPC = GetControl(control, "NPC")
    control.ts = GetControl(control, "Time")
    control.bodyText = GetControl(control, "BodyText")
    control.optionText = GetControl(control, "OptionText")

    control.NPC.normalColor = TashDialogueLog.colors.NPCNAME
    control.ts.normalColor = TashDialogueLog.colors.TIMESTAMP
    control.bodyText.normalColor = TashDialogueLog.colors.BODYTEXT
    control.optionText.normalColor = TashDialogueLog.colors.OPTIONTEXT

    control.NPC:SetText(data.NPC)
    control.ts:SetText(TashDialogueLog:FormatTimestamp(data.timestamp))
    control.optionText:SetText(data.optionText)
    control.bodyText:SetText(data.bodyText)
    ZO_SortFilterList.SetupRow(self, control, data)
end