GuildChat = {}

local LC = LibStub('libChat-1.0')
local LGI = LibStub("LibGuildInfo-1.0")
local LAM = LibStub("LibAddonMenu-1.0")

local AllianceColours = { ["Aldmeri Dominion"] = "|cffff00", ["Daggerfall Convenant"]= "|c4169E1", ["Ebonhart Pact"] = "|c8B0000"}
local ClassColours = {["Dragon Knight"] = "|cCA0000", ["Sorcerer"] = "|c0096FF", ["Nightblade"] = "|c9900F1", ["Templar"] = "|cEFEFEF"}

local ChannelInfo = ZO_ChatSystem_GetChannelInfo()
local CategoryMapping = ZO_ChatSystem_GetEventCategoryMappings()

function GuildChat:GetLevel(name)
	return LGI:GetLevelByMemberName(name) or 0
end

function GuildChat:GetClassColour(name)
	return ClassColours[LGI:GetClassNameByMemberName(name)] or "|cffffff"
end

function GuildChat:GetAtColour(name)
	return AllianceColours[LGI:GetAllianceNameByMemberName(name)] or "|cffffff"
end



function GuildChat:GetName(channelId, fromName, text)
	local channelInfo = ChannelInfo[channelId]
	if channelInfo.format ~= 1723 then return ZO_LinkHandler_CreatePlayerLink(fromName) end

	--if GuildChat:GetLevel(fromName) == 0 then return ZO_LinkHandler_CreatePlayerLink(fromName) end

	local r,g,b = GetChatCategoryColor(CategoryMapping[EVENT_CHAT_MESSAGE_CHANNEL][channelId])
	local baseColour = ZO_ColorDef:New(r, g, b, 1)

	local formattedName = GuildChat:GetAtColour(fromName) ..  "[" .. GuildChat:GetLevel(fromName) .. "]" .. "|r" ..
						  GuildChat:GetClassColour(fromName) ..  ZO_LinkHandler_CreatePlayerLink(fromName) ..  "|r"
	if GuildChat.settings.guildRank then
		formattedName = "[" .. LGI:GetGuildRankByMemberName(fromName) .. "]" .. formattedName
	end

	return formattedName
end

function GuildChat:Register()
	LC:registerName(function(...) return GuildChat:GetName(...) end)
end

function GuildChat:Loaded(...)
	local eventId, addonName = ...
	if addonName ~= "GuildChat" then return end

	local defaults = {
			["characterName"] = "account",
			["guildRank"] = false,
	}

	GuildChat.settings = ZO_SavedVars:NewAccountWide('GuildChat_Settings', 2, nil, defaults)
	local panel = LAM:CreateControlPanel("GuildChatMenu", "Guild Chat")

	LAM:AddHeader(panel, "GuildChatOptions", "Chat Options")
	LAM:AddDropdown(panel, "charName", "Set the name to be ",
						"Guild Chat can display Account or Character name",
						{"account", "character"}, function() return GuildChat.settings.characterName end,
						function(valueString) GuildChat.settings.characterName = valueString end)
	LAM:AddCheckbox(panel, "showGuildRank", "Show Guild Rank", "Include a rank indicator",
						function() return GuildChat.settings.guildRank end,
						function(value) GuildChat.settings.guildRank = not GuildChat.settings.guildRank end)
end

EVENT_MANAGER:RegisterForEvent("GuildChatLoaded", EVENT_ADD_ON_LOADED, function(...) GuildChat:Loaded(...) end)
EVENT_MANAGER:RegisterForEvent("GuildChatLoaded", EVENT_PLAYER_ACTIVATED, function(...) zo_callLater(GuildChat.Register, 5000) end)