'''
Wifi Facade.
=============

The :class:`Wifi` is to provide access to the wifi of your mobile/ desktop
devices.

It currently supports `connecting`, `disconnecting`, `scanning`, `getting
available wifi network list` and `getting network information`.

Simple examples
---------------

To enable/ turn on wifi scanning::

    >>> from plyer import wifi
    >>> wifi.start_scanning()

Once the wifi is enabled/ turned on, then this command starts to scan
all the nearby available wifi networks.

To get network info::

    >>> from plyer import wifi
    >>> wifi.start_scanning()
    >>> return wifi.get_network_info(name)

Returns network details of the network who's name/ssid is provided in the
`name` parameter.

To connect to a network::

    >>> from plyer import wifi
    >>> wifi.start_scanning()
    >>> wifi.connect(network, parameters)

This connects to the network who's name/ssid is provided under `network`
parameter and along with other necessary methods for connection
which depends upon platform to platform.

please visit following files for more details about requirements of
`paramaters` argument in `connect` method:

    plyer/platforms/win/wifi.py
    plyer/platforms/macosx/wifi.py
    plyer/platforms/win/wifi.py

To disconnect from wifi::

    >>> from plyer import wifi
    >>> wifi.disconnect()

This disconnects your device from any wifi network.

To get available wifi networks::

    >>> from plyer import wifi
    >>> wifi.start_scanning()
    >>> return wifi.get_available_wifi()

This returns all the available wifi networks near the device.

Supported Platforms
-------------------
Windows, OS X, Linux

Ex: 6
----------

from plyer import wifi
wifi.enable()

This enables wifi device.

Ex: 7
----------

from plyer import wifi
wifi.disable()

This disable wifi device
'''


class Wifi(object):
    '''
    Wifi Facade.
    '''

    def is_enabled(self):
        '''
        Return enabled status of WiFi hardware.
        '''
        return self._is_enabled()

    def is_connected(self, interface=None):
        '''
        Return connection state of WiFi interface.

        .. versionadded:: 1.4.0
        '''
        return self._is_connected(interface=interface)

    @property
    def interfaces(self):
        '''
        List all available WiFi interfaces.

        .. versionadded:: 1.4.0
        '''

        raise NotImplementedError()

    def start_scanning(self, interface=None):
        '''
        Turn on scanning.
        '''
        return self._start_scanning(interface=interface)

    def get_network_info(self, name):
        '''
        Return a dictionary of secified network.
        '''
        return self._get_network_info(name=name)

    def get_available_wifi(self):
        '''
        Returns a list of all the available wifi.
        '''
        return self._get_available_wifi()

    def connect(self, network, parameters, interface=None):
        '''
        Method to connect to some network.
        '''
        self._connect(
            network=network,
            parameters=parameters,
            interface=interface
        )

    def disconnect(self, interface=None):
        '''
        To disconnect from some network.
        '''
        self._disconnect(interface=interface)

    def enable(self):
        '''
        Wifi interface power state is set to "ON".
        '''
        self._enable()

    def disable(self):
        '''
        Wifi interface power state is set to "OFF".
        '''
        self._disable()

    # private

    def _is_enabled(self):
        raise NotImplementedError()

    def _is_connected(self, interface=None):
        raise NotImplementedError()

    def _start_scanning(self, interface=None):
        raise NotImplementedError()

    def _get_network_info(self, **kwargs):
        raise NotImplementedError()

    def _get_available_wifi(self):
        raise NotImplementedError()

    def _connect(self, **kwargs):
        raise NotImplementedError()

    def _disconnect(self, interface=None):
        raise NotImplementedError()

    def _enable(self):
        raise NotImplementedError()

    def _disable(self):
        raise NotImplementedError()
