local AceLocale = LibStub("AceLocale-3.0")
local L = AceLocale:GetLocale( "Recount" )
local me={}

local revision = tonumber(string.sub("$Revision: 1067 $", 12, -3))
local Recount = _G.Recount
if Recount.Version < revision then Recount.Version = revision end

local ReportLocations={
	{L["Say"],"SAY"},
	{L["Party"],"PARTY",function() return GetNumPartyMembers()>0 end},
	{L["Raid"],"RAID",function() return UnitInRaid("player") end},
	{L["Guild"],"GUILD",IsInGuild},
	{L["Officer"],"OFFICER",IsInGuild},
	{L["Whisper"],"WHISPER"},
	{L["Whisper Target"],"WHISPER2"}
}

local ReportList

function me:CreateReportList()
	ReportList={}

	for _,v in ipairs(ReportLocations) do
		if type(v[3])=="function" and v[3]() then
			table.insert(ReportList,{v[1],v[2]})
		elseif type(v[3])~="function" then
			table.insert(ReportList,{v[1],v[2]})
		end
	end

	local channels={GetChannelList()}

	for i=1,table.getn(channels)/2 do
		table.insert(ReportList,{channels[i*2-1]..". "..channels[i*2],"CHANNEL",channels[i*2-1]})
	end
end

function me:UncheckAll()
	for _,v in ipairs(me.Rows) do
		v.Enabled:SetChecked(false)
	end
end

function me:AddRow()
	local CurRow=me.NumRows+1
	local Row=CreateFrame("Frame",nil,me.ReportWindow)

	Row:SetPoint("TOP",me.ReportWindow,"TOP",0,-34-36-18*CurRow)

	Row:SetHeight(16)
	Row:SetWidth(180)

	Row.Text=Row:CreateFontString(nil,"OVERLAY","GameFontHighlightSmall")
	Row.Text:SetPoint("LEFT",Row,"LEFT",0,0)
	Row.Text:SetText("")
	Recount:AddFontString(Row.Text)

	Row.Enabled=CreateFrame("CheckButton",nil,Row)
	Row.Enabled:SetPoint("RIGHT",Row,"RIGHT",-4,0)
	Row.Enabled:SetWidth(16)
	Row.Enabled:SetHeight(16)
	Row.Enabled.id=CurRow
	Row.Enabled:SetScript("OnClick",function(this) if this:GetChecked() then me:UncheckAll();this:SetChecked(true);me.Selected=ReportList[this.id][1] else this:SetChecked(false) end end)
	Row.Enabled:SetNormalTexture("Interface\\Buttons\\UI-CheckBox-Up")
	Row.Enabled:SetPushedTexture("Interface\\Buttons\\UI-CheckBox-Down")
	Row.Enabled:SetCheckedTexture("Interface\\Buttons\\UI-CheckBox-Check")
	Row.Enabled:SetHighlightTexture("Interface\\Buttons\\UI-CheckBox-Highlight")
	Row.Enabled:Show()

	table.insert(me.Rows,Row)

	me.NumRows=CurRow
end

function me:UpdateReportWindow()
	local Amount, Row
	me:CreateReportList()
	Amount=table.getn(ReportList)


	for i=me.NumRows+1,Amount do
		me:AddRow()
	end

	for i=1,Amount do
		Row=me.Rows[i]
		Row.Text:SetText(ReportList[i][1])
		if me.Selected~=nil and ReportList[i][1]==me.Selected then
			Row.Enabled:SetChecked(true)
		else
			Row.Enabled:SetChecked(false)
		end
		Row:Show()
	end

	for i=Amount+1,me.NumRows do
		me.Rows[i]:Hide()
	end

	me.ReportWindow:SetHeight(118+20+18*Amount)

	if me.Title then
		me.ReportWindow.Title:SetText(L["Report Data"].." - "..me.Title)
	end
end

