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

local GuildChat = {}

local characterNameMenuOptions =
{
	[1] = "@account",
	[2] = "character",
	[3] = "character@account",
}

local colorOptions =
{
	[1] = "Alliance",
	[2] = "Class",
	[3] = "None",
	[4] = "Custom1",
	[5] = "Custom2",
	[6] = "Custom3",
	[7] = "Custom4",
}

local Addon =
{
    Name = "GuildChat",
    NameSpaced = "Guild Chat",
    Author = "CrazyDutchGuy & Wobin",
    Version = "4.4",
    Defaults = {
		characterName = characterNameMenuOptions[1],
		guildRank = false,
		colors =
		{
			["Aldmeri Dominion"] = "ffff00",
			["Daggerfall Convenant"]= "4169E1",
			["Ebonhart Pact"] = "8B0000",
			["Dragon Knight"] = "CA0000",
			["Sorcerer"] = "0096FF",
			["Nightblade"] = "9900F1",
			["Templar"] = "EFEFEF",
			["Custom1"] = "FFFFFF",
			["Custom2"] = "FFFFFF",
			["Custom3"] = "FFFFFF",
			["Custom4"] = "FFFFFF",
		},
		["coloring"] =
		{
			["@account"] = colorOptions[2],
			["character"] = colorOptions[2],
			["guildRank"] = colorOptions[3],
			["level"] = colorOptions[1],
		},
		characterLevel = true,
	}
}


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 GuildChat.settings.colors[LGI:GetClassNameByMemberName(name)]
end

function GuildChat:GetAtColour(name)
	return GuildChat.settings.colors[LGI:GetAllianceNameByMemberName(name)]
end

local function getSavedColor(tableEntry,name)
	if GuildChat.settings.coloring[tableEntry] == colorOptions[1] then
		if GuildChat:GetAtColour(name) then	return "|c" .. GuildChat:GetAtColour(name) end
	elseif GuildChat.settings.coloring[tableEntry] == colorOptions[2] then
		if GuildChat:GetClassColour(name) then return "|c" .. GuildChat:GetClassColour(name) end
	elseif GuildChat.settings.coloring[tableEntry] == colorOptions[3] then
		return ""
	elseif GuildChat.settings.coloring[tableEntry] == colorOptions[4] or
	       GuildChat.settings.coloring[tableEntry] == colorOptions[5] or
	       GuildChat.settings.coloring[tableEntry] == colorOptions[6] or
	       GuildChat.settings.coloring[tableEntry] == colorOptions[7] then
		return "|c" .. GuildChat.settings.colors[GuildChat.settings.coloring[tableEntry]]
	end
	return ""
end

function GuildChat:GetCharacterNameLink(name)
	local memberInfo = LGI:GetGuildMemberByMemberName(name)
	local characterName = nil
	local characterLink = ""

	if memberInfo then characterName = memberInfo.characterName end
	if characterName then characterLink = ZO_LinkHandler_CreatePlayerLink(characterName) end

	if GuildChat.settings.characterName == characterNameMenuOptions[1] then
		return getSavedColor("@account", name) .. ZO_LinkHandler_CreatePlayerLink(name) .. "|r"
	elseif GuildChat.settings.characterName == characterNameMenuOptions[2] then
		return getSavedColor("character", name) .. characterLink .. "|r"
	elseif GuildChat.settings.characterName == characterNameMenuOptions[3] then
		return getSavedColor("character", name) .. characterLink .. "|r" .. getSavedColor("@account", name) .. ZO_LinkHandler_CreatePlayerLink(name) .. "|r"
	end
	return ""
end

function GuildChat:GetName(channelId, fromName, text)
	if not LGI:GetGuildMemberByMemberName(fromName) then return fromName end -- For whispers and tells from people not in one of your guilds

	local formattedName = ""

	if GuildChat.settings.guildRank then formattedName = formattedName .. getSavedColor("guildRank", fromName) .. "[" .. LGI:GetGuildRankByMemberName(fromName) .. "]" .. "|r" end
	if GuildChat.settings.characterLevel then formattedName = formattedName .. getSavedColor("level", fromName) .. "[" .. GuildChat:GetLevel(fromName) .. "]" .. "|r" end
	formattedName = formattedName .. GuildChat:GetCharacterNameLink(fromName)

	return formattedName
end

