--===========================================================================--
----------------------------  LootTracker by PNB  ----------------------------
--===========================================================================--
-- LootTrackerSettingsUI.lua
--
-- Code behind the settings UI
--===========================================================================--


------------------------------------------------------------------------------
-- UpdateUI
------------------------------------------------------------------------------

function LT_UpdateUI()

    -- TODO: Move to LootTrackerSessionChangeUI.lua
    LT_OnSessionEditValueChanged(LT_ChangeSessionEditBox:GetText());
    
    LT_UpdateCurrentSessionText();

end


------------------------------------------------------------------------------
-- UpdateCurrentSessionText
------------------------------------------------------------------------------

function LT_UpdateCurrentSessionText()

    local settings = LT_GetSettings();
    local sessionName = settings.CurrentSession;
    LT_CurrentSessionText:SetText(LT_FormatSessionName(sessionName));

end


------------------------------------------------------------------------------
-- FormatSessionName
------------------------------------------------------------------------------

function LT_FormatSessionName(sessionName)

    local text = LT_ColorText(sessionName, LT_White);
    
    local session = LT_GetSession(sessionName, false);
    if (session ~= nil) then
        
        local sessionBeginTime  = session.FirstEventTime;
        local sessionEndTime    = session.MostRecentEventTime;
        if ((sessionBeginTime ~= nil) and (sessionEndTime ~= nil)) then
            -- Would use difftime() here, but WoW doesn't include that LUA API.
            local elapsedTime = sessionEndTime - sessionBeginTime;
            
            -- If I don't do this I'm getting a time that's offset by 16 hours.
            -- I don't exactly understand why, but this seems to clear it up...
            local baseTime = {};
            baseTime.year = 1970;
            baseTime.month = 1;
            baseTime.day = 1;
            baseTime.hour = 0;
            local offsetTime = time(baseTime);
            
            -- I'm not sure why time() is sometimes returning nil here, but some
            -- people are reporting an error there.  Pretty harmless to just
            -- check for nil and leave off the time display if that's the case.
            if (offsetTime ~= nil) then
            
                -- Get the elapsed time for this session.
                local elapsedTime = elapsedTime + offsetTime;

                local formattedStartTime = date(LT_LABEL_FORMAT_TIMESTART, sessionBeginTime);
                local formattedElapsedTime = date(LT_LABEL_FORMAT_TIMEELAPSED, elapsedTime);
                text = text .. "\n" .. string.format(LT_LABEL_TIMESUMMARY, formattedStartTime, formattedElapsedTime);
            end
        end
        
        local totalValue = 0;
        local items = session.Items;
        if (items ~= nil) then
            foreach(items, function(itemName, item)
                local itemValue = item.Value;
                if (itemValue ~= nil) then
                    local timesLooted = getn(item.TimesLooted);
                    totalValue = totalValue + (timesLooted * itemValue);
                end
            end);
        end
        
        if (totalValue > 0) then
            text = text .. "\nValue: " .. LT_GetValueString(totalValue, true);
        end
    end
    
    return text;

end


------------------------------------------------------------------------------
-- OnSessionEditValueChanged
------------------------------------------------------------------------------

function LT_OnSessionEditValueChanged(value)

    local settings = LT_GetSettings();
    local userData = LT_Data[LT_RealmAndPlayer];
    
    local isCurrentSession = (value == settings.CurrentSession);
    local doesSessionExist = LT_TableHasKey(userData, value);
    local isValidSessionName = not LT_StrIsNilOrEmpty(value);
    
    if (isCurrentSession) then
        LT_SetSessionButton:SetText(LT_BUTTON_CREATE);
        LT_SetSessionButton:Disable();
        
        LT_ResetButton:SetText(LT_BUTTON_RESET);
        LT_ResetButton:Enable();
        
        LT_ExportSessionButton:Disable();
    else
        if (isValidSessionName) then
            if (doesSessionExist) then
                LT_SetSessionButton:SetText(LT_BUTTON_SET);
            else
                LT_SetSessionButton:SetText(LT_BUTTON_CREATE);
            end
            LT_SetSessionButton:Enable();
        else
            LT_SetSessionButton:SetText(LT_BUTTON_CREATE);
            LT_SetSessionButton:Disable();
        end

        LT_ResetButton:SetText(LT_BUTTON_DELETE);        
        if (doesSessionExist) then
            LT_ResetButton:Enable();
        else
            LT_ResetButton:Disable();
        end
        
        if (isValidSessionName) then
            LT_ExportSessionButton:Enable();
        else
            LT_ExportSessionButton:Disable();
        end
    end

end


