local E, L, V, P, G = unpack(ElvUI)
local S = E:GetModule('Skins')

local _G = _G

--Just some test code
--[[
local talkingHeadTextureKitRegionFormatStrings = {
	TextBackground = '%s-TextBackground',
	Portrait = '%s-PortraitFrame',
}
local talkingHeadDefaultAtlases = {
	TextBackground = 'TalkingHeads-TextBackground',
	Portrait = 'TalkingHeads-Alliance-PortraitFrame',
}
local talkingHeadFontColor = {
	['TalkingHeads-Horde'] = {Name = CreateColor(0.28, 0.02, 0.02), Text = CreateColor(0.0, 0.0, 0.0), Shadow = CreateColor(0.0, 0.0, 0.0, 0.0)},
	['TalkingHeads-Alliance'] = {Name = CreateColor(0.02, 0.17, 0.33), Text = CreateColor(0.0, 0.0, 0.0), Shadow = CreateColor(0.0, 0.0, 0.0, 0.0)},
	['TalkingHeads-Neutral'] = {Name = CreateColor(0.33, 0.16, 0.02), Text = CreateColor(0.0, 0.0, 0.0), Shadow = CreateColor(0.0, 0.0, 0.0, 0.0)},
	['Normal'] = {Name = CreateColor(1, 0.82, 0.02), Text = CreateColor(1, 1, 1), Shadow = CreateColor(0.0, 0.0, 0.0, 1.0)},
}

--test
function TestTalkingHead()
	local frame = TalkingHeadFrame
	local model = frame.MainFrame.Model

	if frame.finishTimer then
		frame.finishTimer:Cancel()
		frame.finishTimer = nil
	end
	if frame.voHandle then
		StopSound(frame.voHandle)
		frame.voHandle = nil
	end

	local currentDisplayInfo = model:GetDisplayInfo()
	local displayInfo, cameraID, vo, duration, lineNumber, numLines, name, text, isNewTalkingHead, textureKitID

	displayInfo = 76291
	cameraID = 1240
	vo = 103175
	duration = 20.220001220703
	lineNumber = 0
	numLines = 4
	name = 'Some Ugly Woman'
	text = 'Testing this sheet out Testing this sheet out Testing this sheet out Testing this sheet out Testing this sheet out Testing this sheet out Testing this sheet out '
	isNewTalkingHead = true
	textureKitID = 0

	local textFormatted = format(text)
	if displayInfo and displayInfo ~= 0 then
		local textureKit
		if textureKitID ~= 0 then
			SetupTextureKits(textureKitID, frame.BackgroundFrame, talkingHeadTextureKitRegionFormatStrings, false, true)
			SetupTextureKits(textureKitID, frame.PortraitFrame, talkingHeadTextureKitRegionFormatStrings, false, true)
			textureKit = GetUITextureKitInfo(textureKitID)
		else
			SetupAtlasesOnRegions(frame.BackgroundFrame, talkingHeadDefaultAtlases, true)
			SetupAtlasesOnRegions(frame.PortraitFrame, talkingHeadDefaultAtlases, true)
			textureKit = 'Normal'
		end
		local nameColor = talkingHeadFontColor[textureKit].Name
		local textColor = talkingHeadFontColor[textureKit].Text
		local shadowColor = talkingHeadFontColor[textureKit].Shadow
		frame.NameFrame.Name:SetTextColor(nameColor:GetRGB())
		frame.NameFrame.Name:SetShadowColor(shadowColor:GetRGBA())
		frame.TextFrame.Text:SetTextColor(textColor:GetRGB())
		frame.TextFrame.Text:SetShadowColor(shadowColor:GetRGBA())
		frame:Show()
		if currentDisplayInfo ~= displayInfo then
			model.uiCameraID = cameraID
			model:SetDisplayInfo(displayInfo)
		else
			if model.uiCameraID ~= cameraID then
				model.uiCameraID = cameraID
				Model_ApplyUICamera(model, model.uiCameraID)
			end
			TalkingHeadFrame_SetupAnimations(model)
		end

		if isNewTalkingHead then
			TalkingHeadFrame:Reset(textFormatted, name)
			TalkingHeadFrame:FadeinFrames()
		else
			if name ~= frame.NameFrame.Name:GetText() then
				-- Fade out the old name and fade in the new name
				frame.NameFrame.Fadeout:Play()
				E:Delay(0.25, frame.NameFrame.Name.SetText, frame.NameFrame.Name, name)
				E:Delay(0.5, frame.NameFrame.Fadein.Play, frame.NameFrame.Fadein)

				frame.MainFrame.TalkingHeadsInAnim:Play()
			end

			if textFormatted ~= frame.TextFrame.Text:GetText() then
				-- Fade out the old text and fade in the new text
				frame.TextFrame.Fadeout:Play()
				E:Delay(0.25, frame.TextFrame.Text.SetText, frame.TextFrame.Text, textFormatted)
				E:Delay(0.5, frame.TextFrame.Fadein.Play, frame.TextFrame.Fadein)
			end
		end

		local success, voHandle = PlaySound(vo, 'Talking Head', true, true)
		if success then
			frame.voHandle = voHandle
		end
	end
end]]