function me:CreateReportWindow()
	me.ReportWindow=Recount:CreateFrame("Recount_ReportWindow",L["Report Data"],116,200)

	local theFrame=me.ReportWindow

	if me.Title then
		theFrame.Title:SetText(L["Report Data"].." - "..me.Title)
	end

	theFrame.Whisper=CreateFrame("EditBox",nil,theFrame, "InputBoxTemplate")
	theFrame.Whisper:SetWidth(120)
	theFrame.Whisper:SetHeight(13)
	theFrame.Whisper:SetPoint("BOTTOMLEFT",theFrame,"BOTTOM",-32,34)
	theFrame.Whisper:SetAutoFocus(false)

	theFrame.WhisperText=theFrame:CreateFontString(nil,"OVERLAY","GameFontNormal")
	theFrame.WhisperText:SetText(L["Whisper"]..":")
	theFrame.WhisperText:SetPoint("RIGHT",theFrame.Whisper,"LEFT",-8,0)
	Recount:AddFontString(theFrame.WhisperText)



	theFrame.ReportTitle=theFrame:CreateFontString(nil,"OVERLAY","GameFontNormal")
	theFrame.ReportTitle:SetPoint("TOPLEFT",theFrame,"TOPLEFT",6,-34-40)
	theFrame.ReportTitle:SetText(L["Report To"])
	Recount:AddFontString(theFrame.ReportTitle)

	theFrame.ReportButton=CreateFrame("Button",nil,theFrame,"OptionsButtonTemplate")
	theFrame.ReportButton:SetWidth(90)
	theFrame.ReportButton:SetHeight(24)
	theFrame.ReportButton:SetPoint("BOTTOM",theFrame,"BOTTOM",0,4)
	theFrame.ReportButton:SetScript("OnClick",function() me:SendReport();theFrame:Hide() end)
	theFrame.ReportButton:SetText(L["Report"])

	local slider = CreateFrame("Slider", "Recount_ReportWindow_Slider", theFrame,"OptionsSliderTemplate")
	theFrame.slider=slider
	slider:SetOrientation("HORIZONTAL")
	slider:SetMinMaxValues(1, 25)
	slider:SetValueStep(1)
	slider:SetValue(Recount.db.profile.ReportLines or 10)
	slider:SetWidth(180)
	slider:SetHeight(16)
	slider:SetPoint("TOP", theFrame, "TOP", 0, -46)
	slider:SetScript("OnValueChanged",function(this) Recount.db.profile.ReportLines=this:GetValue(); getglobal(this:GetName().."Text"):SetText(L["Report Top"]..": "..this:GetValue()) end)
	getglobal(slider:GetName().."High"):SetText("25");
	getglobal(slider:GetName().."Low"):SetText("1");
	getglobal(slider:GetName().."Text"):SetText(L["Report Top"]..": "..slider:GetValue())

	theFrame:Hide()

	me.Rows={}
	me.NumRows=0

	--Need to add it to our window ordering system
	Recount:AddWindow(theFrame)
end

function me:SendReport()
	local Num,Loc1,Loc2

	Num=me.ReportWindow.slider:GetValue()

	for k,v in ipairs(me.Rows) do
		if v.Enabled:GetChecked() then
			Loc1=ReportList[k][2]
			Loc2=ReportList[k][3]
		end
	end

	if Loc1=="WHISPER" then
		Loc2=me.ReportWindow.Whisper:GetText()
		if Loc2==nil or Loc2=="" then
			Recount:Print("No Target Selected")
			return
		end
	elseif Loc1=="WHISPER2" then
		Loc1="WHISPER"
		if UnitExists("target") then
			if UnitIsPlayer("target") then
				Loc2=UnitName("target")
			else
				Recount:Print("Target isn't a player")
				return
			end
		else
			Recount:Print("No Target Selected")
			return
		end
	end

	Recount:ReportFunc(Num,Loc1,Loc2)
end

function Recount:ShowReport(Title,ReportFunc)
	me.Title=Title
	if me.ReportWindow==nil then
		me:CreateReportWindow()
	end

	
	me:UpdateReportWindow()
	me.ReportWindow:Show()
	Recount.ReportFunc=ReportFunc
end