/**
 * Commissioning Manager
 *
 * Handles passcode generation, discriminator generation, credential persistence,
 * QR code rendering, commissioning event listeners, and commissioning file updates.
 */
import type { ServerNode } from '@matter/main';
import type { EventEmitter } from 'node:events';
import type { MatterServerConfig } from '../sharedTypes.js';
import type { CommissioningSnapshot, FabricManager } from './FabricManager.js';
export interface CommissioningInfo {
    qrCode?: string;
    manualPairingCode?: string;
    qrCodeUrl?: string;
}
export interface CommissioningDeps {
    config: MatterServerConfig;
    serverNode: ServerNode | null;
    matterStoragePath?: string;
    serialNumber?: string;
    emitter: EventEmitter;
    fabricManager: FabricManager;
}
export declare class CommissioningManager {
    passcode: number;
    discriminator: number;
    readonly vendorId: number;
    readonly productId: number;
    commissioningInfo: CommissioningInfo;
    private onFabricsChanged;
    private onCommissioned;
    private onDecommissioned;
    constructor();
    /**
     * Generate a secure random passcode
     * According to Matter spec, passcode must be:
     * - 8 digits (00000001 to 99999998)
     * - Not in the invalid list
     * - Not sequential or repeating patterns
     */
    generateSecurePasscode(): number;
    /**
     * Validate a passcode according to Matter specifications
     */
    isValidPasscode(passcode: number): boolean;
    /**
     * Generate a random discriminator
     * According to Matter spec, discriminator must be:
     * - 12 bits (0-4095)
     * - Should be random for security
     */
    generateRandomDiscriminator(): number;
    /**
     * Load or generate commissioning credentials (passcode and discriminator)
     * Reads/writes a simple credentials.json file in the bridge storage directory.
     */
    loadOrGenerateCredentials(matterStoragePath: string): Promise<void>;
    /**
     * Generate and display commissioning information
     */
    generateCommissioningInfo(deps: CommissioningDeps): Promise<void>;
    /**
     * Set up Matter.js commissioning event listeners
     */
    setupCommissioningEventListeners(deps: CommissioningDeps): void;
    /**
     * Remove Matter.js commissioning event listeners.
     *
     * Called from ServerLifecycle.cleanup() to release the closures that capture
     * deps (serverNode, fabricManager, emitter, matterStoragePath) and `this`.
     * Without this, the matter.js Observable retains the observer across stop()
     * cycles, holding the entire CommissioningDeps graph from GC.
     */
    teardownCommissioningEventListeners(serverNode: ServerNode | null): void;
    /**
     * Update commissioning info file when commissioning state changes.
     *
     * Pass a precomputed `snapshot` to avoid redundant fabric reads — each of
     * isCommissioned(), getCommissionedFabricCount(), and getFabricInfo() may
     * scan the matter storage directory synchronously, and they're called in
     * tight succession from the commissioning event handlers.
     */
    updateCommissioningFile(deps: CommissioningDeps, snapshot?: CommissioningSnapshot): Promise<void>;
}
//# sourceMappingURL=CommissioningManager.d.ts.map