ADGroupTool = {}

-- Written by M0R_Gaming

ADGroupTool.name = "AAGroupTool"
ADGroupTool.groupList = {}
ADGroupTool.adgttToggle = false
ADGroupTool.varversion = 1


ADGroupTool.DefaultSettings = {
	guildID = 341929,
	offCrownTimer = 600,
	offCrownTimerMin = 10,
	discordLink = "[Insert Discord Link Here]",
	discordInvite = "Come join us in discord! Even if you don't have a mic, it still helps us coordinate attacks! Come join us at",
	radius = 25500,
}

-- The range of a forward camp is 25500 units

function ADGroupTool.setTimer(minutes)
	if not minutes then
		d("Please provide a valid amount of time (in minutes)")
	else
		ADGroupTool.vars.offCrownTimerMin = tonumber(minutes)
		ADGroupTool.vars.offCrownTimer = 60*ADGroupTool.vars.offCrownTimerMin
		d("Pugs will be kicked after "..minutes.." minutes of not being on crown")
	end
end

function ADGroupTool.setDiscord(discord)
	ADGroupTool.vars.discordLink = discord
	d("Discord link set: "..ADGroupTool.vars.discordLink)
end

function ADGroupTool.setDiscordInv(discord)
	ADGroupTool.vars.discordInvite = discord
	d("Discord Invite Message set: "..ADGroupTool.vars.discordInvite)
end



function ADGroupTool.sendDiscord()
	local channel = CHAT_CHANNEL_PARTY
	local target = nil
	local message = ADGroupTool.vars.discordInvite.." "..ADGroupTool.vars.discordLink
	CHAT_SYSTEM:StartTextEntry(message, channel, target)
end






function ADGroupTool.startTimer()
	if ADGroupTool.adgttToggle then
		EVENT_MANAGER:UnregisterForUpdate("AD Group Tool SOC") --milliseconds
		EVENT_MANAGER:UnregisterForEvent("AD Group Tool SOC DC", EVENT_GROUP_MEMBER_LEFT)
		d("|cFFD700AD Group Tool|r: [Stay On Crown] module |cFF0000deactivated|r.")
		ADGroupTool.adgttToggle = false
		ADGroupTool.groupList = {}
	else
		EVENT_MANAGER:RegisterForUpdate("AD Group Tool SOC", 1000, ADGroupTool.groupTimer) --milliseconds
		EVENT_MANAGER:RegisterForEvent("AD Group Tool SOC DC", EVENT_GROUP_MEMBER_LEFT, ADGroupTool.SOCDC)
		d("|cFFD700AD Group Tool|r: [Stay On Crown] module |c00FF00activated|r.")
		ADGroupTool.adgttToggle = true
	end
end



-- Setting up Keybinds and Commands --

ZO_CreateStringId("SI_BINDING_NAME_ADGROUPTOOL_TOGGLE_SOC", "Toggle [Stay On Crown] Module")
ZO_CreateStringId("SI_BINDING_NAME_ADGROUPTOOL_POST_DISCORD", "Send Discord Message")
SLASH_COMMANDS["/stayoncrown"] = ADGroupTool.startTimer
SLASH_COMMANDS["/adtimerset"] = ADGroupTool.setTimer
SLASH_COMMANDS["/addiscord"] = ADGroupTool.sendDiscord
SLASH_COMMANDS["/adsetdiscord"] = ADGroupTool.setDiscord
SLASH_COMMANDS["/adsetdiscordinv"] = ADGroupTool.setDiscordInv






function ADGroupTool.groupTimer()

	local crown = GetGroupLeaderUnitTag()
	local crownWorld,crownX,crownY,crownZ = GetUnitWorldPosition(crown)


	for i = 1,GetGroupSize() do
		local unit = GetGroupUnitTagByIndex(i)
		local displayName = GetUnitDisplayName(unit)


		local unitWorld,unitX,unitY,unitZ = GetUnitWorldPosition(unit)
		local distance = math.sqrt( (crownX-unitX)^2 + (crownZ-unitZ)^2 )

		--d(displayName)
		--d(distance)

		if distance > ADGroupTool.vars.radius then

			if ADGroupTool.groupList[displayName] == nil then
				ADGroupTool.groupList[displayName] = 0
			else
				ADGroupTool.groupList[displayName] = ADGroupTool.groupList[displayName] + 1

				if ADGroupTool.groupList[displayName] > ADGroupTool.vars.offCrownTimer then
					ADGroupTool.groupList[displayName] = nil

					if GetGuildMemberIndexFromDisplayName(ADGroupTool.vars.guildID, displayName) == nil then

						if IsUnitGroupLeader('player') then
							GroupKick(unit)
							d("Kicked user "..displayName.." for not being on crown.")
							break
						else
							d("User "..displayName.." should be kicked for not being on crown.")
							break
						end

					else
						d("Guild Member "..displayName.." has not on crown for more than "..ADGroupTool.vars.offCrownTimerMin.." minutes.")
					end

				end

			end
		else
			ADGroupTool.groupList[displayName] = nil
		end
	end

end

