package de.lukaskoerfer.p2pchat;

import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.net.wifi.WpsInfo;
import android.net.wifi.p2p.WifiP2pConfig;
import android.net.wifi.p2p.WifiP2pDevice;
import android.net.wifi.p2p.WifiP2pDeviceList;
import android.net.wifi.p2p.WifiP2pManager;
import android.os.IBinder;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;

public class PeerActivity extends AppCompatActivity {

    private P2pChatApplication Application;

    private PeerDeviceAdapter peerDeviceAdapter;

    private Button btnSearch;
    private ListView listDevices;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.setContentView(R.layout.activity_peer);

        this.Application = (P2pChatApplication) this.getApplication();

        this.btnSearch = (Button)(findViewById(R.id.btnSearch));
        this.listDevices = (ListView)(findViewById(R.id.listDevices));

        this.peerDeviceAdapter = new PeerDeviceAdapter(this, new ArrayList<PeerDevice>());
        this.listDevices.setAdapter(this.peerDeviceAdapter);

        this.btnSearch.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                PeerActivity.this.startPeerDiscovery();
            }
        });

        this.listDevices.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                PeerDevice peerDevice = (PeerDevice) PeerActivity.this.peerDeviceAdapter.getItem(position);
                PeerActivity.this.connectPeer(peerDevice.getDevice());
            }
        });

    }

    private Intent generateServiceIntent() {
        Intent serviceIntent = new Intent(this, P2pChatService.class);
        serviceIntent.setAction("PEER_ACTIVITY");
        return serviceIntent;
    }

    @Override
    protected void onResume() {
        super.onResume();
        this.bindService(this.generateServiceIntent(), this.ServiceConn, Context.BIND_AUTO_CREATE);
    }

    @Override
    protected void onPause() {
        super.onPause();
        this.Binder.unregisterActivity();
        this.unbindService(this.ServiceConn);
    }

    private P2pChatService.PeerBinder Binder;

    private ServiceConnection ServiceConn = new ServiceConnection() {

        @Override
        public void onServiceConnected(ComponentName name, IBinder binder) {
            PeerActivity.this.Binder = (P2pChatService.PeerBinder) binder;
            PeerActivity.this.Binder.registerActivity(PeerActivity.this);
            PeerActivity.this.updateDevices();
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            PeerActivity.this.Binder = null;
        }
    };

    public void updateDevices() {
        if (this.Binder != null) {
            this.peerDeviceAdapter.updatePeerDevices(this.Binder.getDevices());
        }
    }

    private void startPeerDiscovery() {
        this.Application.P2pHandler.Manager.discoverPeers(this.Application.P2pHandler.Channel, new WifiP2pManager.ActionListener() {
            @Override
            public void onSuccess() {
                Toast.makeText(PeerActivity.this, "Started P2P search ...", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onFailure(int reason) {
                Toast.makeText(PeerActivity.this, "P2P search failed with code " + String.valueOf(reason), Toast.LENGTH_SHORT).show();
            }
        });
    }

    private void connectPeer(WifiP2pDevice peer) {
        WifiP2pConfig config = new WifiP2pConfig();
        config.deviceAddress = peer.deviceAddress;
        config.wps.setup = WpsInfo.PBC;
        this.Application.P2pHandler.Manager.connect(this.Application.P2pHandler.Channel, config, new WifiP2pManager.ActionListener() {
            @Override
            public void onSuccess() {
                Toast.makeText(PeerActivity.this, "Connecting to peer ...", Toast.LENGTH_SHORT).show();
            }
            @Override
            public void onFailure(int reason) {
                Toast.makeText(PeerActivity.this, "Peer connection failed with code " + Integer.toString(reason), Toast.LENGTH_SHORT).show();
            }
        });
    }

}