local L = LibStub("AceLocale-3.0"):GetLocale("IceHUD", false)
IceTargetHealth = IceCore_CreateClass(IceUnitBar)

local IceHUD = _G.IceHUD

local IsAddOnLoaded = IsAddOnLoaded
if not IsAddOnLoaded and C_AddOns then
	IsAddOnLoaded = C_AddOns.IsAddOnLoaded
end

IceTargetHealth.prototype.color = nil
IceTargetHealth.prototype.determineColor = true
IceTargetHealth.prototype.registerEvents = true
IceTargetHealth.prototype.texWidth = 128
IceTargetHealth.prototype.texHeight = 128
IceTargetHealth.prototype.classLeft = 0
IceTargetHealth.prototype.classRight = 0.9375
IceTargetHealth.prototype.classTop = 0
IceTargetHealth.prototype.classBottom = 0.78125
IceTargetHealth.prototype.raidIconWidth = 16
IceTargetHealth.prototype.raidIconHeight = 16
IceTargetHealth.prototype.EliteTexture = IceElement.TexturePath .. "Elite"
IceTargetHealth.prototype.RareEliteTexture = IceElement.TexturePath .. "RareElite"
IceTargetHealth.prototype.RareTexture = IceElement.TexturePath .. "Rare"
IceTargetHealth.prototype.DisplayClickTargetOption = true

IceTargetHealth.prototype.configMode = false

-- Constructor --
function IceTargetHealth.prototype:init(moduleName, unit)
	if not moduleName or not unit then
		IceTargetHealth.super.prototype.init(self, "TargetHealth", "target")
	else
		IceTargetHealth.super.prototype.init(self, moduleName, unit)
	end

	self:SetDefaultColor("TargetHealthHostile", 231, 31, 36)
	self:SetDefaultColor("TargetHealthFriendly", 46, 223, 37)
	self:SetDefaultColor("TargetHealthNeutral", 210, 219, 87)
end


function IceTargetHealth.prototype:GetDefaultSettings()
	local settings = IceTargetHealth.super.prototype.GetDefaultSettings(self)

	settings["side"] = IceCore.Side.Left
	settings["offset"] = 2
	settings["classColor"] = false
	settings["hideBlizz"] = false
	settings["upperText"] = "[PercentHP:Round]"
	settings["lowerText"] = "[[[HP:Short:HPColor] '/' [MaxHP:Short:HPColor]]:Bracket]"
	settings["raidIconOnTop"] = true
	settings["showRaidIcon"] = true
	settings["raidIconXOffset"] = 12
	settings["raidIconYOffset"] = 0
	settings["raidIconScale"] = 1
	settings["lockIconAlpha"] = false
	settings["abbreviateHealth"] = true
	settings["classIconOffset"] = {x=0, y=0}
	settings["showClassificationIcon"] = false
	settings["classIconOnTop"] = false
	settings["classIconScale"] = 1
	settings["showPvPIcon"] = true
	settings["PvPIconOffset"] = {x=23, y=11}
	settings["PvPIconScale"] = 1.0
	settings["PvPIconOnTop"] = false
	settings["allowMouseInteraction"] = false
	settings["npcHostilityColor"] = false
	settings["showPartyRoleIcon"] = false
	settings["PartyRoleIconOffset"] = {x=33, y=-8}
	settings["PartyRoleIconScale"] = 0.9
	settings["EliteTextureSet"] = 1

	return settings
end


-- OVERRIDE
function IceTargetHealth.prototype:GetOptions()
	local opts = IceTargetHealth.super.prototype.GetOptions(self)

	opts["classColor"] = {
		type = "toggle",
		name = L["Class color bar"],
		desc = L["Use class color as the bar color instead of reaction color\n\n(Note: The 'color bar by health %' setting overrides this)"],
		get = function()
			return self.moduleSettings.classColor
		end,
		set = function(info, value)
			self.moduleSettings.classColor = value
			self:Update(self.unit)
		end,
		disabled = function()
			return not self.moduleSettings.enabled or self.moduleSettings.scaleHealthColor
		end,
		order = 41
	}

	opts["npcHostilityColor"] = {
		type = "toggle",
		name = L["Color NPC by hostility"],
		desc = L["If you are using the 'class color bar' setting above, then enabling this will color NPC's by their hostility toward you since NPC class isn't very helpful or applicable information."],
		get = function()
			return self.moduleSettings.npcHostilityColor
		end,
		set = function(info, v)
			self.moduleSettings.npcHostilityColor = v
			self:Redraw()
		end,
		disabled = function()
			return not self.moduleSettings.enabled or not self.moduleSettings.classColor or self.moduleSettings.scaleHealthColor
		end,
		order = 41.5
	}

	opts["hideBlizz"] = {
		type = "toggle",
		name = L["Hide Blizzard Frame"],
		desc = L["Hides Blizzard Target frame and disables all events related to it"],
		get = function()
			return self.moduleSettings.hideBlizz
		end,
		set = function(info, value)
			self.moduleSettings.hideBlizz = value
			if (value) then
				self:HideBlizz()
			else
				self:ShowBlizz()
			end
		end,
		disabled = function()
			return not self.moduleSettings.enabled
		end,
		order = 42
	}

	opts["allowClickTarget"] = {
		type = 'toggle',
		name = L["Allow click-targeting"],
		desc = L["Whether or not to allow click targeting/casting and the target drop-down menu for this bar (Note: does not work properly with HiBar, have to click near the base of the bar)"],
		get = function()
			return self.moduleSettings.allowMouseInteraction
		end,
		set = function(info, v)
			self.moduleSettings.allowMouseInteraction = v
			self:CreateBackground(true)
		end,
		disabled = function()
			return not self.moduleSettings.enabled or not self.DisplayClickTargetOption
		end,
		order = 43
	}

	opts["scaleHealthColor"] = {
		type = "toggle",
		name = L["Color bar by health %"],
		desc = L["Colors the health bar from MaxHealthColor to MinHealthColor based on current health %\n\n(Note: This overrides the 'class color bar' setting. Disable this to use class coloring)"],
		get = function()
			return self.moduleSettings.scaleHealthColor
		end,
		set = function(info, value)
			self.moduleSettings.scaleHealthColor = value
			self:Redraw()
		end,
		disabled = function()
			return not self.moduleSettings.enabled
		end,
		order = 44
	}

