package de.tudarmstadt.informatik.hostage.sync.wifi_direct;

import android.app.Activity;
import android.content.Context;
import android.content.IntentFilter;
import android.net.wifi.WifiManager;
import android.net.wifi.p2p.WifiP2pDevice;
import android.net.wifi.p2p.WifiP2pManager;

/**
 * Created by Julien on 07.01.2015.
 */
public class WiFiP2pEventHandler implements WifiP2pManager.ChannelListener {

    /**
     * The WiFiP2pEventListener informs about all wifi direct changes.
     */
    public interface WiFiP2pEventListener extends WiFiP2pBroadcastReceiver.WiFiP2pBroadcastListener{
         public void onConnectionLost();
    }

    private WifiP2pManager manager;

    private boolean retryChannel = false;

    private final IntentFilter intentFilter = new IntentFilter();
    private WifiP2pManager.Channel channel;
    private WiFiP2pBroadcastReceiver receiver = null;

    private WiFiP2pEventListener eventListener;

    private Activity activity;


    public WiFiP2pEventHandler(Activity activity, WiFiP2pEventListener listener){
        this.eventListener = listener;
        this.activity = activity;
        intentFilter.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION);
        intentFilter.addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION);
        intentFilter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION);
        intentFilter.addAction(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION);

        manager = (WifiP2pManager) activity.getSystemService(Context.WIFI_P2P_SERVICE);
        channel = manager.initialize(activity, activity.getMainLooper(), this);
    }

    public void setOnRetryIfTheChannelIsLost(boolean shouldRetry){
        this.retryChannel = shouldRetry;
    }
    public boolean isRetryingIfTheChannelIsLost(){
        return this.retryChannel;
    }

    /**
     * Call this method if the app comes back to foreground. E.g. in the onResume from the activity.
     */
    public void startService() {
        if (receiver == null){
            receiver = new WiFiP2pBroadcastReceiver(manager, channel, this.eventListener);
            activity.registerReceiver(receiver, intentFilter);
        }
    }

    /**
     * Call this method to disabled wifi direct while the app is in the background.  E.g. in the onPause from the activity.
     */
    public void stopService() {
        if (receiver != null) {
            activity.unregisterReceiver(receiver);
            receiver = null;
        }
    }

    @Override
    public void onChannelDisconnected() {
        // we will try once more
        if (manager != null && !retryChannel) {
            retryChannel = true;
            manager.initialize(this.activity, this.activity.getMainLooper(), this);
            receiver = new WiFiP2pBroadcastReceiver(manager, channel, this.eventListener);
            activity.registerReceiver(receiver, intentFilter);
        } else {
            this.eventListener.onConnectionLost();
        }
    }

    /**
     * Connect your device to the given device.
     * @param device
     */
    public void connect(WifiP2pDevice device){
        if (this.receiver != null && device != null) {
            this.receiver.connect(device);
        }
    }

    /**
     * Disconnect from the connected wifi group.
     */
    public void disconnect() {
        if (this.receiver != null)
            this.receiver.disconnect();
    }

    /**
     * Discover all available wifi direct device in the current environment.
     */
    public void discoverDevices(){
        if (this.receiver != null)
            this.receiver.discoverDevices();
    }
}
