---@meta ev

--------------------------------------------------------------------------------
-- lua-ev/libev 事件循环模块
--------------------------------------------------------------------------------

---@alias ev_callback fun(loop:ev_loop, watcher:ev_watcher, revents:integer)
---@alias ev_timer_callback fun(loop:ev_loop, timer:ev_timer, revents:integer)
---@alias ev_io_callback fun(loop:ev_loop, io:ev_io, revents:integer)
---@alias ev_signal_callback fun(loop:ev_loop, signal:ev_signal, revents:integer)
---@alias ev_idle_callback fun(loop:ev_loop, idle:ev_idle, revents:integer)
---@alias ev_async_callback fun(loop:ev_loop, async:ev_async, revents:integer)
---@alias ev_child_callback fun(loop:ev_loop, child:ev_child, revents:integer)
---@alias ev_stat_callback fun(loop:ev_loop, stat:ev_stat, revents:integer)

---@class ev_loop*
local loop = {}

--- 判断是否为默认事件循环。
---@return boolean ok 是否默认 loop
function loop:is_default() end

--- 返回事件循环迭代次数。
---@return integer count 迭代次数
function loop:count() end

--- 返回事件循环迭代次数。
---@return integer count 迭代次数
function loop:iteration() end

--- 返回事件循环递归深度。
---@return integer depth 递归深度
function loop:depth() end

--- 返回当前 loop 时间戳。
---@return number seconds epoch 秒
function loop:now() end

--- 更新并返回当前 loop 时间戳。
---@return number seconds epoch 秒
function loop:update_now() end

--- 运行事件循环，直到没有活跃 watcher 或被 `unloop` 中断。
function loop:loop() end

--- 中断事件循环。
function loop:unloop() end

--- 返回当前使用的 libev backend id。
---@return integer backend_id backend id
function loop:backend() end

--- fork 后重新初始化 loop。
function loop:fork() end

---@class ev_watcher*
---@field [string] any watcher shadow table 字段
local watcher = {}

--- watcher 是否已经 start。
---@return boolean active 是否活跃
function watcher:is_active() end

--- watcher 是否有待处理事件。
---@return boolean pending 是否 pending
function watcher:is_pending() end

--- 清除 pending 事件并返回 revents。
---@param loop ev_loop 事件循环
---@return integer revents 事件位
function watcher:clear_pending(loop) end

--- 获取或设置 watcher 回调。
---@param new_callback? ev_callback 新回调
---@return ev_callback old_callback 原回调
function watcher:callback(new_callback) end

--- 获取或设置 watcher 优先级。
---@param new_priority? integer 新优先级，通常在 `ev.MINPRI` 和 `ev.MAXPRI` 之间
---@return integer old_priority 原优先级
function watcher:priority(new_priority) end

---@class ev_timer: ev_watcher
local timer = {}

--- 启动 timer watcher。
---@param loop ev_loop 事件循环
---@param is_daemon? boolean 是否不阻止 loop 退出
function timer:start(loop, is_daemon) end

--- 停止 timer watcher。
---@param loop ev_loop 事件循环
function timer:stop(loop) end

--- 重置 timer，下次触发间隔可选。
---@param loop ev_loop 事件循环
---@param repeat_seconds? number 新 repeat 秒数
function timer:again(loop, repeat_seconds) end

--- 清除 pending 事件并返回 revents。
---@param loop ev_loop 事件循环
---@return integer revents 事件位
function timer:clear_pending(loop) end

---@class ev_io: ev_watcher
local io = {}

--- 启动 IO watcher。
---@param loop ev_loop 事件循环
---@param is_daemon? boolean 是否不阻止 loop 退出
function io:start(loop, is_daemon) end

--- 停止 IO watcher。
---@param loop ev_loop 事件循环
function io:stop(loop) end

--- 返回创建 watcher 时绑定的文件描述符。
---@return integer fd 文件描述符
function io:getfd() end

---@class ev_signal: ev_watcher
local signal = {}

--- 启动 signal watcher。
---@param loop ev_loop 事件循环
---@param is_daemon? boolean 是否不阻止 loop 退出
function signal:start(loop, is_daemon) end