if not IceHUD.IceCore:ShouldUseDogTags() then
	opts["shortenHealth"] = {
		type = 'toggle',
		name = L["Abbreviate estimated health"],
		desc = L["If this is checked, then a health value of 1100 will display as 1.1k, otherwise it shows the number"],
		get = function()
			return self.moduleSettings.abbreviateHealth
		end,
		set = function(info, v)
			self.moduleSettings.abbreviateHealth = v
		end,
		disabled = function()
			return not self.moduleSettings.enabled
		end,
		order = 40.1
	}
end

	opts["iconSettings"] =
	{
		type = 'group',
		name = "|c"..self.configColor..L["Icon Settings"].."|r",
		desc = L["Settings related to icons"],
		args = {
			iconConfigMode = {
				type = "toggle",
				name = L["Icon config mode"],
				desc = L["With this enabled, all icons draw so you can configure their placement\n\nNote: the combat and status icons are actually the same texture so you'll only see combat in config mode (unless you're already resting)"],
				get = function()
					return self.configMode
				end,
				set = function(info, v)
					self.configMode = v
					self:CheckPvP()
					self:UpdateRaidTargetIcon()
					self:CheckPartyRole()
					self:Redraw()
				end,
				disabled = function()
					return not self.moduleSettings.enabled
				end,
				order = 5
			},

			lockIconAlpha = {
				type = "toggle",
				name = L["Lock all icons to 100% alpha"],
				desc = L["With this enabled, all icons will be 100% visible regardless of the alpha settings for this bar."],
				get = function()
					return self.moduleSettings.lockIconAlpha
				end,
				set = function(info, v)
					self.moduleSettings.lockIconAlpha = v
					self:Redraw()
				end,
				disabled = function()
					return not self.moduleSettings.enabled
				end,
				order = 6
			},

			PvPHeader = {
				type = 'header',
				name = L["PvP icon"],
				order = 39.9
			},

			PvPIcon = {
				type = "toggle",
				name = L["Show PvP icon"],
				desc = L["Whether or not to show the PvP icon"],
				get = function()
					return self.moduleSettings.showPvPIcon
				end,
				set = function(info, value)
					self.moduleSettings.showPvPIcon = value
					self:CheckPvP()
				end,
				disabled = function()
					return not self.moduleSettings.enabled
				end,
				order = 40
			},
			PvPIconOnTop = {
				type = "toggle",
				name = L["Draw PVP Icon on top"],
				desc = L["Whether to draw the PvP icon in front of or behind this bar"],
				get = function()
					return self.moduleSettings.PvPIconOnTop
				end,
				set = function(info, value)
					self.moduleSettings.PvPIconOnTop = value
					self:CheckPvP()
				end,
				disabled = function()
					return not self.moduleSettings.enabled or not self.moduleSettings.showPvPIcon
				end,
				order = 40.1
			},
			PvPIconOffsetX = {
				type = "range",
				name = L["PvP Icon Horizontal Offset"],
				desc = L["How much to offset the PvP icon from the bar horizontally"],
				min = -300,
				max = 300,
				step = 1,
				get = function()
					return self.moduleSettings.PvPIconOffset['x']
				end,
				set = function(info, v)
					self.moduleSettings.PvPIconOffset['x'] = v
					self:SetTexLoc(self.barFrame.PvPIcon, self.moduleSettings.PvPIconOffset['x'], self.moduleSettings.PvPIconOffset['y'])
				end,
				disabled = function()
					return not self.moduleSettings.enabled or not self.moduleSettings.showPvPIcon
				end,
				order = 41
			},
			PvPIconOffsetY = {
				type = "range",
				name = L["PvP Icon Vertical Offset"],
				desc = L["How much to offset the PvP icon from the bar vertically"],
				min = -300,
				max = 50,
				step = 1,
				get = function()
					return self.moduleSettings.PvPIconOffset['y']
				end,
				set = function(info, v)
					self.moduleSettings.PvPIconOffset['y'] = v
					self:SetTexLoc(self.barFrame.PvPIcon, self.moduleSettings.PvPIconOffset['x'], self.moduleSettings.PvPIconOffset['y'])
				end,
				disabled = function()
					return not self.moduleSettings.enabled or not self.moduleSettings.showPvPIcon
				end,
				order = 42
			},
			PvPIconScale = {
				type = "range",
				name = L["PvP Icon Scale"],
				desc = L["How much to scale the PvP icon"],
				min = 0.05,
				max = 2,
				step = 0.05,
				get = function()
					return self.moduleSettings.PvPIconScale
				end,
				set = function(info, v)
					self.moduleSettings.PvPIconScale = v
					self:SetTexScale(self.barFrame.PvPIcon, 20, 20, v)
				end,
				disabled = function()
					return not self.moduleSettings.enabled or not self.moduleSettings.showPvPIcon
				end,
				order = 43
			},

			RaidHeader = {
				type = 'header',
				name = L["Raid icon"],
				order = 49.9
			},

			showRaidIcon = {
				type = "toggle",
				name = L["Show Raid Icon"],
				desc = L["Whether or not to show the raid icon above this bar"],
				get = function()
					return self.moduleSettings.showRaidIcon
				end,
				set = function(info, value)
					self.moduleSettings.showRaidIcon = value
					self:UpdateRaidTargetIcon()
				end,
				disabled = function()
					return not self.moduleSettings.enabled
				end,
				order = 50
			},

			raidIconOnTop = {
				type = "toggle",
				name = L["Draw Raid Icon On Top"],
				desc = L["Whether to draw the raid icon in front of or behind this bar"],
				get = function()
					return self.moduleSettings.raidIconOnTop
				end,
				set = function(info, value)
					self.moduleSettings.raidIconOnTop = value
					self:UpdateRaidTargetIcon()
				end,
				disabled = function()
					return not self.moduleSettings.enabled or not self.moduleSettings.showRaidIcon
				end,
				order = 52
			},

			raidIconXOffset = {
				type = "range",
				name = L["Raid Icon X Offset"],
				desc = L["How far to push the raid icon right or left"],
				min = -300,
				max = 300,
				step = 1,
				get = function()
					return self.moduleSettings.raidIconXOffset
				end,
				set = function(info, value)
					self.moduleSettings.raidIconXOffset = value
					self:SetRaidIconPlacement()
					self:Redraw()
				end,
				disabled = function()
					return not self.moduleSettings.enabled or not self.moduleSettings.showRaidIcon
				end,
				order = 53
			},

			raidIconYOffset = {
				type = "range",
				name = L["Raid Icon Y Offset"],
				desc = L["How far to push the raid icon up or down"],
				min = -300,
				max = 300,
				step = 1,
				get = function()
					return self.moduleSettings.raidIconYOffset
				end,
				set = function(info, value)
					self.moduleSettings.raidIconYOffset = value
					self:SetRaidIconPlacement()
					self:Redraw()
				end,
				disabled = function()
					return not self.moduleSettings.enabled or not self.moduleSettings.showRaidIcon
				end,
				order = 54
			},

			raidIconScale = {
				type = "range",
				name = L["Raid Icon Scale"],
				desc = L["How much to scale the raid icon"],
				min = 0.05,
				max = 2,
				step = 0.05,
				get = function()
					return self.moduleSettings.raidIconScale
				end,
				set = function(info, v)
					self.moduleSettings.raidIconScale = v
					self:SetTexScale(self.frame.raidIcon, self.raidIconWidth, self.raidIconHeight, v)
				end,
				disabled = function()
					return not self.moduleSettings.enabled or not self.moduleSettings.showRaidIcon
				end,
				order = 55
			},

			ClassificationHeader = {
				type = 'header',
				name = L["Classification icon"],
				order = 59.9
			},

			showClassificationIcon = {
				type = "toggle",
				name = L["Show Elite Icon"],
				desc = L["Whether or not to show the rare/elite icon above this bar"],
				get = function()
					return self.moduleSettings.showClassificationIcon
				end,
				set = function(info, value)
					self.moduleSettings.showClassificationIcon = value
					self:Redraw()
				end,
				disabled = function()
					return not self.moduleSettings.enabled
				end,
				order = 60
			},

			classIconOnTop = {
				type = "toggle",
				name = L["Draw Elite Icon On Top"],
				desc = L["Whether to draw the elite icon in front of or behind this bar"],
				get = function()
					return self.moduleSettings.classIconOnTop
				end,
				set = function(info, value)
					self.moduleSettings.classIconOnTop = value
					self:Redraw()
				end,
				disabled = function()
					return not self.moduleSettings.enabled or not self.moduleSettings.showClassificationIcon
				end,
				order = 60.1
			},

			classIconSet = {
				type = "select",
				name = L["Icon set"],
				desc = L["Which icon set to use for elite/rare elite/rare textures. This simply changes the look of the classification icon."],
				get = function()
					return self.moduleSettings.EliteTextureSet
				end,
				set = function(info, value)
					self.moduleSettings.EliteTextureSet = value
					self:Redraw()
				end,
				disabled = function()
					return not self.moduleSettings.enabled or not self.moduleSettings.showClassificationIcon
				end,
				values = {"Blizzard", "DHUD"},
				order = 60.2
			},

			classIconXOffset = {
				type = "range",
				name = L["Elite Icon X Offset"],
				desc = L["How far to push the elite icon right or left"],
				min = -300,
				max = 300,
				step = 1,
				get = function()
					return self.moduleSettings.classIconOffset['x']
				end,
				set = function(info, value)
					self.moduleSettings.classIconOffset['x'] = value
					self:Redraw()
				end,
				disabled = function()
					return not self.moduleSettings.enabled or not self.moduleSettings.showClassificationIcon
				end,
				order = 61
			},

			classIconYOffset = {
				type = "range",
				name = L["Elite Icon Y Offset"],
				desc = L["How far to push the elite icon up or down"],
				min = -300,
				max = 300,
				step = 1,
				get = function()
					return self.moduleSettings.classIconOffset['y']
				end,
				set = function(info, value)
					self.moduleSettings.classIconOffset['y'] = value
					self:Redraw()
				end,
				disabled = function()
					return not self.moduleSettings.enabled or not self.moduleSettings.showClassificationIcon
				end,
				order = 62
			},

			classIconScale = {
				type = "range",
				name = L["Elite Icon Scale"],
				desc = L["How much to scale the elite icon"],
				min = 0.05,
				max = 2,
				step = 0.05,
				get = function()
					return self.moduleSettings.classIconScale
				end,
				set = function(info, v)
					self.moduleSettings.classIconScale = v
					self:SetTexScale(self.barFrame.classIcon, self.texWidth, self.texHeight, self.moduleSettings.scale / 3.0 * self.moduleSettings.classIconScale)
				end,
				disabled = function()
					return not self.moduleSettings.enabled or not self.moduleSettings.showClassificationIcon
				end,
				order = 63
			},

			headerPartyRoleIcon = {
				type = 'header',
				name = L["Party Role icon"],
				order = 65
			},
			PartyRoleIcon = {
				type = "toggle",
				name = L["Show Party Role icon"],
				desc = L["Whether or not to show the Party Role icon"],
				get = function()
					return self.moduleSettings.showPartyRoleIcon
				end,
				set = function(info, value)
					self.moduleSettings.showPartyRoleIcon = value
					self:CheckPartyRole()
				end,
				disabled = function()
					return not self.moduleSettings.enabled
				end,
				order = 66
			},
			PartyRoleIconOffsetX = {
				type = "range",
				name = L["Party Role Icon Horizontal Offset"],
				desc = L["How much to offset the Party Role icon from the bar horizontally"],
				min = -300,
				max = 300,
				step = 1,
				get = function()
					return self.moduleSettings.PartyRoleIconOffset['x']
				end,
				set = function(info, v)
					self.moduleSettings.PartyRoleIconOffset['x'] = v
					self:SetTexLoc(self.frame.PartyRoleIcon, self.moduleSettings.PartyRoleIconOffset['x'], self.moduleSettings.PartyRoleIconOffset['y'])
				end,
				disabled = function()
					return not self.moduleSettings.enabled or not self.moduleSettings.showPartyRoleIcon
				end,
				order = 67
			},
			PartyRoleIconOffsetY = {
				type = "range",
				name = L["Party Role Icon Vertical Offset"],
				desc = L["How much to offset the Party Role icon from the bar vertically"],
				min = -300,
				max = 50,
				step = 1,
				get = function()
					return self.moduleSettings.PartyRoleIconOffset['y']
				end,
				set = function(info, v)
					self.moduleSettings.PartyRoleIconOffset['y'] = v
					self:SetTexLoc(self.frame.PartyRoleIcon, self.moduleSettings.PartyRoleIconOffset['x'], self.moduleSettings.PartyRoleIconOffset['y'])
				end,
				disabled = function()
					return not self.moduleSettings.enabled or not self.moduleSettings.showPartyRoleIcon
				end,
				order = 68
			},
			PartyRoleIconScale = {
				type = "range",
				name = L["Party Role Icon Scale"],
				desc = L["How much to scale the Party Role icon"],
				min = 0.05,
				max = 2,
				step = 0.05,
				get = function()
					return self.moduleSettings.PartyRoleIconScale
				end,
				set = function(info, v)
					self.moduleSettings.PartyRoleIconScale = v
					self:SetTexScale(self.frame.PartyRoleIcon, 20, 20, v)
				end,
				disabled = function()
					return not self.moduleSettings.enabled or not self.moduleSettings.showPartyRoleIcon
				end,
				order = 69
			}
		}
	}

	return opts
