local Jobs = {}
local LastTime = nil

function RunAt(h, m, cb)
	Jobs[#Jobs + 1] = {
		h = h,
		m = m,
		cb = cb
	}
end

function GetUnixTimestamp()
	return os.time()
end

function OnTime(time)
	for i = 1, #Jobs, 1 do
		local scheduledTimestamp = os.time({
			hour = Jobs[i].h,
			minute = Jobs[i].m,
			second = 0, -- Assuming tasks run at the start of the minute
			day = os.date('%d', time),
			month = os.date('%m', time),
			year = os.date('%Y', time)
		})

		if time >= scheduledTimestamp and (not LastTime or LastTime < scheduledTimestamp) then
			Jobs[i].cb(Jobs[i].h, Jobs[i].m)
		end
	end
end

function Tick()
	local time = GetUnixTimestamp()

	if not LastTime or os.date('%M', time) ~= os.date('%M', LastTime) then
		OnTime(time)
		LastTime = time
	end

	SetTimeout(60000, Tick)
end

LastTime = GetUnixTimestamp()

Tick()

AddEventHandler('cron:runAt', function(h, m, cb)
	RunAt(h, m, cb)
end)
