--[[
	Collection of previous april fools pranks

	Harlem Shake:		Try it out with the command /harlemshake
	Hello Kitty:		Try it out with the command /hellokitty (pay attention to the popups, read what it says)
]]

local E, L, V, P, G = unpack(select(2, ...)); --Import: Engine, Locales, PrivateDB, ProfileDB, GlobalDB
local UF = E:GetModule("UnitFrames")
local AB = E:GetModule("ActionBars")

--Lua functions
local _G = _G
local pairs = pairs
local twipe, tinsert = wipe, tinsert
--WoW API / Variables
local CreateFrame = CreateFrame
local DoEmote = DoEmote
local GetCVar, SetCVar = GetCVar, SetCVar
local PlayMusic, StopMusic = PlayMusic, StopMusic
local SendChatMessage = SendChatMessage
local NUM_PET_ACTION_SLOTS = NUM_PET_ACTION_SLOTS

--Harlem Shake (Activate with command: /harlemshake)
--People really seemed to like this one. We got a lot of positive responses.
do
	function E:StopHarlemShake()
		E.isMassiveShaking = nil
		StopMusic()
		SetCVar("Sound_EnableAllSound", self.oldEnableAllSound)
		SetCVar("Sound_EnableMusic", self.oldEnableMusic)

		self:StopShakeHorizontal(ElvUI_StaticPopup1)
		for _, object in pairs(self.massiveShakeObjects) do
			if object then
				self:StopShake(object)
			end
		end

		if E.massiveShakeTimer then
			E:CancelTimer(E.massiveShakeTimer)
		end

		E.global.aprilFools = true
		E:StaticPopup_Hide("HARLEM_SHAKE")
		twipe(self.massiveShakeObjects)
		DoEmote("Dance")
	end

	function E:DoTheHarlemShake()
		E.isMassiveShaking = true
		ElvUI_StaticPopup1Button1:Enable()

		for _, object in pairs(self.massiveShakeObjects) do
			if object and object:IsShown() then
				self:Shake(object)
			end
		end

		E.massiveShakeTimer = E:ScheduleTimer("StopHarlemShake", 42.5)
		SendChatMessage("DO THE HARLEM SHAKE!", "YELL")
	end

	function E:BeginHarlemShake()
		DoEmote("Dance")
		ElvUI_StaticPopup1Button1:Disable()
		self:ShakeHorizontal(ElvUI_StaticPopup1)
		self.oldEnableAllSound = GetCVar("Sound_EnableAllSound")
		self.oldEnableMusic = GetCVar("Sound_EnableMusic")

		SetCVar("Sound_EnableAllSound", 1)
		SetCVar("Sound_EnableMusic", 1)
		PlayMusic(E.Media.Sounds.HarlemShake)
		E:ScheduleTimer("DoTheHarlemShake", 15.5)

		self.massiveShakeObjects = {}
		tinsert(self.massiveShakeObjects, GameTooltip)
		tinsert(self.massiveShakeObjects, Minimap)
		tinsert(self.massiveShakeObjects, WatchFrame)
		tinsert(self.massiveShakeObjects, LeftChatPanel)
		tinsert(self.massiveShakeObjects, RightChatPanel)
		tinsert(self.massiveShakeObjects, LeftChatToggleButton)
		tinsert(self.massiveShakeObjects, RightChatToggleButton)

		if ElvUI_ReputationBar then
			tinsert(self.massiveShakeObjects, ElvUI_ReputationBar)
		end
		if ElvUI_ExperienceBar then
			tinsert(self.massiveShakeObjects, ElvUI_ExperienceBar)
		end

		for unit in pairs(UF.units) do
			tinsert(self.massiveShakeObjects, UF[unit])
		end

		for _, header in pairs(UF.headers) do
			tinsert(self.massiveShakeObjects, header)
		end

		for _, bar in pairs(AB.handledBars) do
			for i = 1, #bar.buttons do
				tinsert(self.massiveShakeObjects, bar.buttons[i])
			end
		end

		if ElvUI_StanceBar then
			for i = 1, #ElvUI_StanceBar.buttons do
				tinsert(self.massiveShakeObjects, ElvUI_StanceBar.buttons[i])
			end
		end

		for i = 1, NUM_PET_ACTION_SLOTS do
			local button = _G["PetActionButton"..i]
			if button then
				tinsert(self.massiveShakeObjects, button)
			end
		end
	end

	function E:HarlemShakeToggle()
		self:StaticPopup_Show("HARLEM_SHAKE")
	end
end