end


function IceTargetHealth.prototype:Enable(core)
	IceTargetHealth.super.prototype.Enable(self, core)

	if self.registerEvents then
		self:RegisterEvent("UNIT_HEALTH", "UpdateEvent")
		self:RegisterEvent("UNIT_MAXHEALTH", "UpdateEvent")
		self:RegisterEvent("UNIT_FLAGS", "UpdateEvent")
		self:RegisterEvent("UNIT_FACTION", "UpdateEvent")
		self:RegisterEvent("RAID_TARGET_UPDATE", "UpdateRaidTargetIcon")
		self:RegisterEvent("UPDATE_FACTION", "CheckPvP")
		self:RegisterEvent("PLAYER_FLAGS_CHANGED", "CheckPvP")
		self:RegisterEvent("UNIT_FACTION", "CheckPvP")
		if GetLFGRoles then
			self:RegisterEvent("LFG_PROPOSAL_UPDATE", "CheckPartyRole")
			self:RegisterEvent("LFG_PROPOSAL_FAILED", "CheckPartyRole")
			self:RegisterEvent("LFG_ROLE_UPDATE", "CheckPartyRole")
		end

		if IceHUD.ShouldUpdateTargetHealthEveryTick and self.unit == "target" then
			self.frame:SetScript("OnUpdate", function() self:Update(self.unit) end)
		end
	end

	if (self.moduleSettings.hideBlizz) then
		self:HideBlizz()
	end

	self:Update(self.unit)

	RegisterUnitWatch(self.frame)
