-- SPDX-License-Identifier: MIT
hexchat.register('SmartParts', '1', 'Intelligently hide parts, joins, modes, and nick changes')

local TIME_THRESHOLD = 60 * 5 -- in seconds

local function check_lasttalk (nick)
	local nick = hexchat.strip(nick)
	for user in hexchat.iterate('users') do
		if hexchat.nickcmp(nick, user.nick) == 0 then
			if os.time() - user.lasttalk > TIME_THRESHOLD then
				return hexchat.EAT_HEXCHAT
			else
				return hexchat.EAT_NONE
			end
		end
	end

	return hexchat.EAT_HEXCHAT
end

local function check_you (nick)
	return hexchat.nickcmp(hexchat.get_info('nick'), nick) == 0
end

local function check_notify (nick)
	local nick = hexchat.strip(nick)
	for user in hexchat.iterate('notify') do
		if user.nick == nick then
			return true
		end
	end

	return false
end


hexchat.hook_print('Join', function (args)
	if check_notify (args[1]) then
		return hexchat.EAT_NONE
	else
		return hexchat.EAT_HEXCHAT
	end
end, hexchat.PRI_LOW)

-- hexchat.hook_print('Change Nick', function (args)
-- 	if check_notify(args[1]) or check_notify(args[2]) then
-- 		return hexchat.EAT_NONE
-- 	end
-- 
-- 	return check_lasttalk(args[1])
-- end, hexchat.PRI_LOW)

hexchat.hook_print('Raw Modes', function (args)
	if check_you(args[1]) or check_notify(args[1]) then
		return hexchat.EAT_NONE
	end

	-- TODO: Parse targets

	return check_lasttalk(args[1])
end, hexchat.PRI_LOW)

for _, event in pairs({'Quit', 'Part', 'Part with Reason'}) do
	hexchat.hook_print(event, function (args)
		if check_notify(args[1]) then
			return hexchat.EAT_NONE
		end

		return check_lasttalk(args[1])
	end, hexchat.PRI_LOW)
end

for _, event in pairs({'Channel Operator', 'Channel Voices'}) do
	hexchat.hook_print(event, function (args)
		if check_you(args[1]) or check_you(args[2]) or check_notify(args[2]) then
			return hexchat.EAT_NONE
		end

		return check_lasttalk(args[2])
	end, hexchat.PRI_LOW)
end