local E, L, V, P, G = unpack(ElvUI);
local SLE = E:GetModule('SLE');
local ACD = LibStub("AceConfigDialog-3.0")

local bnettesttbl = {}
function SLE:GetBNetInfo()
	local _, numBNetOnline = BNGetNumFriends()
	for i = 1, numBNetOnline do
		local presenceID, presenceName, _, _, _, _, client, isOnline = BNGetFriendInfo(i)
		if isOnline and client == BNET_CLIENT_WOW then
			BNSendGameData(presenceID, 'SLE_DEV_REQ', 'slesay#'..presenceID)
		end
	end
end

local function Login(self, event)
	self:UnregisterEvent(event)
	if SLE:Auth() then
		local selectedChannel = ''
		local UserListCache = {}
		local highestVersion = tonumber(SLE.version)
		local flag = 'SLE_DEV_SAYS'
		local addonChannel = 'GUILD'
		local addonTarget = ""
		local output = 'SAY'
		local text = ''
		local wtarget = ""
		local bnetP

		function SLE:delete(...)
			local _, id = ...
			id = tostring(id)
			bnettesttbl[id] = nil
		end
		SLE:RegisterEvent('BN_FRIEND_ACCOUNT_OFFLINE', 'delete')

		RegisterAddonMessagePrefix('SLE_DEV_INFO')

		local f = CreateFrame('Frame')
		f:RegisterEvent('CHAT_MSG_ADDON')
		f:RegisterEvent('BN_CHAT_MSG_ADDON')
		f:RegisterEvent('BN_FRIEND_ACCOUNT_ONLINE')
		f:RegisterEvent('PLAYER_ENTERING_WORLD')
		f:SetScript('OnEvent', function(self, event, prefix, message, channel, sender)
			if event == 'BN_FRIEND_ACCOUNT_ONLINE' or event == 'BN_FRIEND_ACCOUNT_OFFLINE' then
				SLE:GetBNetInfo()
			end

			if event == 'PLAYER_ENTERING_WORLD' then
				SLE:GetBNetInfo()
			end

			if prefix == 'SLE_DEV_INFO' then
				if event == 'CHAT_MSG_ADDON' or event == 'BN_CHAT_MSG_ADDON' then
					if not message:find("SLEinfo") then
						local userLevel, userClass, userName, userRealm, userVersion = strsplit('#', message)
						if (userName == E.myname and userRealm == E.myrealm) then return end;

						userVersion = tonumber(userVersion)

						if userVersion > highestVersion then
							highestVersion = userVersion
						end

						local id = #UserListCache + 1;

						for i=1,#UserListCache do
							if (UserListCache[i].userName == userName and UserListCache[i].userRealm == userRealm) then
								id = i;
								break;
							end
						end

						UserListCache[id] = {
							['userLevel'] = userLevel,
							['userClass'] = userClass,
							['userName'] = userName,
							['userRealm'] = userRealm,
							['userVersion'] = userVersion,
						}

						if (IsAddOnLoaded("ElvUI_Config")) then
							ACD:SelectGroup('ElvUI', 'sle', 'developer', 'userList')
						end
					else
						local _, numBNetOnline = BNGetNumFriends()
						for i = 1, numBNetOnline do
							local presenceID, presenceName, _, _, toon, _, _, _ = BNGetFriendInfo(i)
							message = message:gsub("SLEinfo", '')
							local pid = tonumber(message)
							if pid == presenceID then
								bnettesttbl[message] = presenceName;
							end
						end
					end
				end
			end
		end)

		local function configTable()
			E.Options.args.sle.args.developer = {
				order = 999,
				type = 'group',
				name = "Developer",
				childGroups = 'tab',
				args = {
					header = {
						order = 1,
						type = "header",
						name = "Version Control Panel",
					},
					testdesc = {
						order = 2,
						type = "description",
						name = "",
					},
					userList = {
						order = 3,
						type = "group",
						name = "User List",
						args = {
							listheader = {
								order = 1,
								type = "header",
								name = "S&L Users with Version # Installed",
							},
							List = {
								type = 'select',
								name = 'Choose channel to get S&L info from.',
								order = 2,
								get = function() return selectedChannel end,
								set = function(_, value)
									selectedChannel = value
								end,
								values = {
									[''] = ' ',
									['GUILD'] = 'Guild',
									['INSTANCE_CHAT'] = 'Instance',
									['PARTY'] = 'Party',
									['RAID'] = 'Raid',
									['BNET'] = 'BNet',
								},
							},
							submitbutton = {
								type = 'execute',
								order = 3,
								name = function()
									return selectedChannel ~= '' and "Update List" or "Clear List"
								end,
								func = function(info, value)
									UserListCache = {} -- Clear Cache

									if selectedChannel == 'BNET' then
										local _, numBNetOnline = BNGetNumFriends()
										for i = 1, numBNetOnline do
											local presenceID, _, _, _, _, _, client, isOnline = BNGetFriendInfo(i)
											if isOnline and client == BNET_CLIENT_WOW then
												BNSendGameData(presenceID, 'SLE_DEV_REQ', 'userlist')
											end
										end
									elseif selectedChannel ~= '' then
										SendAddonMessage('SLE_DEV_REQ', 'userlist', selectedChannel)
									end
								end,
							},
							Space = {
								type = 'description',
								name = ' ',
								order = 4,
							},
							userList = {
								type = 'group',
								name = function()
									return 'Userlist : '..selectedChannel
								end,
								order = 5,
								guiInline = true,
								args = {},
								hidden = function() return selectedChannel == '' end,
							},
						},
					},
					devdiaggroup = {
						order = 5,
						type = "group",
						name = "Tech and shit",
						args = {
							subgroup = {
								order = 1,
								type = "header",
								name = "Some tech stuff",
							},
							cpuprofiling = {
								order = 2,
								type = 'execute',
								name = "CPU Profiling",
								func = function() SetCVar("scriptProfile", GetCVar("scriptProfile") == "1" and 0 or 1); ReloadUI() end,
							},
						},
					},
					devgroupone = {
						order = 500,
						type = "group",
						name = "Test Group",
						args = {
							subgroup = {
								order = 1,
								type = "header",
								name = "Dafuq we have this?",
							},
						},
					},
				},
			}

			for i = 1, 40 do
				E.Options.args.sle.args.developer.args.userList.args.userList.args[tostring(i)] = {
					type = 'description',
					order = i,
					name = function()
						if UserListCache[i] then
							local Level = GetQuestDifficultyColor(UserListCache[i]['userLevel'])
							Level = format('|cff%02x%02x%02x%s|r', Level.r *255, Level.g *255, Level.b *255, UserListCache[i]['userLevel'])

							local ClassColor = '|c'..RAID_CLASS_COLORS[(UserListCache[i]['userClass'])]['colorStr']
							local UserName = ClassColor..UserListCache[i]['userName']..'|r'

							local UserRealm = UserListCache[i]['userRealm']

							local UserVersion = UserListCache[i]['userVersion']
							UserVersion = (UserVersion == highestVersion and '|cffceff00' or '|cffff5678')..UserVersion

							local Icon = '';
							local realm = UserRealm:gsub(' ','');
							if (SLE.SpecialChatIcons[realm] and SLE.SpecialChatIcons[realm][UserListCache[i]['userName']]) then
								Icon = SLE.SpecialChatIcons[realm][UserListCache[i]['userName']];
						
							end
							return Level..'  '..UserName.. '|cffffffff - '..UserRealm..' : '..UserVersion..Icon
						else
							return ' '
						end
					end,
					hidden = function() return not UserListCache[i] end,
				}
			end
		end

		table.insert(E.SLEConfigs, configTable)
	end
end
local f = CreateFrame("Frame", "SLE_Dev_load", UIParent)
f:RegisterEvent("PLAYER_ENTERING_WORLD")
f:SetScript("OnEvent", Login)