local Warning = 0;
function SpellAlert_OnLoad()
	this:RegisterEvent("ADDON_LOADED");
	this:RegisterEvent("CHAT_MSG_SPELL_CREATURE_VS_CREATURE_DAMAGE");
	this:RegisterEvent("CHAT_MSG_SPELL_PERIODIC_CREATURE_BUFFS");
	this:RegisterEvent("CHAT_MSG_SPELL_CREATURE_VS_CREATURE_BUFF");
	this:RegisterEvent("CHAT_MSG_SPELL_HOSTILEPLAYER_DAMAGE");
	this:RegisterEvent("CHAT_MSG_SPELL_HOSTILEPLAYER_BUFF");
	this:RegisterEvent("CHAT_MSG_MONSTER_EMOTE");
	this:RegisterEvent("CHAT_MSG_SPELL_PERIODIC_SELF_DAMAGE");
	this:RegisterEvent("CHAT_MSG_SPELL_PERIODIC_HOSTILEPLAYER_BUFFS");
	this:RegisterEvent("UNIT_SPELLCAST_START");

	this:RegisterEvent("TAXIMAP_OPENED");
	this:RegisterEvent("GOSSIP_SHOW");
	this:RegisterEvent("UI_ERROR_MESSAGE");

	AlertFrame:SetTimeVisible(3);
	WarningFrame:SetTimeVisible(3);

	---- Slash Commands	
	SlashCmdList["SpellAlert"] = SpellAlert_SlashHandler;
	SLASH_SpellAlert1 = "/Gossip";
	SLASH_SpellAlert2 = "/가쉽";
end

function SpellAlert_LoadVariables()
	if ( SpellAlert_config == nil ) then
		SpellAlert_config = { 1, 1, 1 };
	end
end

function SpellAlert_SlashHandler (msg)
	if (msg == "잡담") then
		if (SpellAlert_config[1] == 1) then
			SpellAlert_config[1] = 0;
			DEFAULT_CHAT_FRAME:AddMessage("|cff20ff20잡담 숨김 기능을 사용 하지 않습니다.");
		else
			SpellAlert_config[1] = 1;
			DEFAULT_CHAT_FRAME:AddMessage("|cff20ff20잡담 숨김 기능이 활성화 되었습니다.");
		end
	elseif (msg == "낙마") then
		if (SpellAlert_config[2] == 1) then
			SpellAlert_config[2] = 0;
			DEFAULT_CHAT_FRAME:AddMessage("|cff20ff20자동 낙마 기능을 사용 하지 않습니다.");
		else
			SpellAlert_config[2] = 1;
			DEFAULT_CHAT_FRAME:AddMessage("|cff20ff20자동 낙마 기능이 활성화 되었습니다.");
		end
	elseif (msg == "변신") then
		if (SpellAlert_config[3] == 1) then
			SpellAlert_config[3] = 0;
			DEFAULT_CHAT_FRAME:AddMessage("|cff20ff20자동 변신 해제 기능을 사용 하지 않습니다.");
		else
			SpellAlert_config[3] = 1;
			DEFAULT_CHAT_FRAME:AddMessage("|cff20ff20자동 변신 해제 기능이 활성화 되었습니다.");
		end
	else
		DEFAULT_CHAT_FRAME:AddMessage("|cff20ff20SpellAlert: /Gossip or /가쉽");
		DEFAULT_CHAT_FRAME:AddMessage("|cff20ff20/가쉽 잡담 |cff3366ff: 잡담 숨김 기능을 토글합니다.");
		DEFAULT_CHAT_FRAME:AddMessage("|cff20ff20/가쉽 낙마 |cff3366ff: 자동 낙마 기능을 토글합니다.");
		DEFAULT_CHAT_FRAME:AddMessage("|cff20ff20/가쉽 변신 |cff3366ff: 자동 변신 기능을 토글합니다.");
	end
end

