export type Executor = 'Process' | 'Worker'

export interface ExecutorOptions {
    /**
     * 执行器存活时间（毫秒）。
     * 所有任务完成后，经过此时间未新任务则释放资源
     * @default 60000 (1分钟)
     */
    ttl?: number

    /**
     * 属性代理筛选器。
     * 返回 true 则代理该属性
     * @default (prop, value) => true
     */
    predicate?: (prop: string, value: unknown) => boolean

    /**
     * 日志目录路径（需确保有写入权限）
     * @remarks 与 `logFile` 同时设置时生效
     */
    logPath?: string

    /**
     * 日志文件名（无需后缀，自动追加 `.txt`）
     * @example "log" → 生成 `log.txt`
     * @remarks 与 `logPath` 同时设置时生效
     */
    logFile?: string

    /**
     * 代理对象的目标脚本路径（必须为绝对路径）
     * @required 当使用 `requireObject()` 时必须指定
     */
    scriptPath?: string

    /**
     * 元数据，可通过 `this._metadata` 在子进程/线程中访问
     */
    metedata?: Record<string, unknown>
}

/**
 * 异步代理对象类型
 * @remarks 所有被代理方法均返回 Promise，支持通过最后一个 `boolean` 参数控制同步/异步模式
 */
export interface AsyncProxy<T> {
    /** 终止执行器并释放资源 */
    _dispose: () => Promise<void>
    /** 原始对象的代理方法 */
    [key: string]: (...args: [...unknown[], boolean]) => Promise<unknown>
}

/**
 * 为对象创建跨进程/线程代理
 * @param object - 需代理的原始对象（需导出对象/函数）
 * @param executor - 执行器类型（进程或线程）
 * @param options - 配置项（必须提供 `scriptPath`）
 * @returns 异步代理对象
 */
declare function requireObject<T extends object>(
    object: T,
    executor: Executor,
    options: ExecutorOptions & { scriptPath: string }
): AsyncProxy<T>

/**
 * 加载脚本文件并创建跨进程/线程代理
 * @param scriptPath - 脚本绝对路径（需导出对象/函数）
 * @param executor - 执行器类型（进程或线程）
 * @param options - 配置项（可选提供 `scriptPath`）
 * @returns 异步代理对象
 */
declare function requireScript<T extends object>(
    scriptPath: string,
    executor: Executor,
    options?: ExecutorOptions
): AsyncProxy<T>

export { requireObject, requireScript }
