--[[
	CT_RaidAssist Spy

	This addon is designed to watch
	for 4 types of check made by raid
	leaders which could be considered
	an invasion of privicy. 
	These are:
		Resists
		Reagents
		Durability
		Items
]]--

local CTRASPY_VERSION = 1.4;

-- onLoad
function ctraSpy_onLoad()
	-- Register hooks
	this:RegisterEvent("VARIABLES_LOADED");
	
	-- Add slash command
	SLASH_CTRASPY1 = "/ctras";
	SlashCmdList["CTRASPY"] = ctraSpy_slash;
end

-- onEvent
function ctraSpy_onEvent(event)
	if (event == "VARIABLES_LOADED") then
		-- Make sure the options are updated
		if (ctraSpyOptions == nil or ctraSpyOptions.version ~= CTRASPY_VERSION) then
			ctraSpy_updateOptions();
		end
		ctraSpy_toggleOnOff();		
		DEFAULT_CHAT_FRAME:AddMessage('CTRA Spy v.'..CTRASPY_VERSION..' Loaded!');		
	elseif (event == "CHAT_MSG_ADDON") then
		-- Make sure the message is for us
		if ( arg1 == "CTRA" and arg3 == "RAID" ) then

			-- Check the caller's permissions
			if ctraSpy_isPriv(arg4) == nil then
				return -- message not from a member of our group
			end
			
			-- Strip the message
			local msg = string.gsub(arg2, "%$", "s");
			msg = string.gsub(msg, "", "S");
			if (strsub(msg, strlen(msg)-7) == " ...hic!") then
				msg = strsub(msg, 1, strlen(msg)-8);
			end
			
			-- Split the message if neccesary and send it for parsing
			local message;
			if (string.find(msg, "#")) then
				local arr = ctraSpy_split(msg, "#");
				for k, v in arr do
					ctraSpy_messageIn(arg4, v)
				end
			else
				ctraSpy_messageIn(arg4, msg)
			end
		end
	end	
end

-- Update the options from a version change or new install
function ctraSpy_updateOptions()
	
	-- We will do something fun here to upgrade when we have more version numbers
	-- Note, v1.1 added sound and version to the options.
	-- Note, v1.2 added chat frame output as well as ErrorFrame and switches for enable/disable checks
	-- Note, v1.3 added no new variables
	-- Note, v1.4 added no new variables
	
	-- This will deal with new installs
	if (not ctraSpyOptions or ctraSpyOptions.version == nil ) then
		-- Default options
		ctraSpyOptions = {
			enabled = true;
			sound = true;
			chat = true;
			resistance = true;
			reagents = true;
			durability = true;
			items = true;
			version = CTRASPY_VERSION;
		}
	end
	
	-- Upgrade to 1.1
	if (ctraSpyOptions.version < 1.1) then
		ctraSpyOptions.sound = true;
		ctraSpyOptions.version = 1.1;
	end
	
	-- Upgrade to 1.2
	if (ctraSpyOptions.version < 1.2) then
		ctraSpyOptions.chat = true;
		ctraSpyOptions.resistance = true;
		ctraSpyOptions.reagents = true;
		ctraSpyOptions.durability = true;
		ctraSpyOptions.items = true;
		ctraSpyOptions.version = 1.2;
	end

	ctraSpyOptions.version = CTRASPY_VERSION;
	
	DEFAULT_CHAT_FRAME:AddMessage('CTRA Spy variables updated to v.'..CTRASPY_VERSION);
end

-- Check if the <name> is authorised to do a check
function ctraSpy_isPriv(name)
	if (GetNumRaidMembers() > 0 and name ~= playerName) then
		for x = 1, 40 do
			if (UnitName("raid" .. x) == name) then
				return true
			end
		end
	end
end

