Quantcast
local addonName, addonTable = ...

-- Global functions for faster access
local format = format;
local tinsert = tinsert;

-- Set up module
local addon = addonTable[1];
local report = addon:NewModule("report", "AceHook-3.0")
addon.report = report;

-- AceGUI
local AceGUI = LibStub("AceGUI-3.0");

-- Constants
-- [25/02/01] #1. 24.5k - Saniera (Shadow, 680ilvl)
local PARSE_OUTPUT_FORMAT_NO_ILVL_SPEC = "[%s] #%d. %s - %s";
local PARSE_OUTPUT_FORMAT_NO_SPEC = PARSE_OUTPUT_FORMAT_NO_ILVL_SPEC .. " (%d ilvl)";
local PARSE_OUTPUT_FORMAT_NO_ILVL = PARSE_OUTPUT_FORMAT_NO_ILVL_SPEC .. " (%s)";
local PARSE_OUTPUT_FORMAT 		  = PARSE_OUTPUT_FORMAT_NO_ILVL_SPEC .. " (%s, %d ilvl)";

local PARSE_TIME_FORMAT = "%x";

local FILTER_TIME_FORMAT = "%m/%d/%y %H:%M";
local SEND_TO_CHANNELS_LIST = {
	SELF = "Self",
	SAY = "Say",
	PARTY = "Party",
	RAID = "Raid",
	GUILD = "Guild",
	INSTANCE_CHAT = "Instance",
	WHISPER = "Whisper"
};
local SEND_TO_CHANNELS_LIST_ORDER = {"SELF", "SAY", "PARTY", "RAID", "GUILD", "INSTANCE_CHAT", "WHISPER"};

local MAX_PARSES_TO_SEND = 30;

local function getParseStringFromParse(rank, parse)
	local dataNum = (parse.role == "HEALER") and parse.hps or parse.dps;
	dataNum = addon.gui:FormatNumber(dataNum);
	local name = parse.name;
	local spec = parse.specName;
	local itemLevel = parse.itemLevel;
	local time = date(PARSE_TIME_FORMAT, parse.startTime);

	if spec and itemLevel then
		return format(PARSE_OUTPUT_FORMAT, time, rank, dataNum, name, spec, itemLevel);
	elseif spec then
		return format(PARSE_OUTPUT_FORMAT_NO_ILVL, time, rank, dataNum, name, spec);
	elseif itemLevel then
		return format(PARSE_OUTPUT_FORMAT_NO_SPEC, time, rank, dataNum, name, itemLevel);
	else
		return format(PARSE_OUTPUT_FORMAT_NO_ILVL_SPEC, time, rank, dataNum, name);
	end
end


function report:SendData(channelId, whisperToName, dataTitle, filterString, parses, numParses)
	numParses = min(numParses, MAX_PARSES_TO_SEND);
	channelId = string.upper(channelId);

	local lines = {"--Guild Skada High Score--", dataTitle};

	if filterString then
		tinsert(lines, format("Filtered by [%s]", filterString));
	end

	for rank, parse in ipairs(parses) do
		local parseString = getParseStringFromParse(rank, parse);
		tinsert(lines, parseString);
		if(rank >= numParses) then
			break;
		end
	end

	if channelId == "SELF" then
		for _, line in ipairs(lines) do
			addon:Print(line);
		end
	elseif channelId == "WHISPER" then
		for _, line in ipairs(lines) do
			SendChatMessage(line, "WHISPER", nil, whisperToName);
		end
	else
		if channelId == "PARTY" and not IsInGroup() then
			return
		end
		if channelId == "RAID" and not IsInRaid() then
			return
		end
		if channelId == "GUILD" and not IsInGuild() then
			return
		end

		for _, line in ipairs(lines) do
			SendChatMessage(line, channelId);
		end
	end
end


function report:ShowReportFrame(guildId, zoneId, difficultyId, encounterId, roleId, parses, filters)
	if self.currentFrame then
		self.currentFrame:Release();
		self.currentFrame = nil;
	end

	local channelId = self.lastChannelId or "SELF";

	local guildName = addon.highscore:GetGuildNameById(guildId);
	local zoneName = addon.highscore:GetZoneNameById(zoneId);
	local difficultyName = addon.highscore:GetDifficultyNameById(difficultyId);
	local encounterName = addon.highscore:GetEncounterNameById(encounterId);

	local dataTypeName;
	if roleId == "DAMAGER" then
		dataTypeName = "DPS"
	elseif roleId == "HEALER" then
		dataTypeName = "HPS"
	elseif roleId == "TANK" then
		dataTypeName = "DPS (Tanks)"
	else
		return;
	end

	local filterString;
	for filterKey, filterValue in pairs(filters) do
		if filterString then
			filterString = filterString .. ", ";
		else
			filterString = "";
		end
		if filterKey == "name" then
			filterString = filterString .. "Name: " .. filterValue;
		elseif filterKey == "startTime" then
			filterString = filterString .. "Time: " .. date(FILTER_TIME_FORMAT, filterValue);
		else
			filterString = filterString .. filterKey .. ": " .. filterValue;
		end
	end

	local dataTitle = format("<%s> %s (%s) - %s", guildName, encounterName, difficultyName, dataTypeName);

	local frame = AceGUI:Create("Frame")
	frame:Hide();
	frame:EnableResize(false)
	frame:SetWidth(300);
	frame:SetHeight(300);
	frame:SetTitle("Report Data");
	frame:SetLayout("Flow");

	local dataTitleLabel = AceGUI:Create("Label");
	dataTitleLabel:SetText(dataTitle);
	dataTitleLabel:SetFullWidth(true);

	local filteredByLabel = AceGUI:Create("Label");
	filteredByLabel:SetText(format("Filtered by [%s]", filterString or ""));
	filteredByLabel:SetFullWidth(true);

	local channelDropdown = AceGUI:Create("Dropdown");
	channelDropdown:SetLabel("Channel");
	channelDropdown:SetList(SEND_TO_CHANNELS_LIST, SEND_TO_CHANNELS_LIST_ORDER);
	channelDropdown:SetValue(channelId);
	channelDropdown:SetFullWidth(true);
	channelDropdown:SetCallback("OnValueChanged", function(widget, evt, newChanId)
		channelId = newChanId;
		self.lastChannelId = channelId;
	end);

	local whisperToNameEditBox = AceGUI:Create("EditBox");
	whisperToNameEditBox:SetFullWidth(true);
	whisperToNameEditBox:SetLabel("Whisper to");

	local numToSendSlider = AceGUI:Create("Slider");
	numToSendSlider:SetLabel("Number of Parses");
	numToSendSlider:SetFullWidth(true);
	numToSendSlider:SetSliderValues(1, min(#parses, MAX_PARSES_TO_SEND), 1);
	numToSendSlider:SetValue(min(#parses, MAX_PARSES_TO_SEND));

	local sendButton = AceGUI:Create("Button");
	sendButton:SetText("Send");
	sendButton:SetFullWidth(true);
	sendButton:SetCallback("OnClick", function()
		local numParses = numToSendSlider:GetValue();
		local whisperToName = whisperToNameEditBox:GetText();
		self:SendData(channelId, whisperToName, dataTitle, filterString, parses, numParses);
		report.currentFrame = nil;
		frame:Release();
	end);

	frame:AddChild(dataTitleLabel);
	if filterString then
		frame:AddChild(filteredByLabel);
	end
	frame:AddChild(channelDropdown);
	frame:AddChild(whisperToNameEditBox);
	frame:AddChild(numToSendSlider);
	frame:AddChild(sendButton);

	self.currentFrame = frame;
	frame:Show();
end