--Hello Kitty (Activate with command: /hellokitty)
--This is one of those pranks where you either love it or hate it I think
--Unfortunately there was a bug which caused some of the hello kitty changes to stick,
-- when they should have reverted to the original settings. This bug was fixed later on.
do
	local function OnDragStart(self)
		self:StartMoving()
	end

	local function OnDragStop(self)
		self:StopMovingOrSizing()
	end

	local function OnUpdate(self, elapsed)
		if self.elapsed and self.elapsed > 0.1 then
			self.tex:SetTexCoord((self.curFrame - 1) * 0.1, 0, (self.curFrame - 1) * 0.1, 1, self.curFrame * 0.1, 0, self.curFrame * 0.1, 1)

			if self.countUp then
				self.curFrame = self.curFrame + 1
			else
				self.curFrame = self.curFrame - 1
			end

			if self.curFrame > 10 then
				self.countUp = false
				self.curFrame = 9
			elseif self.curFrame < 1 then
				self.countUp = true
				self.curFrame = 2
			end
			self.elapsed = 0
		else
			self.elapsed = (self.elapsed or 0) + elapsed
		end
	end

	function E:SetupHelloKitty()
		if not self.db.tempSettings then
			self.db.tempSettings = {}
		end

		--Store old settings
		local t = self.db.tempSettings
		local c = self.db.general.backdropcolor
		if self:HelloKittyFixCheck() then
			E:HelloKittyFix()
		else
			self.oldEnableAllSound = GetCVar("Sound_EnableAllSound")
			self.oldEnableMusic = GetCVar("Sound_EnableMusic")

			t.backdropcolor = {r = c.r, g = c.g, b = c.b}
			c = self.db.general.backdropfadecolor
			t.backdropfadecolor = {r = c.r, g = c.g, b = c.b, a = c.a}
			c = self.db.general.bordercolor
			t.bordercolor = {r = c.r, g = c.g, b = c.b}
			c = self.db.general.valuecolor
			t.valuecolor = {r = c.r, g = c.g, b = c.b}

			t.panelBackdropNameLeft = self.db.chat.panelBackdropNameLeft
			t.panelBackdropNameRight = self.db.chat.panelBackdropNameRight

			c = self.db.unitframe.colors.health
			t.health = {r = c.r, g = c.g, b = c.b}
			t.healthclass = self.db.unitframe.colors.healthclass

			c = self.db.unitframe.colors.castColor
			t.castColor = {r = c.r, g = c.g, b = c.b}
			t.transparentCastbar = self.db.unitframe.colors.transparentCastbar

			c = self.db.unitframe.colors.auraBarBuff
			t.auraBarBuff = {r = c.r, g = c.g, b = c.b}
			t.transparentAurabars = self.db.unitframe.colors.transparentAurabars

			--Apply new settings
			self.db.general.backdropfadecolor = {r = 131/255, g = 36/255, b = 130/255, a = 0.36}
			self.db.general.backdropcolor = {r = 223/255, g = 76/255, b = 188/255}
			self.db.general.bordercolor = {r = 223/255, g = 217/255, b = 47/255}
			self.db.general.valuecolor = {r = 223/255, g = 217/255, b = 47/255}

			self.db.chat.panelBackdropNameLeft = E.Media.Textures.HelloKittyChat
			self.db.chat.panelBackdropNameRight = E.Media.Textures.HelloKittyChat

			self.db.unitframe.colors.castColor = {r = 223/255, g = 76/255, b = 188/255}
			self.db.unitframe.colors.transparentCastbar = true

			self.db.unitframe.colors.auraBarBuff = {r = 223/255, g = 76/255, b = 188/255}
			self.db.unitframe.colors.transparentAurabars = true

			self.db.unitframe.colors.health = {r = 223/255, g = 76/255, b = 188/255}
			self.db.unitframe.colors.healthclass = false

			SetCVar("Sound_EnableAllSound", 1)
			SetCVar("Sound_EnableMusic", 1)
			PlayMusic(E.Media.Sounds.HelloKitty)
			E:StaticPopup_Show("HELLO_KITTY_END")

			self.db.general.kittys = true
			self:CreateKittys()

			self:UpdateAll()
		end
	end

	function E:RestoreHelloKitty()
		--Store old settings
		self.db.general.kittys = false
		if HelloKittyLeft then
			HelloKittyLeft:Hide()
			HelloKittyRight:Hide()
		end

		if not self.db.tempSettings then return end
		if self:HelloKittyFixCheck() then
			self:HelloKittyFix()
			self.db.tempSettings = nil
			return
		end
		local c = self.db.tempSettings.backdropcolor
		self.db.general.backdropcolor = {r = c.r, g = c.g, b = c.b}

		c = self.db.tempSettings.backdropfadecolor
		self.db.general.backdropfadecolor = {r = c.r, g = c.g, b = c.b, a = (c.a or 0.8)}

		c = self.db.tempSettings.bordercolor
		self.db.general.bordercolor = {r = c.r, g = c.g, b = c.b}

		c = self.db.tempSettings.valuecolor
		self.db.general.valuecolor = {r = c.r, g = c.g, b = c.b}

		self.db.chat.panelBackdropNameLeft = self.db.tempSettings.panelBackdropNameLeft
		self.db.chat.panelBackdropNameRight = self.db.tempSettings.panelBackdropNameRight

		c = self.db.tempSettings.health
		self.db.unitframe.colors.health = {r = c.r, g = c.g, b = c.b}
		self.db.unitframe.colors.healthclass = self.db.tempSettings.healthclass

		c = self.db.tempSettings.castColor
		self.db.unitframe.colors.castColor = {r = c.r, g = c.g, b = c.b}
		self.db.unitframe.colors.transparentCastbar = self.db.tempSettings.transparentCastbar

		c = self.db.tempSettings.auraBarBuff
		self.db.unitframe.colors.auraBarBuff = {r = c.r, g = c.g, b = c.b}
		self.db.unitframe.colors.transparentAurabars = self.db.tempSettings.transparentAurabars

		self.db.tempSettings = nil

		self:UpdateAll()
	end

	function E:CreateKittys()
		if HelloKittyLeft then
			HelloKittyLeft:Show()
			HelloKittyRight:Show()
			return
		end
		local helloKittyLeft = CreateFrame("Frame", "HelloKittyLeft", UIParent)
		helloKittyLeft:SetSize(120, 128)
		helloKittyLeft:SetMovable(true)
		helloKittyLeft:EnableMouse(true)
		helloKittyLeft:RegisterForDrag("LeftButton")
		helloKittyLeft:Point("BOTTOMLEFT", LeftChatPanel, "BOTTOMRIGHT", 2, -4)
		helloKittyLeft.tex = helloKittyLeft:CreateTexture(nil, "OVERLAY")
		helloKittyLeft.tex:SetAllPoints()
		helloKittyLeft.tex:SetTexture(E.Media.Textures.HelloKitty)
		helloKittyLeft.tex:SetTexCoord(0, 0, 0, 1, 0, 0, 0, 1)
		helloKittyLeft.curFrame = 1
		helloKittyLeft.countUp = true
		helloKittyLeft:SetClampedToScreen(true)
		helloKittyLeft:SetScript("OnDragStart", OnDragStart)
		helloKittyLeft:SetScript("OnDragStop", OnDragStop)
		helloKittyLeft:SetScript("OnUpdate", OnUpdate)

		local helloKittyRight = CreateFrame("Frame", "HelloKittyRight", UIParent)
		helloKittyRight:SetSize(120, 128)
		helloKittyRight:SetMovable(true)
		helloKittyRight:EnableMouse(true)
		helloKittyRight:RegisterForDrag("LeftButton")
		helloKittyRight:Point("BOTTOMRIGHT", RightChatPanel, "BOTTOMLEFT", -2, -4)
		helloKittyRight.tex = helloKittyRight:CreateTexture(nil, "OVERLAY")
		helloKittyRight.tex:SetAllPoints()
		helloKittyRight.tex:SetTexture(E.Media.Textures.HelloKitty)
		helloKittyRight.tex:SetTexCoord(0, 0, 0, 1, 0, 0, 0, 1)
		helloKittyRight.curFrame = 10
		helloKittyRight.countUp = false
		helloKittyRight:SetClampedToScreen(true)
		helloKittyRight:SetScript("OnDragStart", OnDragStart)
		helloKittyRight:SetScript("OnDragStop", OnDragStop)
		helloKittyRight:SetScript("OnUpdate", OnUpdate)
	end

	--When it bugged out for a user the command "/hellokittyfix" attempted to restore the changed settings to default
	function E:HelloKittyFixCheck(secondCheck)
		local t = self.db.tempSettings
		if not t and not secondCheck then t = self.db.general end
		if t and t.backdropcolor then
			return self:Round(t.backdropcolor.r, 2) == 0.87 and self:Round(t.backdropcolor.g, 2) == 0.3 and self:Round(t.backdropcolor.b, 2) == 0.74
		end
	end

	function E:HelloKittyFix()
		local c = P.general.backdropcolor
		self.db.general.backdropcolor = {r = c.r, g = c.g, b = c.b}

		c = P.general.backdropfadecolor
		self.db.general.backdropfadecolor = {r = c.r, g = c.g, b = c.b, a = (c.a or 0.8)}

		c = P.general.bordercolor
		self.db.general.bordercolor = {r = c.r, g = c.g, b = c.b}

		c = P.general.valuecolor
		self.db.general.valuecolor = {r = c.r, g = c.g, b = c.b}

		self.db.chat.panelBackdropNameLeft = ""
		self.db.chat.panelBackdropNameRight = ""

		c = P.unitframe.colors.health
		self.db.unitframe.colors.health = {r = c.r, g = c.g, b = c.b}

		c = P.unitframe.colors.castColor
		self.db.unitframe.colors.castColor = {r = c.r, g = c.g, b = c.b}
		self.db.unitframe.colors.transparentCastbar = false

		c = P.unitframe.colors.castColor
		self.db.unitframe.colors.auraBarBuff = {r = c.r, g = c.g, b = c.b}
		self.db.unitframe.colors.transparentAurabars = false

		if HelloKittyLeft then
			HelloKittyLeft:Hide()
			HelloKittyRight:Hide()
			self.db.general.kittys = nil
			return
		end

		self.db.tempSettings = nil
		self:UpdateAll()
	end

	function E:HelloKittyToggle()
		if HelloKittyLeft and HelloKittyLeft:IsShown() then
			self:RestoreHelloKitty()
		else
			self:StaticPopup_Show("HELLO_KITTY")
		end
	end
end