function S:TalkingHead()
	if not (E.private.skins.blizzard.enable and E.private.skins.blizzard.talkinghead) then return end

	local TalkingHeadFrame = _G.TalkingHeadFrame

	TalkingHeadFrame.BackgroundFrame.TextBackground:SetAtlas(nil)
	TalkingHeadFrame.PortraitFrame.Portrait:SetAtlas(nil)
	TalkingHeadFrame.MainFrame.Model.PortraitBg:SetAtlas(nil)
	TalkingHeadFrame.PortraitFrame:StripTextures()

	if E.db.general.talkingHeadFrameBackdrop then
		TalkingHeadFrame:StripTextures()
		TalkingHeadFrame:SetTemplate('Transparent')
		TalkingHeadFrame.MainFrame:StripTextures()

		local button = TalkingHeadFrame.MainFrame.CloseButton
		S:HandleCloseButton(button)
		button:ClearAllPoints()
		button:Point('TOPRIGHT', TalkingHeadFrame.BackgroundFrame, 'TOPRIGHT', 0, -2)
	else
		TalkingHeadFrame.MainFrame.Model:CreateBackdrop('Transparent')
		TalkingHeadFrame.MainFrame.Model.backdrop:ClearAllPoints()
		TalkingHeadFrame.MainFrame.Model.backdrop:Point('CENTER')
		TalkingHeadFrame.MainFrame.Model.backdrop:Size(120, 119)

		TalkingHeadFrame.MainFrame.CloseButton:Kill()
	end

	TalkingHeadFrame.BackgroundFrame.TextBackground.SetAtlas = E.noop
	TalkingHeadFrame.PortraitFrame.Portrait.SetAtlas = E.noop
	TalkingHeadFrame.MainFrame.Model.PortraitBg.SetAtlas = E.noop

	TalkingHeadFrame.NameFrame.Name:SetTextColor(1, 0.82, 0.02)
	TalkingHeadFrame.NameFrame.Name.SetTextColor = E.noop
	TalkingHeadFrame.NameFrame.Name:SetShadowColor(0, 0, 0, 1)
	TalkingHeadFrame.NameFrame.Name:SetShadowOffset(2, -2)

	TalkingHeadFrame.TextFrame.Text:SetTextColor(1, 1, 1)
	TalkingHeadFrame.TextFrame.Text.SetTextColor = E.noop
	TalkingHeadFrame.TextFrame.Text:SetShadowColor(0, 0, 0, 1)
	TalkingHeadFrame.TextFrame.Text:SetShadowOffset(2, -2)
end

S:AddCallback('TalkingHead')