function SpellAlert_OnEvent()
	if(event == "ADDON_LOADED") then
		if(arg1 == "SpellAlert") then
			SpellAlert_LoadVariables();
			this:UnregisterEvent("ADDON_LOADED");
		end
	end
	local mob, spell;
	if (event == "CHAT_MSG_SPELL_HOSTILEPLAYER_DAMAGE") then
		for mob, spell in string.gmatch(arg1, SA_PTN_SPELL_BEGIN_CAST) do
			if (SpellAlert_isParty(mob) or SpellAlert_isRaid(mob)) then
				return;
			end
			spell = SpellAlert_color(spell);
			SpellAlert_alert(mob, spell, "|cffff0000"..mob.."|r".."|1이;가; "..spell.."|1을;를; 시전합니다.");
			return;
		end
		for mob, spell in string.gmatch(arg1, SA_PTN_SPELL_BEGIN_NEW1CAST) do
			if (SpellAlert_isParty(mob) or SpellAlert_isRaid(mob)) then
				return;
			end
			spell = SpellAlert_color(spell);
			SpellAlert_alert(mob, spell, "|cffff0000"..mob.."|r".."|1이;가; "..spell.." 시전을 시작합니다.");
			return;
		end
		for mob, target, spell in string.gmatch(arg1, SA_PTN_SPELL_BEGIN_NEW2CAST) do
			if (SpellAlert_isParty(mob) or SpellAlert_isRaid(mob)) then
				return;
			end
			spell = SpellAlert_color(spell);
			SpellAlert_alert(mob, spell, "|cffff0000"..mob.."|r".."|1이;가; |cffff0000"..target.."|r".."에게 "..spell.."|1을;를; 시전합니다.");
			return;
		end
		for mob, spell in string.gmatch(arg1, SA_PTN_SPELL_BEGIN_PERFORM) do
			if (SpellAlert_isParty(mob) or SpellAlert_isRaid(mob)) then
				return;
			end
			spell = SpellAlert_color(spell);
			SpellAlert_alert(mob, spell, mob.."|1이;가; "..spell.."|1을;를; 사용합니다.");
			return;
		end
	elseif (event == "CHAT_MSG_SPELL_HOSTILEPLAYER_BUFF") then
		for mob, spell, k in string.gmatch(arg1, SA_PTN_SPELL_GAINS_X) do
			return;
		end
		for mob, spell in string.gmatch(arg1, SA_PTN_SPELL_BEGIN_CAST) do
			if (SpellAlert_isParty(mob) or SpellAlert_isRaid(mob)) then
				return;
			end
			spell = SpellAlert_color(spell);
			SpellAlert_alert(mob, spell, "|cffff0000"..mob.."|r".."|1이;가; "..spell.."|1을;를; 시전합니다.");
			return;
		end
		for mob, spell in string.gmatch(arg1, SA_PTN_SPELL_BEGIN_NEW1CAST) do
			if (SpellAlert_isParty(mob) or SpellAlert_isRaid(mob)) then
				return;
			end
			spell = SpellAlert_color(spell);
			SpellAlert_alert(mob, spell, "|cffff0000"..mob.."|r".."|1이;가; "..spell.." 시전을 시작합니다.");
			return;
		end
		for mob, target, spell in string.gmatch(arg1, SA_PTN_SPELL_BEGIN_NEW2CAST) do
			if (SpellAlert_isParty(mob) or SpellAlert_isRaid(mob)) then
				return;
			end
			spell = SpellAlert_color(spell);
			SpellAlert_alert(mob, spell, "|cffff0000"..mob.."|r".."|1이;가; |cffff0000"..target.."|r".."에게 "..spell.."|1을;를; 시전합니다.");
			return;
		end
		for mob, spell in string.gmatch(arg1, SA_PTN_SPELL_TOTEM) do
			if (SpellAlert_isParty(mob) or SpellAlert_isRaid(mob)) then
				return;
			end
			spell = SpellAlert_color(spell);
			SpellAlert_alert(mob, spell, "|cffff0000"..mob.."|r".."|1이;가; "..spell.." 토템을 시전합니다.");
			return;
		end
		for mob, spell in string.gmatch(arg1, SA_PTN_SPELL_GAINS) do
			if (SpellAlert_isParty(mob) or SpellAlert_isRaid(mob)) then
				return;
			end
			spell = SpellAlert_color(spell);
			SpellAlert_alert(mob, spell, "|cffff0000"..mob.."|r".."|1이;가; "..spell.." 효과를 얻었습니다.");
			return;
		end
	elseif (event == "CHAT_MSG_SPELL_CREATURE_VS_CREATURE_BUFF") then
		for mob, spell in string.gmatch(arg1, SA_PTN_SPELL_BEGIN_CAST) do
			if (SpellAlert_isParty(mob) or SpellAlert_isRaid(mob)) then
				return;
			end
			spell = SpellAlert_color(spell);
			SpellAlert_alert(mob, spell, mob.."|1이;가; "..spell.."|1을;를; 시전합니다.");
			return;
		end
	elseif (event == "CHAT_MSG_SPELL_PERIODIC_CREATURE_BUFFS") then
		for mob, spell, k in string.gmatch(arg1, SA_PTN_SPELL_GAINS_X) do
			return;
		end
		for mob, spell in string.gmatch(arg1, SA_PTN_SPELL_GAINS) do
			if (SpellAlert_isParty(mob) or SpellAlert_isRaid(mob)) then
				return;
			end
			spell = SpellAlert_color(spell);
			SpellAlert_alert(mob, spell, mob.."|1이;가; "..spell.." 효과를 얻었습니다.");
			return;
		end
	elseif (event == "CHAT_MSG_SPELL_CREATURE_VS_CREATURE_DAMAGE") then
		for mob, spell in string.gmatch(arg1, SA_PTN_SPELL_BEGIN_CAST) do
			if (SpellAlert_isParty(mob) or SpellAlert_isRaid(mob)) then
				return;
			end
			spell = SpellAlert_color(spell);
			SpellAlert_alert(mob, spell, mob.."|1이;가; "..spell.."|1을;를; 시전합니다.");
			return;
		end
		for mob, spell in string.gmatch(arg1, SA_PTN_SPELL_BEGIN_NEW1CAST) do
			if (SpellAlert_isParty(mob) or SpellAlert_isRaid(mob)) then
				return;
			end
			spell = SpellAlert_color(spell);
			SpellAlert_alert(mob, spell, mob.."|1이;가; "..spell.." 시전을 시작합니다.");
			return;
		end
		for mob, target, spell in string.gmatch(arg1, SA_PTN_SPELL_BEGIN_NEW2CAST) do
			if (SpellAlert_isParty(mob) or SpellAlert_isRaid(mob)) then
				return;
			end
			spell = SpellAlert_color(spell);
			SpellAlert_alert(mob, spell, "|cffff0000"..mob.."|r".."|1이;가; |cffff0000"..target.."|r".."에게 "..spell.."|1을;를; 시전합니다.");
			return;
		end
		for mob, spell in string.gmatch(arg1, SA_PTN_SPELL_BEGIN_PERFORM) do
			if (SpellAlert_isParty(mob) or SpellAlert_isRaid(mob)) then
				return;
			end
			spell = SpellAlert_color(spell);
			SpellAlert_alert(mob, spell, mob.."|1이;가; "..spell.."|1을;를; 시전합니다.");
			return;
		end
	elseif (event == "CHAT_MSG_SPELL_PERIODIC_HOSTILEPLAYER_BUFFS") then
		for mob, spell, temp in string.gmatch(arg1, SA_PTN_SPELL_GAINS_X) do
			return;
		end
		for mob, spell in string.gmatch(arg1, SA_PTN_SPELL_GAINS) do
			if (SpellAlert_isParty(mob) or SpellAlert_isRaid(mob)) then
				return;
			end
			spell = SpellAlert_color(spell);
			SpellAlert_alert(mob, spell, "|cffff0000"..mob.."|r".."|1이;가; "..spell.." 효과를 얻었습니다.");
			if ( (spell == SA_NF) or (spell == SA_POM) ) then
		           Sa_PlaySound();
		        end
			return;
		end
	elseif (event == "CHAT_MSG_EMOTE") then
		if (arg1) then
			if (sa_emote_on == 1) then
				SpellAlert_alert("", "", arg1);
			end
		end
	elseif (event == "CHAT_MSG_MONSTER_EMOTE") then
		local name = arg2;
		if (not name) then
			name = "nil";
		end
		if (arg1) then
			if (string.find(arg1,"숨을 깊게 들이쉽니다.")) then
				WarningFrame:AddMessage("오닉시아 딥 브레스 5초 전 : 벽으로!!!", 1, 1, 1, 0.8);
				MikSBT.DisplayMessage("오닉시아 딥 브레스 5초 전 : 벽으로!!!", MikSBT.DISPLAYTYPE_NOTIFICATION, true, 255, 255, 0, 20);
				SendChatMessage("오닉시아 딥 브레스 5초 전 : 벽으로!!!","YELL");
				PlaySoundFile("Sound\\Character\\Orc\\OrcVocalMale\\OrcMaleOpenFire01.wav");
			else
				SpellAlert_alert(name, arg1, format(arg1, arg2));
			end
		end
	end

	if event=="UI_ERROR_MESSAGE" then
		--탈것에서 내려야 합니다.
		--이미 타고 있는 상태입니다. 먼저 내려야 합니다.
		--탈것에서 내려야 공격할 수 있습니다.
		if  ((arg1==SPELL_FAILED_NOT_MOUNTED or arg1==ERR_TAXIPLAYERALREADYMOUNTED or arg1==ERR_ATTACK_MOUNTED) and SpellAlert_config[2] == 1 and not IsFlying() ) then
			Dismount();
		end
		if ((string.find(arg1, "지금은 변신 중입니다.") or string.find(arg1,"변신 중일 때는 아이템을 사용할 수 없습니다.")) and SpellAlert_config[3] == 1) then
			if UnitClass("player") == "주술사" then
				CancelPlayerBuff("늑대 정령");
			end
		end
	end
	
	if (event == "TAXIMAP_OPENED" and SpellAlert_config[2] == 1) then 
		Dismount();
	end

	if (event == "GOSSIP_SHOW" and SpellAlert_config[1] == 1 and not IsControlKeyDown() and not IsAltKeyDown() and not IsShiftKeyDown()) then
		SkipGossip();
	end