function GuildChat:Register()
	LC:registerName(function(...) return GuildChat:GetName(...) end)
	EVENT_MANAGER:UnregisterForEvent(Addon.Name, EVENT_PLAYER_ACTIVATED )
end

local function RGBtoHEX(r,g,b,a)
	-- We can't have chat strings with alpha channels
	--return string.format("%.2x%.2x%.2x%.2x", math.floor(a * 255),math.floor(r * 255), math.floor(g * 255), math.floor(b * 255))
	return string.format("%.2x%.2x%.2x", math.floor(r * 255), math.floor(g * 255), math.floor(b * 255))
end

local function HEXtoRGB(hex)
    local a, r, g, b

    if(string.len(hex) == 8)
    then
        a, r, g, b = tonumber("0x"..string.sub(hex, 1, 2)) / 255, tonumber("0x"..string.sub(hex, 3, 4)) / 255, tonumber("0x"..string.sub(hex, 5, 6)) / 255, tonumber("0x"..string.sub(hex, 7, 8)) / 255
    elseif(string.len(hex) == 6)
    then
        a, r, g, b = 1, tonumber("0x"..string.sub(hex, 1, 2)) / 255, tonumber("0x"..string.sub(hex, 3, 4)) / 255, tonumber("0x"..string.sub(hex, 5, 6)) / 255
    end

    if(a)
    then
        return r, g, b, a
    end

end