end


function IceTargetHealth.prototype:Disable(core)
	IceTargetHealth.super.prototype.Disable(self, core)

	UnregisterUnitWatch(self.frame)

	if self.registerEvents and IceHUD.ShouldUpdateTargetHealthEveryTick and self.unit == "target" then
		self.frame:SetScript("OnUpdate", nil)
	end

	if self.moduleSettings.hideBlizz then
		self:ShowBlizz()
	end
end

function IceTargetHealth.prototype:GetEliteTextures()
	if self.moduleSettings.EliteTextureSet == 1 then
		return IceElement.TexturePath .. "Elite", IceElement.TexturePath .. "RareElite", IceElement.TexturePath .. "Rare"
	else
		return IceElement.TexturePath .. "Elite2", IceElement.TexturePath .. "RareElite2", IceElement.TexturePath .. "Rare2"
	end
end

function IceTargetHealth.prototype:CreateBackground(redraw)
	IceTargetHealth.super.prototype.CreateBackground(self)

	self:EnableClickTargeting(self.moduleSettings.allowMouseInteraction)
	if self.frame.button then
		self.frame.button:ClearAllPoints()
		-- Parnic - kinda hacky, but in order to fit this region to multiple types of bars, we need to do this...
		--          would be nice to define this somewhere in data, but for now...here we are
		if self:GetMyBarTextureName() == "HiBar" then
			self.frame.button:SetPoint("TOPRIGHT", self.frame, "TOPRIGHT", 0, 0)
			self.frame.button:SetPoint("BOTTOMLEFT", self.frame, "BOTTOMRIGHT", -1 * self.frame:GetWidth(), 0)
		elseif self:GetMyBarTextureName() == "ArcHUD" then
			if self.moduleSettings.side == IceCore.Side.Left then
				self.frame.button:SetPoint("TOPLEFT", self.frame, "TOPLEFT")
				self.frame.button:SetPoint("BOTTOMRIGHT", self.frame, "BOTTOMLEFT", self.frame:GetWidth() / 3, 0)
			else
				self.frame.button:SetPoint("TOPRIGHT", self.frame, "TOPRIGHT")
				self.frame.button:SetPoint("BOTTOMLEFT", self.frame, "BOTTOMRIGHT", -1 * self.frame:GetWidth() / 3, 0)
			end
		else
			if self.moduleSettings.side == IceCore.Side.Left then
				self.frame.button:SetPoint("TOPRIGHT", self.frame, "TOPRIGHT", -6, 0)
				self.frame.button:SetPoint("BOTTOMLEFT", self.frame, "BOTTOMRIGHT", -1 * self.frame:GetWidth() / 3, 0)
			else
				self.frame.button:SetPoint("TOPLEFT", self.frame, "TOPLEFT", 6, 0)
				self.frame.button:SetPoint("BOTTOMRIGHT", self.frame, "BOTTOMRIGHT", -1 * self.frame:GetWidth() / 1.5, 0)
			end
		end
	end