--- 停止 signal watcher。
---@param loop ev_loop 事件循环
function signal:stop(loop) end

---@class ev_idle: ev_watcher
local idle = {}

--- 启动 idle watcher。
---@param loop ev_loop 事件循环
---@param is_daemon? boolean 是否不阻止 loop 退出
function idle:start(loop, is_daemon) end

--- 停止 idle watcher。
---@param loop ev_loop 事件循环
function idle:stop(loop) end

---@class ev_async: ev_watcher
local async = {}

--- 启动 async watcher。
---@param loop ev_loop 事件循环
---@param is_daemon? boolean 是否不阻止 loop 退出
function async:start(loop, is_daemon) end

--- 停止 async watcher。
---@param loop ev_loop 事件循环
function async:stop(loop) end

--- 向 loop 发送 async 事件。
---@param loop ev_loop 事件循环
function async:send(loop) end

---@class ev_child_status*
---@field status integer 原始 wait status
---@field exited boolean 是否正常退出
---@field stopped boolean 是否停止
---@field signaled boolean 是否因信号终止
---@field exit_status? integer 退出码
---@field stop_signal? integer 停止信号
---@field term_signal? integer 终止信号

---@class ev_child: ev_watcher
local child = {}

--- 启动 child watcher。
---@param loop ev_loop 事件循环
---@param is_daemon? boolean 是否不阻止 loop 退出
function child:start(loop, is_daemon) end

--- 停止 child watcher。
---@param loop ev_loop 事件循环
function child:stop(loop) end

--- 返回被监听的 pid，0 表示任意 pid。
---@return integer pid pid
function child:getpid() end

--- 返回触发状态变化的 pid。
---@return integer rpid pid
function child:getrpid() end

--- 返回子进程状态信息。
---@return ev_child_status status 状态表
function child:getstatus() end

---@class ev_stat_attr*
---@field dev integer
---@field ino integer
---@field mode integer
---@field nlink integer
---@field uid integer
---@field gid integer
---@field rdev integer
---@field size integer
---@field atime integer
---@field mtime integer
---@field ctime integer

---@class ev_stat_data*
---@field path string 监听路径
---@field interval number 检查间隔
---@field attr ev_stat_attr 当前 stat 信息
---@field prev ev_stat_attr 上一次 stat 信息

---@class ev_stat: ev_watcher
local stat = {}

--- 启动 stat watcher。
---@param loop ev_loop 事件循环
---@param is_daemon? boolean 是否不阻止 loop 退出
function stat:start(loop, is_daemon) end

--- 停止 stat watcher。
---@param loop ev_loop 事件循环
function stat:stop(loop) end

--- 返回监听路径和 stat 数据。
---@return ev_stat_data data stat 数据
function stat:getdata() end

---@class ev_Loop*
---@field default ev_loop 默认事件循环
local Loop = {}

--- 创建新的非默认事件循环。
---@param flags? integer libev backend/flag 位，默认 EVFLAG_AUTO
---@return ev_loop loop 事件循环
function Loop.new(flags) end

Loop.default = loop

---@class ev_Timer*
local Timer = {}

--- 创建 timer watcher。
---@param callback ev_timer_callback 回调函数
---@param after_seconds number 首次触发秒数
---@param repeat_seconds? number 重复触发秒数；省略或 0 表示只触发一次
---@return ev_timer timer timer watcher
function Timer.new(callback, after_seconds, repeat_seconds) end

---@class ev_IO*
local IO = {}

--- 创建 IO watcher。
---@param callback ev_io_callback 回调函数
---@param fd integer 文件描述符
---@param revents integer `ev.READ`、`ev.WRITE` 或二者组合
---@return ev_io io IO watcher
function IO.new(callback, fd, revents) end

---@class ev_Signal*
local Signal = {}

--- 创建 signal watcher。
---@param callback ev_signal_callback 回调函数
---@param signal_number integer 信号编号
---@return ev_signal signal signal watcher
function Signal.new(callback, signal_number) end

---@class ev_Idle*
local Idle = {}

--- 创建 idle watcher。
---@param callback ev_idle_callback 回调函数
---@return ev_idle idle idle watcher
function Idle.new(callback) end

---@class ev_Async*
local Async = {}