local function createLAM2Panel()
    local panelData =
    {
        type = "panel",
        name = Addon.NameSpaced,
        displayName = "|cFFFFB0" .. Addon.NameSpaced .. "|r",
        author = Addon.Author,
        version = Addon.Version,
    }

    local optionsData = {}

    table.insert(optionsData, { type = "header", name = "Chat Options", })
    table.insert(optionsData, { type = "dropdown", name = "Set the name to be", tooltip = "Guild Chat can display Account and/or Character name", choices = characterNameMenuOptions, getFunc = function() return GuildChat.settings.characterName end, setFunc = function(value) GuildChat.settings.characterName = value end, })
    table.insert(optionsData, { type = "checkbox", name = "Show Guild Rank", nil, getFunc = function() return GuildChat.settings.guildRank end, setFunc = function(value) GuildChat.settings.guildRank = value end, })
    table.insert(optionsData, { type = "checkbox", name = "Show Character Level", nil, getFunc = function() return GuildChat.settings.characterLevel end, setFunc = function(value) GuildChat.settings.characterLevel = value end, })
    table.insert(optionsData, { type = "header", name = "Coloring Options", })
    table.insert(optionsData, { type = "dropdown", name = "Account Name", nil, choices = colorOptions, getFunc = function() return GuildChat.settings.coloring["@account"] end, setFunc = function(value) GuildChat.settings.coloring["@account"] = value end, })
    table.insert(optionsData, { type = "dropdown", name = "Character Name", nil, choices = colorOptions, getFunc = function() return GuildChat.settings.coloring["character"] end, setFunc = function(value) GuildChat.settings.coloring["character"] = value end, })
    table.insert(optionsData, { type = "dropdown", name = "Character Level", nil, choices = colorOptions, getFunc = function() return GuildChat.settings.coloring["level"] end, setFunc = function(value) GuildChat.settings.coloring["level"] = value end, })
    table.insert(optionsData, { type = "dropdown", name = "Guild Ranking", nil, choices = colorOptions, getFunc = function() return GuildChat.settings.coloring["guildRank"] end, setFunc = function(value) GuildChat.settings.coloring["guildRank"] = value end, })
    table.insert(optionsData, { type = "header", name = "Faction Colors", })
    table.insert(optionsData, { type = "colorpicker", name = "Aldmeri Dominion", tooltip = "Aldmeri Dominion Color.", getFunc = function() return HEXtoRGB(GuildChat.settings.colors["Aldmeri Dominion"]) end, setFunc = function(r,g,b,a) GuildChat.settings.colors["Aldmeri Dominion"] = RGBtoHEX(r,g,b,a) end, })
    table.insert(optionsData, { type = "colorpicker", name = "Daggerfall Convenant", tooltip = "Daggerfall Convenant Color.", getFunc = function() return HEXtoRGB(GuildChat.settings.colors["Daggerfall Convenant"]) end, setFunc = function(r,g,b,a) GuildChat.settings.colors["Daggerfall Convenant"] = RGBtoHEX(r,g,b,a) end, })
    table.insert(optionsData, { type = "colorpicker", name = "Ebonhart Pact", tooltip = "Ebonhart Pact Color.", getFunc = function() return HEXtoRGB(GuildChat.settings.colors["Ebonhart Pact"]) end, setFunc = function(r,g,b,a) GuildChat.settings.colors["Ebonhart Pact"] = RGBtoHEX(r,g,b,a) end, })
    table.insert(optionsData, { type = "header", name = "Class Colors", })
    table.insert(optionsData, { type = "colorpicker", name = "Dragon Knight", tooltip = "Dragon Knight Color.", getFunc = function() return HEXtoRGB(GuildChat.settings.colors["Dragon Knight"]) end, setFunc = function(r,g,b,a) GuildChat.settings.colors["Dragon Knight"] = RGBtoHEX(r,g,b,a) end, })
    table.insert(optionsData, { type = "colorpicker", name = "Sorcerer", tooltip = "Sorcerer Color.", getFunc = function() return HEXtoRGB(GuildChat.settings.colors["Sorcerer"]) end, setFunc = function(r,g,b,a) GuildChat.settings.colors["Sorcerer"] = RGBtoHEX(r,g,b,a) end, })
    table.insert(optionsData, { type = "colorpicker", name = "Nightblade", tooltip = "Nightblade Color.", getFunc = function() return HEXtoRGB(GuildChat.settings.colors["Nightblade"]) end, setFunc = function(r,g,b,a) GuildChat.settings.colors["Nightblade"] = RGBtoHEX(r,g,b,a) end, })
    table.insert(optionsData, { type = "colorpicker", name = "Templar", tooltip = "Templar Color.", getFunc = function() return HEXtoRGB(GuildChat.settings.colors["Templar"]) end, setFunc = function(r,g,b,a) GuildChat.settings.colors["Templar"] = RGBtoHEX(r,g,b,a) end, })
    table.insert(optionsData, { type = "header", name = "Custom Colors", })
    table.insert(optionsData, { type = "colorpicker", name = "Custom #1", tooltip = "Custom #1 Color.", getFunc = function() return HEXtoRGB(GuildChat.settings.colors["Custom1"]) end, setFunc = function(r,g,b,a) GuildChat.settings.colors["Custom1"] = RGBtoHEX(r,g,b,a) end, })
    table.insert(optionsData, { type = "colorpicker", name = "Custom #2", tooltip = "Custom #2 Color.", getFunc = function() return HEXtoRGB(GuildChat.settings.colors["Custom2"]) end, setFunc = function(r,g,b,a) GuildChat.settings.colors["Custom2"] = RGBtoHEX(r,g,b,a) end, })
    table.insert(optionsData, { type = "colorpicker", name = "Custom #3", tooltip = "Custom #3 Color.", getFunc = function() return HEXtoRGB(GuildChat.settings.colors["Custom3"]) end, setFunc = function(r,g,b,a) GuildChat.settings.colors["Custom3"] = RGBtoHEX(r,g,b,a) end, })
    table.insert(optionsData, { type = "colorpicker", name = "Custom #4", tooltip = "Custom #4 Color.", getFunc = function() return HEXtoRGB(GuildChat.settings.colors["Custom4"]) end, setFunc = function(r,g,b,a) GuildChat.settings.colors["Custom4"] = RGBtoHEX(r,g,b,a) end, })

   	LAM2:RegisterAddonPanel(Addon.Name.."LAM2Options", panelData)
    LAM2:RegisterOptionControls(Addon.Name.."LAM2Options", optionsData)
end

function GuildChat:EVENT_ADD_ON_LOADED(eventId, addonName)
	if addonName ~= Addon.Name then return end

	GuildChat.settings = ZO_SavedVars:NewAccountWide('GuildChat_Settings', 4, nil, Addon.Defaults)

	createLAM2Panel()

	EVENT_MANAGER:UnregisterForEvent( Addon.Name, EVENT_ADD_ON_LOADED )
end

EVENT_MANAGER:RegisterForEvent(Addon.Name, EVENT_ADD_ON_LOADED, function(...) GuildChat:EVENT_ADD_ON_LOADED(...) end)
EVENT_MANAGER:RegisterForEvent(Addon.Name, EVENT_PLAYER_ACTIVATED, function(...) zo_callLater(GuildChat.Register, 5000) end)