end


function IceTargetHealth.prototype:EnableClickTargeting(bEnable)
	if bEnable then
		if not self.frame.button then
			self.frame.button = CreateFrame("Button", "IceHUD_TargetClickFrame", self.frame, "SecureUnitButtonTemplate")
		end

		self.frame.button:EnableMouse(true)
		self.frame.button:RegisterForClicks("AnyUp")
		self.frame.button:SetAttribute("type1", "target")
		self.frame.button:SetAttribute("type2", "togglemenu")
		self.frame.button:SetAttribute("unit", self.unit)

		-- set up click casting
		ClickCastFrames = ClickCastFrames or {}
		ClickCastFrames[self.frame.button] = true

-- Parnic - debug code for showing the clickable region on this bar
--		self.frame.button:SetBackdrop({bgFile = "Interface/Tooltips/UI-Tooltip-Background",
--						edgeFile = "Interface/Tooltips/UI-Tooltip-Border",
--						tile = false,
--						insets = { left = 0, right = 0, top = 0, bottom = 0 }});
--		self.frame.button:SetBackdropColor(0,0,0,1);
	else
		if self.frame.button then
			self.frame.button:EnableMouse(false)
			self.frame.button:RegisterForClicks()

			-- click casting support
			--ClickCastFrames = ClickCastFrames or {}
			--ClickCastFrames[self.frame.button] = false

			self.frame.button:SetParent(nil)
			self.frame.button = nil
		end
	end
end

function IceTargetHealth.prototype:OnShow()
	IceTargetHealth.super.prototype.OnShow(self)

	self:Update(self.unit)
end

function IceTargetHealth.prototype:UpdateEvent(event, unit)
	self:Update(unit)
end