-- Parse an incoming message
function ctraSpy_messageIn(nick, msg)		
	if (msg == "RSTC" and ctraSpyOptions.resistance) then -- Resists
		ctraSpy_out(nick, 'is doing a Resistance Check');
	elseif (msg == "REAC" and ctraSpyOptions.reagents) then -- Reagents
		ctraSpy_out(nick, 'is doing a Reagents Check');
	elseif (msg == "DURC" and ctraSpyOptions.durability) then --Durabillity
		ctraSpy_out(nick, 'is doing a Durability Check');
	elseif (string.find(msg, "^ITMC ") and ctraSpyOptions.items) then -- Items
		local _, _, itemName = string.find(msg, "^ITMC (.+)$");
		if (itemName) then
			ctraSpy_out(nick, 'is doing an Item Check for '..itemName);
		end
	end
end

-- Default output message formatter
function ctraSpy_out(nick, text)
	if (ctraSpyOptions.sound) then
		PlaySoundFile("Sound\\Spells\\PVPFlagTaken.wav");
	end
	if (ctraSpyOptions.chat) then
		DEFAULT_CHAT_FRAME:AddMessage('<CTRASpy> '..nick..' '..text);
	end
	UIErrorsFrame:AddMessage(nick..' '..text, 1.0, 0.12, 0.12, 1.0, UIERRORS_HOLD_TIME);
end

-- Register/Unregister the message event
function ctraSpy_toggleOnOff()
	if (ctraSpyOptions.enabled) then
		this:RegisterEvent("CHAT_MSG_ADDON");
	else
		this:UnregisterEvent("CHAT_MSG_ADDON");
	end
end

-- Handle the slash command to enable/disable
function ctraSpy_slash(msg)
	local frame = getglobal('CTRA_SpyOptionsFrame');
	if (frame) then
	      frame:Show();
	end
end

-- Split messages
function ctraSpy_split(msg, char)
	local arr = { };
	while (string.find(msg, char) ) do
		local iStart, iEnd = string.find(msg, char);
		tinsert(arr, strsub(msg, 1, iStart-1));
		msg = strsub(msg, iEnd+1, strlen(msg));
	end
	if ( strlen(msg) > 0 ) then
		tinsert(arr, msg);
	end
	return arr;
end

-- Initialize each of the checkboxes on the options form
function ctraSpyOptions_initialize()
	ctraSpyOptions_onClick(1, ctraSpyOptions.enabled);
	ctraSpyOptions_onClick(2, ctraSpyOptions.sound);
	ctraSpyOptions_onClick(3, ctraSpyOptions.chat);
	ctraSpyOptions_onClick(4, ctraSpyOptions.resistance);
	ctraSpyOptions_onClick(5, ctraSpyOptions.reagents);
	ctraSpyOptions_onClick(6, ctraSpyOptions.durability);
	ctraSpyOptions_onClick(7, ctraSpyOptions.items);
	
end

-- Handle clicks on the options form checkboxes
function ctraSpyOptions_onClick(id, checked)
	if (id == 1) then
		ctraSpyOptions.enabled = checked;
		getglobal("CTRA_SpyOptionsFrameEnableCB"):SetChecked(checked);
	elseif (id == 2) then
		ctraSpyOptions.sound = checked;
		getglobal("CTRA_SpyOptionsFramePlaySoundsCB"):SetChecked(checked); 
	elseif (id == 3) then
		ctraSpyOptions.chat = checked;
		getglobal("CTRA_SpyOptionsFrameShowChatCB"):SetChecked(checked);
	elseif (id == 4) then
		ctraSpyOptions.resistance = checked;
		getglobal("CTRA_SpyOptionsFrameResistancesCB"):SetChecked(checked);
	elseif (id == 5) then
		ctraSpyOptions.reagents = checked;
		getglobal("CTRA_SpyOptionsFrameReagentsCB"):SetChecked(checked);
	elseif (id == 6) then
		ctraSpyOptions.durability = checked;
		getglobal("CTRA_SpyOptionsFrameDurabilityCB"):SetChecked(checked);
	elseif (id == 7) then
		ctraSpyOptions.items = checked;
		getglobal("CTRA_SpyOptionsFrameItemsCB"):SetChecked(checked);
	end
end