export interface Window {
    KioskMode: KioskModeInterface;
    RelayControl: RelayControlInterface;
}

export interface KioskOptions {
    safeBootManaged: boolean;
    addUserManaged: boolean;
    bluetoothManaged: boolean;
    adjustVolumeManaged: boolean;
    createWindowsManaged: boolean;
    keyguardManaged: boolean;
    statusBarManaged: boolean;
    packagesLockingManaged: boolean;
    allowedThirdPackages: String[];
    homeReceiverManaged: boolean;
}

export interface KioskModeInterface {
    lock(kioskOptions?: KioskOptions): never;

    unlock(kioskOptions?: KioskOptions): never;

    clearDeviceOwner(): never;
}

export interface RelayStatus {
    [key: string]: number;
    mode: number;
    timestamp: number;
    relayCount: number;
}

export interface RelayResult {
    relay?: number;
    state?: number;
    mode?: number;
    count?: number;
    hasAccess?: boolean;
    permissionsFixed?: boolean;
    message?: string;
    success: boolean;
}

export interface RelayControlInterface {
    turnOn(relayNumber: number, success?: (result: RelayResult) => void, error?: (error: string) => void): void;
    
    turnOff(relayNumber: number, success?: (result: RelayResult) => void, error?: (error: string) => void): void;
    
    setRelay(relayNumber: number, state: boolean | number, success?: (result: RelayResult) => void, error?: (error: string) => void): void;
    
    getStatus(success?: (status: RelayStatus) => void, error?: (error: string) => void): void;
    
    getMode(success?: (result: RelayResult) => void, error?: (error: string) => void): void;
    
    setMode(mode: number, success?: (result: RelayResult) => void, error?: (error: string) => void): void;
    
    getRelayCount(success?: (result: RelayResult) => void, error?: (error: string) => void): void;
    
    checkAccess(success?: (result: RelayResult) => void, error?: (error: string) => void): void;
    
    fixPermissions(success?: (result: RelayResult) => void, error?: (error: string) => void): void;
}

declare global {
    interface Window {
        RelayControl: RelayControlInterface;
    }
    
    const RelayControl: RelayControlInterface;
}