function IceTargetHealth.prototype:Update(unit)
	IceTargetHealth.super.prototype.Update(self)

	if (unit and (unit ~= self.unit)) then
		return
	end

	if unit and not (UnitExists(unit)) then
--		self:Show(false)
		if self.barFrame.PvPIcon then
			self.barFrame.PvPIcon:Hide()
		end
		if self.frame.PartyRoleIcon then
			self.frame.PartyRoleIcon:Hide()
		end
		if self.barFrame.classIcon then
			self.barFrame.classIcon:Hide()
		end
		if self.frame.raidIcon then
			self.frame.raidIcon:Hide()
		end
		return
	else
--		self:Show(true)
	end

	self:UpdateRaidTargetIcon()

	local classification = UnitClassification(self.unit);
	if not self.moduleSettings.showClassificationIcon then
		self:DestroyTexFrame(self.barFrame.classIcon)
	else
		if not self.barFrame.classIcon then
			self.barFrame.classIcon = self:CreateTexCoord(self.barFrame.classIcon, self.EliteTexture, self.texWidth, self.texHeight,
						self.moduleSettings.scale / 3.0 * self.moduleSettings.classIconScale, self.classLeft, self.classRight, self.classTop, self.classBottom)
		end

		if self.moduleSettings.classIconOnTop then
			self.barFrame.classIcon:SetDrawLayer("OVERLAY")
		else
			self.barFrame.classIcon:SetDrawLayer("BACKGROUND")
		end

		self:SetTexLoc(self.barFrame.classIcon, self.moduleSettings.classIconOffset['x'], self.moduleSettings.classIconOffset['y'])
		self.barFrame.classIcon:Show()

		local elite, rareelite, rare = self:GetEliteTextures()
		if self.configMode or IceHUD.IceCore:IsInConfigMode() or classification == "worldboss" or classification == "elite" then
			self.barFrame.classIcon:SetTexture(elite)
		elseif classification == "rareelite" then
			self.barFrame.classIcon:SetTexture(rareelite)
		elseif classification == "rare" then
			self.barFrame.classIcon:SetTexture(rare)
		else
			self:DestroyTexFrame(self.barFrame.classIcon)
			self.barFrame.classIcon:Hide()
		end
	end

	if self.determineColor then
		self.color = "TargetHealthFriendly" -- friendly > 4

		local reaction = UnitReaction("target", "player")
		if (reaction and (reaction == 4)) then
			self.color = "TargetHealthNeutral"
		elseif (reaction and (reaction < 4)) then
			self.color = "TargetHealthHostile"
		end

		if (self.moduleSettings.classColor) and (not self.moduleSettings.npcHostilityColor or UnitPlayerControlled("target")) then
			self.color = self.unitClass
		end

		if (self.moduleSettings.scaleHealthColor) then
			self.color = "ScaledHealthColor"
		elseif self.moduleSettings.lowThresholdColor and IceHUD.CanAccessValue(self.healthPercentage) and self.healthPercentage <= self.moduleSettings.lowThreshold then
			self.color = "ScaledHealthColor"
		end

		if (self.tapped) then
			self.color = "Tapped"
		end
	end

	self:UpdateBar(self.healthPercentage, self.color)

	if IsAddOnLoaded("RealMobHealth") and RealMobHealth.UnitHasHealthData(unit) then
		self.health, self.maxHealth = RealMobHealth.GetUnitHealth(unit)
		self.healthPercentage = self.health / self.maxHealth
	end

	if not IceHUD.IceCore:ShouldUseDogTags() and self.frame:IsVisible() then
		self:SetBottomText1(string.format("%.0f", UnitHealthPercent and UnitHealthPercent(self.unit, true, CurveConstants.ScaleTo100) or math.floor(self.healthPercentage * 100)))

		if not IceHUD.CanAccessValue(self.maxHealth) or self.maxHealth ~= 100 then
			if self.moduleSettings.abbreviateHealth then
				if AbbreviateNumbers then
					self:SetBottomText2(self:GetFormattedText(AbbreviateNumbers(self.health), AbbreviateNumbers(self.maxHealth)), self.color)
				else
					self.health = self:Round(self.health)
					self.maxHealth = self:Round(self.maxHealth)
					self:SetBottomText2(self:GetFormattedText(self.health, self.maxHealth), self.color)
				end
			else
				self:SetBottomText2(self:GetFormattedText(self.health, self.maxHealth), self.color)
			end
		else
			self:SetBottomText2()
		end
	end

	self:CheckPvP()
	self:CheckPartyRole()
	self:SetIconAlpha()
end


function IceTargetHealth.prototype:CreateTexCoord(texframe, icon, width, height, scale, left, right, top, bottom)
	if not texframe then
		texframe = self.masterFrame:CreateTexture(nil, "BACKGROUND")
	end

	texframe:SetTexture(icon)
	if left and right and top and bottom then
		texframe:SetTexCoord(left, right, top, bottom)
	end
	self:SetTexScale(texframe, width, height, scale or 1)

	return texframe
end


function IceTargetHealth.prototype:SetTexLoc(texframe, xpos, ypos, anchorFrom, anchorTo)
	if not texframe then
		return nil
	end

	texframe:Show()
	texframe:ClearAllPoints()
	texframe:SetPoint(anchorFrom or "TOPLEFT", self.frame, anchorTo or "TOPLEFT", xpos or 0, ypos or 0)