end

function SkipGossip()
	local itc = 1;
	local list = {GetGossipOptions()} ;
	for i = 1, getn(list) do
		if( SKIPTHISGOSSIP[ list[i] ] ) then
			SelectGossipOption(itc) ;
			return ;
		end
		if ( i - math.floor(i/2)*2 == 0 ) then
			itc = itc + 1 ;
		end
	end
end

function SpellAlert_color(spell)
	local spellcolor
	if (SA_SPELLS_HEALS[spell] == 1) then
		spellcolor = "|cff00ff00"..spell.."|r";
		Warning = 0;
	elseif (SA_SPELLS_CC[spell] == 1) then
		spellcolor = "|cffff00ff"..spell.."|r";
		Warning = 1;
	else
		spellcolor = "|cffff0000"..spell.."|r";
		Warning = 0;
	end
	return spellcolor;
end

function SpellAlert_alert(mob, spell, msg)
	local targetname = UnitName("target");
	if (mob == targetname or Warning == 1) then
		WarningFrame:AddMessage(msg, 1, 1, 1, 0.8);
	else
		AlertFrame:AddMessage(msg, 1, 1, 1, 0.8);
	end
end

function SpellAlert_isParty(name)
	for i = 1, 4, 1 do
		local partyname = UnitName("party" .. i);
		if (name == partyname) then
			return 1;
		end
	end
	return nil;
end

function SpellAlert_isRaid(name)
	for i = 1, 40, 1 do
		local raidname = UnitName("raid" .. i);
		if (name == raidname) then
			return 1;
		end
	end
	return nil;
end