local Inviter = {
    started = false,
    message = "x",
    kickList = {}
}

function Inviter:Kick()
    if not Inviter.started then return end
    for name, data in pairs(Inviter.kickList) do
        if data ~= nil and GetTimeStamp() - data.added > LeoDolmenRunner.settings.inviter.kickDelay then
            for i = 1, GetGroupSize() do
                local tag = GetGroupUnitTagByIndex(i)
                if GetUnitName(tag) == name then
                    LeoDolmenRunner.log("Kicking " .. name)
                    GroupKick(tag)
                    break
                end
            end
            Inviter.kickList[name] = nil
        end
    end
end

function Inviter:CheckOfflines()
    if not Inviter.started then return end
    for i = 1, GetGroupSize() do
        local unitTag = GetGroupUnitTagByIndex(i)
        local name = GetUnitName(unitTag)
        if not IsUnitOnline(unitTag) and Inviter.kickList[name] == nil then
            LeoDolmenRunner.debug("Adding " .. name .. " to kick list")
            Inviter.kickList[name] = {
                unitTag = unitTag,
                added  = GetTimeStamp()
            }
        elseif IsUnitOnline(unitTag) and Inviter.kickList[name] ~= nil then
            LeoDolmenRunner.debug("Removing " .. name .. " from kick list, back online")
            Inviter.kickList[name] = nil
        end
    end
end

function Inviter:Update(tick)
    if not Inviter.started or not IsUnitSoloOrGroupLeader("player") or tick ~= 5 then return end

    self:CheckOfflines()
    self:Kick()
end

function Inviter:ChatMessage(type, from, message)
    if not Inviter.started or not IsUnitSoloOrGroupLeader("player") then return end

    if GetGroupSize() >= LeoDolmenRunner.settings.inviter.maxSize then return end

    if type ~= CHAT_CHANNEL_SAY and type ~= CHAT_CHANNEL_YELL and type ~= CHAT_CHANNEL_ZONE and type ~= CHAT_CHANNEL_ZONE_LANGUAGE_1 and
    type ~= CHAT_CHANNEL_ZONE_LANGUAGE_2 and type ~= CHAT_CHANNEL_ZONE_LANGUAGE_3 and type ~= CHAT_CHANNEL_ZONE_LANGUAGE_4 then return end

    if message ~= Inviter.message or from == nil or from == "" then return end

    LeoDolmenRunner.log(zo_strformat("Inviting <<1>>", from))
    from = from:gsub("%^.+", "")
    GroupInviteByName(from)
end

function Inviter:StartStop()
    if not Inviter.started then
        Inviter:Start()
    else
        Inviter:Stop()
    end
end

function Inviter:Stop()
    LeoDolmenRunner.log("Stopping auto invite")
    Inviter.started = false
    EVENT_MANAGER:UnregisterForEvent(LeoDolmenRunner.name, EVENT_CHAT_MESSAGE_CHANNEL)
    LeoDolmenRunnerWindowInviterPanelStartStopLabel:SetText("Start")
end

function Inviter:Start(message)
    if not IsUnitSoloOrGroupLeader("player") then
        LeoDolmenRunner.log("You need to be group leader to invite.")
        return
    end

    if message ~= nil then Inviter.message = message end

    LeoDolmenRunner.log("Starting auto invite. Listening to " .. Inviter.message)
    Inviter.started = true
    LeoDolmenRunnerWindowInviterPanelStartStopLabel:SetText("Stop")
    EVENT_MANAGER:RegisterForEvent(LeoDolmenRunner.name, EVENT_CHAT_MESSAGE_CHANNEL, function(event,...) Inviter:ChatMessage(...) end)
end

function Inviter:Initialize()
end

LeoDolmenRunner.inviter = Inviter