local L = LibStub("AceLocale-3.0"):GetLocale("IceHUD", false)
local RangeCheck = IceCore_CreateClass(IceElement)
RangeCheck.prototype.scheduledEvent = nil

local LibRange = nil
local DogTag = nil

-- Constructor --
function RangeCheck.prototype:init()
	RangeCheck.super.prototype.init(self, "RangeCheck")

	self.scalingEnabled = true

	LibRange = LibStub("LibRangeCheck-3.0", true)
end

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

	if IceHUD.IceCore:ShouldUseDogTags() then
		DogTag = LibStub("LibDogTag-3.0", true)
		self:RegisterFontStrings()
	else
		self.scheduledEvent = self:ScheduleRepeatingTimer("UpdateRange", 0.1)
	end
end

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

	if DogTag then
		self:UnregisterFontStrings()
	else
		self:CancelTimer(self.scheduledEvent, true)
	end
end

function RangeCheck.prototype:GetDefaultSettings()
	local defaults =  RangeCheck.super.prototype.GetDefaultSettings(self)

	defaults["rangeString"] = "Range: [HostileColor Range]"
	defaults["vpos"] = 220
	defaults["hpos"] = 0
	defaults["enabled"] = false

	return defaults
end

function RangeCheck.prototype:GetOptions()
	local opts = RangeCheck.super.prototype.GetOptions(self)

	opts["vpos"] = {
		type = "range",
		name = L["Vertical Position"],
		desc = L["Vertical Position"],
		get = function()
			return self.moduleSettings.vpos
		end,
		set = function(info, v)
			self.moduleSettings.vpos = v
			self:Redraw()
		end,
		min = -300,
		max = 600,
		step = 1,
		disabled = function()
			return not self.moduleSettings.enabled
		end,
		order = 31
	}

	opts["hpos"] = {
		type = "range",
		name = L["Horizontal Position"],
		desc = L["Horizontal Position"],
		get = function()
			return self.moduleSettings.hpos
		end,
		set = function(info, v)
			self.moduleSettings.hpos = v
			self:Redraw()
		end,
		min = -500,
		max = 500,
		step = 1,
		disabled = function()
			return not self.moduleSettings.enabled
		end,
		order = 32
	}

	opts["rangeString"] = {
		type = 'input',
		name = L["Range string"],
		desc = L["DogTag-formatted string to use for the range display (only available if LibDogTag is being used)\n\nType /dogtag for a list of available tags"],
		get = function()
			return self.moduleSettings.rangeString
		end,
		set = function(info, v)
			v = DogTag:CleanCode(v)
			self.moduleSettings.rangeString = v
			self:RegisterFontStrings()
			self:Redraw()
		end,
		disabled = function()
			return not self.moduleSettings.enabled or not DogTag or not LibRange
		end,
		usage = '',
		order = 33
	}

	return opts
end

function RangeCheck.prototype:Redraw()
	RangeCheck.super.prototype.Redraw(self)

	if (self.moduleSettings.enabled) then
		self:CreateFrame(true)
	end
end

function RangeCheck.prototype:CreateFrame(redraw)
	if not (self.frame) then
		self.frame = CreateFrame("Frame", "IceHUD_"..self.elementName, self.parent)
	end

	self.frame:SetScale(self.moduleSettings.scale)
	self.frame:SetFrameStrata(IceHUD.IceCore:DetermineStrata("BACKGROUND"))
	self.frame:SetWidth(200)
	self.frame:SetHeight(32)
	self.frame:ClearAllPoints()
	self.frame:SetPoint("TOP", self.parent, "TOP", self.moduleSettings.hpos, self.moduleSettings.vpos)

	self.frame.rangeFontString = self:FontFactory(--[[self.moduleSettings.fontSize+1]] 13, self.frame, self.frame.rangeFontString)
	self.frame.rangeFontString:SetJustifyH("CENTER")
	self.frame.rangeFontString:SetJustifyV("TOP")
	self.frame.rangeFontString:SetAllPoints(self.frame)
end

function RangeCheck.prototype:RegisterFontStrings()
	if DogTag and LibRange then
		DogTag:AddFontString(self.frame.rangeFontString, self.frame, self.moduleSettings.rangeString, "Unit", { unit = "target" })
		DogTag:UpdateAllForFrame(self.frame)
	end
end

function RangeCheck.prototype:UnregisterFontStrings()
	if DogTag then
		DogTag:RemoveFontString(self.frame.rangeFontString)
	end
end

-- this function is called every 0.1 seconds only if LibDogTag is not being used
function RangeCheck.prototype:UpdateRange()
	if LibRange and UnitExists("target") then
		local min, max = LibRange:getRange("target")
		if min then
			if max then
				self.frame.rangeFontString:SetText("Range: " .. min .. " - " .. max)
			else
				self.frame.rangeFontString:SetText("Range: " .. min .. "+")
			end
		else
			self.frame.rangeFontString:SetText("Unknown")
		end

		self.frame.rangeFontString:SetWidth(0)
	else
		self.frame.rangeFontString:SetText()
	end
end

IceHUD.RangeCheck = RangeCheck:new()