end


function IceTargetHealth.prototype:SetTexScale(texframe, width, height, scale)
	if not texframe then
		return nil
	end

	texframe:SetWidth(width * scale)
	texframe:SetHeight(height * scale)
end


function IceTargetHealth.prototype:DestroyTexFrame(texframe)
	if not texframe then
		return nil
	end

	texframe:SetTexture(nil)
	texframe:Hide()
	texframe:ClearAllPoints()

	return texframe
end


function IceTargetHealth.prototype:CreateFrame()
	IceTargetHealth.super.prototype.CreateFrame(self)

	self:CreateRaidIconFrame()

	-- for showing/hiding the frame based on unit visibility
	self.frame:SetAttribute("unit", self.unit)
end



function IceTargetHealth.prototype:CreateRaidIconFrame()
	if (not self.frame.raidIcon) then
		self.frame.raidIcon = CreateFrame("Frame", nil, self.frame)
	end

	if (not self.frame.raidIcon.icon) then
		self.frame.raidIcon.icon = self.frame.raidIcon:CreateTexture(nil, "BACKGROUND")
		self.frame.raidIcon.icon:SetTexture("Interface\\TargetingFrame\\UI-RaidTargetingIcons")
	end

	self:SetRaidIconPlacement()
	self:SetTexScale(self.frame.raidIcon, self.raidIconWidth, self.raidIconHeight, self.moduleSettings.raidIconScale)

	self.frame.raidIcon.icon:SetAllPoints(self.frame.raidIcon)
	SetRaidTargetIconTexture(self.frame.raidIcon.icon, 0)
	self.frame.raidIcon:Hide()
end

function IceTargetHealth.prototype:SetRaidIconPlacement()
	self.frame.raidIcon:ClearAllPoints()
	self.frame.raidIcon:SetPoint("BOTTOM", self.frame, "TOPLEFT", self.moduleSettings.raidIconXOffset, self.moduleSettings.raidIconYOffset)
end


function IceTargetHealth.prototype:UpdateRaidTargetIcon()
	if self.moduleSettings.raidIconOnTop then
		self.frame.raidIcon:SetFrameStrata(IceHUD.IceCore:DetermineStrata("MEDIUM"))
	else
		self.frame.raidIcon:SetFrameStrata(IceHUD.IceCore:DetermineStrata("LOW"))
	end

	if not self.moduleSettings.showRaidIcon or (not UnitExists(self.unit) and (not self.configMode and not IceHUD.IceCore:IsInConfigMode())) then
		self.frame.raidIcon:Hide()
		return
	end

	local index = (IceHUD.IceCore:IsInConfigMode() or self.configMode) and 1 or GetRaidTargetIndex(self.unit);

	if (index and (index > 0)) then
		SetRaidTargetIconTexture(self.frame.raidIcon.icon, index)
		self.frame.raidIcon:Show()
	else
		self.frame.raidIcon:Hide()
	end

	if self.frame.raidIcon then
		self.frame.raidIcon:SetAlpha(self.moduleSettings.lockIconAlpha and 1 or self.alpha)
	end
end


function IceTargetHealth.prototype:CheckPvP()
	local pvpMode = nil
	local minx, maxx, miny, maxy

	if self.configMode or UnitIsPVPFreeForAll(self.unit) then
		pvpMode = "FFA"

		minx, maxx, miny, maxy = 0.05, 0.605, 0.015, 0.57
	elseif UnitIsPVP(self.unit) then
		pvpMode = UnitFactionGroup(self.unit)

		if pvpMode == "Neutral" then
			pvpMode = "FFA"
		end

		if pvpMode == "Alliance" then
			minx, maxx, miny, maxy = 0.07, 0.58, 0.06, 0.57
		else
			minx, maxx, miny, maxy = 0.08, 0.58, 0.045, 0.545
		end
	end

	if pvpMode then
		if self.configMode or self.moduleSettings.showPvPIcon then
			self.barFrame.PvPIcon = self:CreateTexCoord(self.barFrame.PvPIcon, "Interface\\TargetingFrame\\UI-PVP-"..pvpMode, 20, 20,
						self.moduleSettings.PvPIconScale, minx, maxx, miny, maxy)
			self:SetTexLoc(self.barFrame.PvPIcon, self.moduleSettings.PvPIconOffset['x'], self.moduleSettings.PvPIconOffset['y'])

			if self.moduleSettings.PvPIconOnTop then
				self.barFrame.PvPIcon:SetDrawLayer("OVERLAY")
			else
				self.barFrame.PvPIcon:SetDrawLayer("BACKGROUND")
			end
		elseif self.barFrame.PvPIcon and self.barFrame.PvPIcon:IsVisible() then
			self.barFrame.PvPIcon = self:DestroyTexFrame(self.barFrame.PvPIcon)
		end
	else
		if self.barFrame.PvPIcon and self.barFrame.PvPIcon:IsVisible() then
			self.barFrame.PvPIcon = self:DestroyTexFrame(self.barFrame.PvPIcon)
		end
	end
end