------------------------------------------------------------------------------
-- UpdateSessionScroll
------------------------------------------------------------------------------

LT_SCROLL_SESSIONITEMHEIGHT = 20;
LT_SCROLL_SESSIONVISIBLECOUNT = 5;

function LT_UpdateSessionScroll()

    local offset = FauxScrollFrame_GetOffset(LT_SessionScrollFrame);
    
    local validSessions = LT_GetAvailableSessions();
    local numItems = getn(validSessions);
    
    FauxScrollFrame_Update(LT_SessionScrollFrame, numItems, LT_SCROLL_SESSIONVISIBLECOUNT, LT_SCROLL_SESSIONITEMHEIGHT, nil, nil, nil, nil, 165, 100);
    
    -- Fill in the buttons
	for i=1, LT_SCROLL_SESSIONVISIBLECOUNT, 1 do

		local index = i + offset;
		local button = getglobal("LT_SessionButton" .. i);
		assert(button ~= nil);
		
		local sessionName = validSessions[index];
		
		if ((index <= numItems) and (sessionName ~= nil)) then
		    button:SetText(sessionName);
	        button:Show();
	    else
	        button:Hide();
	    end

	end

end

------------------------------------------------------------------------------
-- SessionButtonClicked
------------------------------------------------------------------------------

function LT_SessionButtonClicked(button)

    local text = button:GetText();
    LT_ChangeSessionEditBox:SetText(text);
    LT_UpdateCurrentSessionText();

end


------------------------------------------------------------------------------
-- SessionButtonClicked
------------------------------------------------------------------------------

function LT_SessionButtonClicked(button)

    local text = button:GetText();
    LT_ChangeSessionEditBox:SetText(text);
    LT_UpdateCurrentSessionText();

end


------------------------------------------------------------------------------
-- UpdateGenericScroller
------------------------------------------------------------------------------

function LT_UpdateGenericScroller(scroller)

    if (scroller == nil) then
        scroller = this;
    end
    
    assert(scroller ~= nil);
    
    if (scroller.Data ~= nil) then
        LT_DebugMessage(4, "Data: " .. scroller.Data.Name);
    end
    

    local offset = FauxScrollFrame_GetOffset(scroller);
    if (offset == nil) then
        offset = 0;
    end    
    
    local numItems = scroller.TotalCountHandler(scroller);
    LT_DebugMessage(4, "NumItems: " .. tostring(numItems));
    
    FauxScrollFrame_Update(scroller, numItems, scroller.VisibleCount, scroller.ItemHeight, nil, nil, nil, nil, scroller:GetWidth(), scroller:GetHeight());
    
    -- Fill in the buttons
	for i=1, scroller.VisibleCount, 1 do

		local index = i + offset;
		local button = getglobal(scroller.ButtonName .. i);
		assert(button ~= nil);
		
		if (index <= numItems) then
		
		    local label, data = scroller.ItemLabelHandler(scroller, index);
		    LT_DebugMessage(4, "Label(" .. index .. "): " .. tostring(label));
		    button:Show();

		    if (label ~= nil) then
		        button:SetText(label);
		        button.Data = data;

	            local text = getglobal(button:GetName() .. "Text");
		        assert(text ~= nil);
		        text:SetText(label);
		    end
	    else
	        LT_DebugMessage(4, "Label(" .. index .. "): <Hide>");
	        button:Hide();
	    end

	end

end


------------------------------------------------------------------------------
-- GetItemLabel
------------------------------------------------------------------------------

function LT_GetItemLabel(scroller, t, index, func)

    if (t == nil) then
        return "Unknown";
    end

    local currentIndex = 1;
    local label = nil;
    local data = nil;
    foreach(t, function(k,v)
        if (currentIndex == index) then
            label, data = func(scroller, k, v);
        end
        currentIndex = currentIndex + 1;
    end);

    if (label == nil) then
        label = func(scroller, "Unknown", nil);
    end
    
    return label, data;

end

------------------------------------------------------------------------------
-- Scroller_GetPercentageLabel
------------------------------------------------------------------------------

function LT_Scroller_GetPercentageLabel(scroller, k, v)

    local name = k;
    local count = v;

    if (count == nil) then
        count = scroller.UnknownCount;
        if ((count == nil) or (count == 0)) then
            return name, name;
        end
    end

    local percentage = (count / scroller.TotalCount) * 100;

    local label = string.format("%s: %d (%.0f%%)", name, count, percentage);
    local data = name;
    
    return label, data;

end


------------------------------------------------------------------------------
-- Scroller_GetLabel
------------------------------------------------------------------------------

function LT_Scroller_GetLabel(scroller, k, v)

    return tostring(v), k;

end