-- Stay on Crown : Disconnect
function ADGroupTool.SOCDC(eventCode, characterName, reason, isLocalPlayer, isLeader, displayName, actionRequiredVote)
	--d("User "..displayName.." has left the group")
	if ADGroupTool.groupList[displayName] ~= nil then
		ADGroupTool.groupList[displayName] = nil
	end
end







-- Map Pins Module, some of the base code was taken from the sample code in LibMapPins-1.0.lua

--local fd = {}
local LMP = LibMapPins

local fds = {
	{name="Castle Bloodmayne",x=0.57472223043442,y=0.76157778501511},
	{name="Castle Black Boot",x=0.40770667791367,y=0.76615333557129},
	{name="Castle Faregyl",x=0.49927777051926,y=0.67549556493759},
	{name="Castle Alessia",x=0.57074224948883,y=0.557148873806},
	{name="Castle Roebeck",x=0.41256666183472,y=0.56352001428604},
	{name="Castle Brindle",x=0.23523999750614,y=0.56775331497192},
	{name="Fort Ash",x=0.33939111232758,y=0.4275244474411},
	{name="Fort Aleswell",x=0.40584889054298,y=0.28369554877281},
	{name="Drakelow Keep",x=0.76734441518784,y=0.58292669057846},
}


local function setRally(pin)
	local _, pinTag = pin:GetPinTypeAndTag()
	local x = pinTag.x
	local y = pinTag.y
	LibMapPing:SetMapPing(MAP_PIN_TYPE_RALLY_POINT,MAP_TYPE_LOCATION_CENTERED,x,y)
end


local LMB_handler = {
	{
		name = "Set Rally to Front Door",
		callback = setRally,
		show = function(pin) return true end,
	}
}


--sample layout
local pinLayoutData  = {
   level = 5,
   texture = "esoui/art/icons/mapkey/mapkey_ava_milegate_passable.dds",
   size = 10,
}

--tooltip creator
local pinTooltipCreator = {
	creator = function(pin)
		local _, pinTag = pin:GetPinTypeAndTag()
		InformationTooltip:AddLine(pinTag.name.." Front Door")
	end,
	tooltip = ZO_MAP_TOOLTIP_MODE.INFORMATION,
}


function ADGroupTool.disableDoors()
	LibMapPins:Disable("Front Doors")
end
EVENT_MANAGER:RegisterForEvent("Cyro Transis Active FD", EVENT_START_FAST_TRAVEL_KEEP_INTERACTION, ADGroupTool.disableDoors)


function ADGroupTool.enableDoors()
	LibMapPins:Enable("Front Doors")
end
EVENT_MANAGER:RegisterForEvent("Cyro Transis Deactive FD", EVENT_END_FAST_TRAVEL_KEEP_INTERACTION, ADGroupTool.enableDoors)



local function createDoors()
	for _, pinInfo in ipairs(fds) do
		LMP:CreatePin("Front Doors", pinInfo, pinInfo.x, pinInfo.y)
	end
end


local function fdcallback()
	if not LMP:IsEnabled("Front Doors") then return end
	local zone, subzone = LMP:GetZoneAndSubzone()
	if not (zone == "cyrodiil") then return end
	if not (subzone == "ava_whole") then return end
	--d("IN CYRO!")
	createDoors()
end



function ADGroupTool.getCoords(Name)
	local channel = CHAT_CHANNEL_PARTY
	local target = nil
	local x, y, map = GetMapPlayerPosition('player')
	local message = "{name=\""..Name.."\",x="..x..",y="..y.."},"
	CHAT_SYSTEM:StartTextEntry(message, channel, target)
end

SLASH_COMMANDS["/getcoords"] = ADGroupTool.getCoords

--LMP:AddPinFilter(FDPinType)



-- The following was adapted from https://wiki.esoui.com/Circonians_Stamina_Bar_Tutorial#lua_Structure

-------------------------------------------------------------------------------------------------
--  OnAddOnLoaded  --
-------------------------------------------------------------------------------------------------
function ADGroupTool.OnAddOnLoaded(event, addonName)
	if addonName ~= ADGroupTool.name then return end

	ADGroupTool:Initialize()
end

-------------------------------------------------------------------------------------------------
--  Initialize Function --
-------------------------------------------------------------------------------------------------
function ADGroupTool:Initialize()
	ADGroupTool.vars = ZO_SavedVars:NewAccountWide("ADVars", ADGroupTool.varversion, nil, ADGroupTool.DefaultSettings)
	ADGroupTool.createSettings()

	LibMapPins:AddPinType("Front Doors", fdcallback, nil, pinLayoutData, pinTooltipCreator)
	LibMapPins:AddPinFilter("Front Doors")
	LibMapPins:SetClickHandlers("Front Doors", LMB_handler)

	d("The Artaeum Group Tool addon has been moved to a new esoui entry. It will still work, but I recommend uninstalling this addon and installing the new Artaeum Group Tool on esoui.")

	EVENT_MANAGER:UnregisterForEvent(ADGroupTool.name, EVENT_ADD_ON_LOADED)
end

-------------------------------------------------------------------------------------------------
--  Register Events --
-------------------------------------------------------------------------------------------------
EVENT_MANAGER:RegisterForEvent(ADGroupTool.name, EVENT_ADD_ON_LOADED, ADGroupTool.OnAddOnLoaded)