/**
 * 蓝牙"碰一碰"对外类型定义
 */
/** 扫描到的蓝牙设备（仅声明用得到的字段，避免污染） */
export interface BluetoothDeviceInfo {
    deviceId: string;
    RSSI: number;
    name?: string;
    localName?: string;
    advertisData?: ArrayBuffer;
    advertisServiceUUIDs?: string[];
    serviceData?: Record<string, ArrayBuffer>;
    [key: string]: any;
}
/** 启动失败时通过 onError 抛出的错误信息 */
export interface BluetoothBumpError {
    errCode?: number;
    errMsg?: string;
    raw?: any;
}
/**
 * 匹配模式：
 *   - 'simple' ：默认行为。扫到对方且 RSSI 达标即触发（单向发现，简单快速）。
 *   - 'mutual' ：前端自撮合。双向互认后才触发：
 *       我广播里带"我看到的对方 ID"，对方广播里也带"它看到的对方 ID"；
 *       当双方广播里携带的 peerId 都指向对方时，才算配对成功。
 */
export type BluetoothBumpMode = 'simple' | 'mutual';
/** 广播载荷（mutual 模式）：固定长度 13 字节，myTempId|seenPeerId */
export interface BluetoothBumpPayload {
    /** 发送端自己的临时 ID（6 位大写） */
    myTempId: string;
    /** 发送端当前"看到的对方 ID"，未看到时为 '------' */
    seenPeerId: string;
}
/** BluetoothBump 构造选项 */
export interface BluetoothBumpOptions {
    /** 服务 UUID，两端必须一致 */
    serviceUuid?: string;
    /** 特征 UUID（仅外围模式使用） */
    characteristicUuid?: string;
    /** RSSI 阈值，超过此值视为"碰到了" */
    rssiThreshold?: number;
    /** 同一设备的去重冷却时间 */
    cooldownMs?: number;
    /** 成功触发后保持广播的时长（让对方也能扫到自己） */
    lingerBeforeStopMs?: number;
    /** iOS 兜底轮询间隔 */
    pollIntervalMs?: number;
    /** 隐私协议弹窗内容（不传用默认文案） */
    privacyContent?: string;
    /**
     * 匹配模式，默认 'simple'（保持向后兼容）。
     * 选 'mutual' 开启前端自撮合（双向互认后才触发 onBump）。
     */
    mode?: BluetoothBumpMode;
    /** mutual 模式：候选 peer 信息的有效期（毫秒），过期则从候选池移除 */
    peerTtlMs?: number;
    /** mutual 模式：更新自己广播里 seenPeerId 的最小间隔（毫秒），防抖 */
    advertiseUpdateThrottleMs?: number;
    /**
     * 业务回调：碰到对方时触发
     *   - peerDeviceId：扫描层的设备地址（iOS 是本机视角的 UUID，Android 是 MAC）。
     *     ⚠️ 这个值是"扫描者本地"视角的，A 拿到的对方 deviceId 与 B 自己的 deviceId 不一定相同，
     *     不能用它跟对方的 myTempId 直接对比。
     *   - peerTempId：对方写在广播 payload 里的 myTempId（6 位字符串）。
     *     这个值是"对方应用层产生的"，A 看到的 peerTempId 与 B 的 myTempId **一定一致**，
     *     适合两台手机做配对核对（"我方 ID" vs "对方 ID"）。
     *     若对方广播解析失败则为空字符串。
     */
    onBump?: (peerDeviceId: string, rssi: number, dev: BluetoothDeviceInfo, peerTempId: string) => void;
    /** 业务回调：启动失败时触发 */
    onError?: (err: BluetoothBumpError) => void;
    /** 业务回调：日志/状态变化（用于打日志或 UI 更新） */
    onLog?: (msg: string, data?: any) => void;
    /** 业务回调：每次扫到设备（不论是否碰到）时触发，用于调试/UI 展示 */
    onDeviceFound?: (dev: BluetoothDeviceInfo) => void;
}
/** 触发碰一碰的判定参数（纯函数 shouldTriggerBump 使用） */
export interface ShouldTriggerBumpParams {
    rssi: number;
    threshold: number;
    lastBumpTime: number;
    now: number;
    cooldownMs: number;
}