--- 创建 async watcher。
---@param callback ev_async_callback 回调函数
---@return ev_async async async watcher
function Async.new(callback) end

---@class ev_Child*
local Child = {}

--- 创建 child watcher。
---@param callback ev_child_callback 回调函数
---@param pid integer 监听 pid，0 表示任意 pid
---@param trace boolean 是否监听停止/继续状态
---@return ev_child child child watcher
function Child.new(callback, pid, trace) end

---@class ev_Stat*
local Stat = {}

--- 创建 stat watcher。
---@param callback ev_stat_callback 回调函数
---@param path string 监听路径
---@param interval? number 检查间隔，默认由 libev 决定
---@return ev_stat stat stat watcher
function Stat.new(callback, path, interval) end

---@class ev*
---@field Loop ev_Loop
---@field Timer ev_Timer
---@field IO ev_IO
---@field Signal ev_Signal
---@field Idle ev_Idle
---@field Async ev_Async
---@field Child ev_Child
---@field Stat ev_Stat
---@field CHILD integer child 事件位
---@field IDLE integer idle 事件位
---@field ASYNC integer async 事件位
---@field MINPRI integer 最低 watcher 优先级
---@field MAXPRI integer 最高 watcher 优先级
---@field READ integer IO read 事件位
---@field SIGNAL integer signal 事件位
---@field STAT integer stat 事件位
---@field TIMEOUT integer timer timeout 事件位
---@field WRITE integer IO write 事件位
---@field SIGABRT integer
---@field SIGALRM integer
---@field SIGBUS integer
---@field SIGCHLD integer
---@field SIGCONT integer
---@field SIGFPE integer
---@field SIGHUP integer
---@field SIGINT integer
---@field SIGIO integer
---@field SIGIOT integer
---@field SIGKILL integer
---@field SIGPIPE integer
---@field SIGPOLL? integer
---@field SIGPROF integer
---@field SIGPWR? integer
---@field SIGQUIT integer
---@field SIGSEGV integer
---@field SIGSTKFLT? integer
---@field SIGSYS integer
---@field SIGTERM integer
---@field SIGTRAP integer
---@field SIGTSTP integer
---@field SIGTTIN integer
---@field SIGTTOU integer
---@field SIGURG integer
---@field SIGUSR1 integer
---@field SIGUSR2 integer
---@field SIGVTALRM integer
---@field SIGWINCH integer
---@field SIGXCPU integer
---@field SIGXFSZ integer
---@type ev*
local M = {}

M.Loop = Loop
M.Timer = Timer
M.IO = IO
M.Signal = Signal
M.Idle = Idle
M.Async = Async
M.Child = Child
M.Stat = Stat

M.CHILD = 0x00000800
M.IDLE = 0x00002000
M.ASYNC = 0x00080000
M.MINPRI = -2
M.MAXPRI = 2
M.READ = 0x01
M.SIGNAL = 0x00000400
M.STAT = 0x00001000
M.TIMEOUT = 0x00000100
M.WRITE = 0x02

M.SIGABRT = 6
M.SIGALRM = 14
M.SIGBUS = 10
M.SIGCHLD = 20
M.SIGCONT = 19
M.SIGFPE = 8
M.SIGHUP = 1
M.SIGINT = 2
M.SIGIO = 23
M.SIGIOT = 6
M.SIGKILL = 9
M.SIGPIPE = 13
M.SIGPOLL = 7
M.SIGPROF = 27
M.SIGQUIT = 3
M.SIGSEGV = 11
M.SIGSYS = 12
M.SIGTERM = 15
M.SIGTRAP = 5
M.SIGTSTP = 18
M.SIGTTIN = 21
M.SIGTTOU = 22
M.SIGURG = 16
M.SIGUSR1 = 30
M.SIGUSR2 = 31
M.SIGVTALRM = 26
M.SIGWINCH = 28
M.SIGXCPU = 24
M.SIGXFSZ = 25

--- 返回运行时 libev 版本。
---@return integer major 主版本
---@return integer minor 次版本
function M.version() end

--- 返回当前注册对象数量，主要用于测试泄漏。
---@return integer count 对象数量
function M.object_count() end

return M
