import type { API, DynamicPlatformPlugin, Logging, PlatformAccessory } from 'homebridge';
import type { AugustPlatformConfig, credentials, device, devicesConfig, options } from './settings.js';
import August from 'august-yale';
import { ConnectivityManager } from './connectivity-manager.js';
/**
 * HomebridgePlatform
 * This class is the main constructor for your plugin, this is where you should
 * parse the user config and discover/register accessories with Homebridge.
 */
export declare class AugustPlatform implements DynamicPlatformPlugin {
    accessories: PlatformAccessory[];
    readonly api: API;
    readonly log: Logging;
    config: AugustPlatformConfig;
    platformConfig: AugustPlatformConfig;
    platformLogging: options['logging'];
    platformRefreshRate: options['refreshRate'];
    platformPushRate: options['pushRate'];
    platformUpdateRate: options['updateRate'];
    registeringDevice: boolean;
    debugMode: boolean;
    version: string;
    augustConfig?: August;
    connectivity?: ConnectivityManager;
    private readonly lockMechanisms;
    private pollTimer?;
    private normalizedCredentialsCache?;
    constructor(log: Logging, config: AugustPlatformConfig, api: API);
    /**
     * This function is invoked when homebridge restores cached accessories from disk at startup.
     * It should be used to setup event handlers for characteristics and update respective values.
     */
    configureAccessory(accessory: PlatformAccessory): Promise<void>;
    /**
     * Verify the config passed to the plugin is valid
     */
    verifyConfig(): Promise<void>;
    /**
     * This method looks to see if session is already Validate, if not then sends a validateCode and saves the installId.
     * After validateCode is saved to the config user must restart homebridge
     * this process then looks to see if session is already validated and if the validateCode in config;
     * if isValidated is false then it will validate iwth the validateCode and save isValidated as true in the config.json file
     * will also make the validateCode undefined
     */
    validated(): Promise<void>;
    augustCredentials(): Promise<void>;
    /**
     * Normalize credentials for August API compatibility
     * Handle country code variations that may cause 403 errors
     * Maps regional country codes to supported API endpoints
     */
    private normalizeCredentialsForApi;
    /**
     * Clear the normalized credentials cache
     * Should be called when credentials are updated
     */
    clearNormalizedCredentialsCache(): void;
    /**
     * Public method to get normalized credentials for use by device classes
     * Uses caching to avoid repeated normalization of the same credentials
     */
    getNormalizedCredentials(): Promise<credentials>;
    /**
     * Start the platform-level poll cycle. Iterates registered locks
     * SERIALLY (not in parallel) and short-circuits on the first failure.
     *
     * Why serial:
     *   - One outstanding request at a time on a healthy network is cheap
     *     enough (most cycles complete in <1s for a handful of locks) and
     *     avoids racing the August API.
     *   - On a failing network, a parallel cycle would produce N timeouts
     *     ~simultaneously, which is exactly the log-spam pattern the
     *     ConnectivityManager exists to prevent. Serial means one timeout,
     *     classified once, and the rest of the cycle aborts.
     *
     * Why short-circuit on first failure:
     *   - If the first call fails with a network error, the manager has
     *     already entered 'degraded' state and scheduled a probe. The
     *     remaining N-1 calls would all hit the same dead network and
     *     produce identical errors. Aborting the cycle is the correct
     *     thing to do.
     *
     * Why skip when offline:
     *   - The manager's state machine is already managing recovery via
     *     scheduled probes. Polling on top of that just wastes API calls
     *     and risks rate limiting.
     */
    startPolling(): void;
    /** Stop the platform poll cycle. Called from shutdown paths. */
    stopPolling(): void;
    pluginConfig(): Promise<{
        pluginConfig: any;
        currentConfig: any;
    }>;
    /**
     * This method is used to discover the your location and devices.
     */
    discoverDevices(): Promise<void>;
    protected Lock(device: device & devicesConfig): Promise<void>;
    registerDevice(device: device & devicesConfig): Promise<boolean>;
    externalOrPlatform(device: device & devicesConfig, accessory: PlatformAccessory): Promise<void>;
    externalAccessory(accessory: PlatformAccessory): Promise<void>;
    unregisterPlatformAccessories(existingAccessory: PlatformAccessory, device: device & devicesConfig): Promise<void>;
    /**
     * Tear down the LockMechanism for a given lockId, releasing its PubNub
     * subscription. Called when an accessory is unregistered (either via
     * explicit removal or excludeLockIds config).
     */
    private tearDownLockMechanism;
    getPlatformLogSettings(): Promise<void>;
    getPlatformRateSettings(): Promise<void>;
    getPlatformConfigSettings(): Promise<void>;
    /**
     * Asynchronously retrieves the version of the plugin from the package.json file.
     *
     * This method reads the package.json file located in the parent directory,
     * parses its content to extract the version, and logs the version using the debug logger.
     * The extracted version is then assigned to the `version` property of the class.
     *
     * @returns {Promise<void>} A promise that resolves when the version has been retrieved and logged.
     */
    getVersion(): Promise<void>;
    /**
     * Validate and clean a string value for a Name Characteristic.
     * @param displayName - The display name of the accessory.
     * @param name - The name of the characteristic.
     * @param value - The value to be validated and cleaned.
     * @returns The cleaned string value.
     */
    validateAndCleanDisplayName(displayName: string, name: string, value: string): Promise<string>;
    /**
     * If device level logging is turned on, log to log.warn
     * Otherwise send debug logs to log.debug
     */
    infoLog(...log: any[]): Promise<void>;
    successLog(...log: any[]): Promise<void>;
    debugSuccessLog(...log: any[]): Promise<void>;
    warnLog(...log: any[]): Promise<void>;
    debugWarnLog(...log: any[]): Promise<void>;
    errorLog(...log: any[]): Promise<void>;
    debugErrorLog(...log: any[]): Promise<void>;
    debugLog(...log: any[]): Promise<void>;
    loggingIsDebug(): Promise<boolean>;
    enablingPlatformLogging(): Promise<boolean>;
}
//# sourceMappingURL=Platform.HAP.d.ts.map