function IceTargetHealth.prototype:SetIconAlpha()
	if self.barFrame.PvPIcon then
		self.barFrame.PvPIcon:SetAlpha(self.moduleSettings.lockIconAlpha and 1 or self.alpha)
	end
	if self.frame.PartyRoleIcon then
		self.frame.PartyRoleIcon:SetAlpha(self.moduleSettings.lockIconAlpha and 1 or self.alpha)
	end
	if self.barFrame.classIcon and self.moduleSettings.showClassificationIcon then
		self.barFrame.classIcon:SetAlpha(self.moduleSettings.lockIconAlpha and 1 or self.alpha == 0 and 0 or math.min(1, self.alpha + 0.2))
	end
end



function IceTargetHealth.prototype:ShowBlizz()
	TargetFrame:SetParent(self.OriginalTargetFrameParent or UIParent)
	ComboFrame:SetParent(self.OriginalComboFrameParent or UIParent)
end


function IceTargetHealth.prototype:HideBlizz()
	if not self.TargetFrameParent then
		self.TargetFrameParent = CreateFrame("Frame")
		self.TargetFrameParent:Hide()
	end
	if not self.ComboFrameParent then
		self.ComboFrameParent = CreateFrame("Frame")
		self.ComboFrameParent:Hide()
	end

	self.OriginalTargetFrameParent = TargetFrame:GetParent()
	TargetFrame:SetParent(self.TargetFrameParent)
	self.OriginalComboFrameParent = ComboFrame:GetParent()
	ComboFrame:SetParent(self.ComboFrameParent)
end

function IceTargetHealth.prototype:UpdateBar(scale, color, alpha)
	IceTargetHealth.super.prototype.UpdateBar(self, scale, color, alpha)
--[[ seems to be causing taint. oh well
	if self.frame.button then
		if self.alpha == 0 then
			self.frame.button:Hide()
		else
			self.frame.button:Show()
		end
	end
]]
end

function IceTargetHealth.prototype:CheckPartyRole()
	if self.configMode or IceHUD:GetIsInLFGGroup() then
		if self.configMode or self.moduleSettings.showPartyRoleIcon then
			local isTank, isHeal, isDPS
			local proposalExists, typeID, id, subtypeID, name
			local texture, role, hasResponded, totalEncounters, completedEncounters, numMembers, isleader
			proposalExists, id, typeID, subtypeID, name, texture, role, hasResponded, totalEncounters, completedEncounters, numMembers, isleader = GetLFGProposal()

			local p = self.unit
			if not IceHUD.UnitGroupRolesReturnsRoleString then
				isTank, isHeal, isDPS = UnitGroupRolesAssigned(p)
			else
				local grpRole = UnitGroupRolesAssigned(p)
				isTank = (grpRole == "TANK")
				isHeal = (grpRole == "HEALER")
				isDPS = (grpRole == "DAMAGER")
			end

			if proposalExists == true then
				isTank = (role == "TANK")
				isHeal = (role == "HEALER")
				isDPS = (role == "DAMAGER")
			end

			if proposalExists == nil then
				hasResponded = false
				proposalExists = false
			end

			if hasResponded == false then
				if proposalExists == true then
					isTank = (role == "TANK")
					isHeal = (role == "HEALER")
					isDPS = (role == "DAMAGER")
				end
			else
				isTank = not hasResponded
				isHeal = not hasResponded
				isDPS = not hasResponded
			end

			if isTank then
				self.frame.PartyRoleIcon = self:CreateTexCoord(self.frame.PartyRoleIcon, "Interface\\LFGFrame\\UI-LFG-ICON-PORTRAITROLES", 20, 20, self.moduleSettings.PartyRoleIconScale, 0/64, 19/64, 22/64, 41/64)
			elseif isHeal then
				self.frame.PartyRoleIcon = self:CreateTexCoord(self.frame.PartyRoleIcon, "Interface\\LFGFrame\\UI-LFG-ICON-PORTRAITROLES", 20, 20, self.moduleSettings.PartyRoleIconScale, 20/64, 39/64, 1/64, 20/64)
			elseif isDPS then
				self.frame.PartyRoleIcon = self:CreateTexCoord(self.frame.PartyRoleIcon, "Interface\\LFGFrame\\UI-LFG-ICON-PORTRAITROLES", 20, 20, self.moduleSettings.PartyRoleIconScale, 20/64, 39/64, 22/64, 41/64)
			elseif self.configMode then
				self.frame.PartyRoleIcon = self:CreateTexCoord(self.frame.PartyRoleIcon, "Interface\\LFGFrame\\UI-LFG-ICON-PORTRAITROLES", 20, 20, self.moduleSettings.PartyRoleIconScale, 0/64, 19/64, 1/64, 20/64)
			else
				self.frame.PartyRoleIcon = self:DestroyTexFrame(self.frame.PartyRoleIcon)
			end
			self:SetTexLoc(self.frame.PartyRoleIcon, self.moduleSettings.PartyRoleIconOffset['x'], self.moduleSettings.PartyRoleIconOffset['y'])
			self:SetIconAlpha()
		elseif not self.configMode and not self.moduleSettings.showPartyRoleIcon then
			self.frame.PartyRoleIcon = self:DestroyTexFrame(self.frame.PartyRoleIcon)
		end
	else
		self.frame.PartyRoleIcon = self:DestroyTexFrame(self.frame.PartyRoleIcon)
	end
end

-- Load us up
IceHUD.TargetHealth = IceTargetHealth:new()
