/*******************************************************************************
 * Copyright (c) 2011, 2016 Eurotech and/or its affiliates
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Eurotech
 *******************************************************************************/
package org.eclipse.kura.net;

import java.util.List;

import org.eclipse.kura.KuraException;
import org.eclipse.kura.net.modem.ModemDevice;
import org.eclipse.kura.net.wifi.WifiAccessPoint;

/**
 * The NetworkService allows to browse and configure the network interfaces of the system.
 * <br/>
 * NetworkService extends what is offered by the standard Java APIs by offering information 
 * like the NetworkInterface type - e.g. wired vs wireless vs modem - and additional information
 * regarding the address of a NetworkInterface - e.g. its getway address, DNS, and so on. 
 */
public interface NetworkService 
{
	/**
	 * Returns the overall state of the networking subsystem
	 */
	public NetworkState getState() throws KuraException;
	
	/**
	 * Returns the state of a specific network interface
	 */
	public NetInterfaceState getState(String interfaceName) throws KuraException;
	
	/**
	 * Gets the names of all the network interface attached to the system.
	 * @return the names of all interfaces regardless of 'up' status
	 */
	public List<String> getAllNetworkInterfaceNames() throws KuraException;
	
	/**
	 * Gets the names of all the network interface attached to the system.
	 * For each returned NetworkInterface, its currently active 
	 * InterfaceAddresses are returned. 
	 *  
	 * @return all NetworkInterfaces
	 */
	public List<NetInterface<? extends NetInterfaceAddress>> getNetworkInterfaces() throws KuraException;
	
	/**
	 * Returns the list of all available WifiAccessPoints as seen from the system.
	 * @return all access points accessible from the system. 
	 */
	public List<WifiAccessPoint> getAllWifiAccessPoints() throws KuraException;
	
	/**
	 * Returns the list of the WifiAccessPoints visible from the specified wifi network interface.
	 * If this wifiInterfaceName is in Master mode it will return a List with one WifiAccessPoint
	 * which is itself.
	 * @param wifiInterfaceName name of the interface used to scan for the available access points
	 * @return the list of the WifiAccessPoints visible from the specified wifi network interface.
	 */
	public List<WifiAccessPoint> getWifiAccessPoints(String wifiInterfaceName) throws KuraException;
	
	
	/**
	 * Return the active NetworkIntefaces which have active connections for the system.
	 * @return
	 */
	public List<NetInterface<? extends NetInterfaceAddress>> getActiveNetworkInterfaces() throws KuraException;
	
	public String getModemUsbPort(String interfaceName);
	
	public String getModemPppPort(ModemDevice modemDevice) throws KuraException;
}
