package org.bostwickenator.googlephotos;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.res.Resources;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

import com.github.ma1co.pmcademo.app.Logger;
@SuppressLint("MissingPermission")
public class WifiSetupActivity extends Activity {

    private ConnectivityManager connectivityManager;
    private WifiManager wifiManager;
    private TextView textViewWifiState;
    private BroadcastReceiver receiver;
    private Resources res;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_wifi_setup);
        res = getResources();

        AppInit.initApp();

        wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
        connectivityManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);

        if(hasConnection()){ //Short circuit everything if we have some kind of upstream connection. Useful in emulators
            startLoginActivity();
        } else {

            textViewWifiState = (TextView) findViewById(R.id.textViewWifiState);

            setWifiEnabled(true);

            receiver = new BroadcastReceiver() {
                @Override
                public void onReceive(Context context, Intent intent) {
                    updateWifiSwitch();
                }
            };

            findViewById(R.id.buttonWifiSettings).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Logger.info("starting wifi settings activity");
                    boolean wifiEnabled = isWifiEnabled();
                    setWifiEnabled(true);
                    startActivityForResult(new Intent("com.sony.scalar.app.wifisettings.WifiSettings"), wifiEnabled ? 1 : 0);
                }
            });
        }
    }

    private boolean hasConnection() {
        NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
        return activeNetworkInfo != null && activeNetworkInfo.isConnected();
    }

    @Override
    protected void onResume() {
        super.onResume();

        if(hasConnection()){ //Short circuit everything if we have some kind of upstream connection.
            startLoginActivity();
        } else {
            IntentFilter f = new IntentFilter();
            f.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
            f.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);
            f.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
            registerReceiver(receiver, f);
        }
    }

    @Override
    protected void onPause() {
        super.onPause();
        try {
            unregisterReceiver(receiver);
        } catch (Exception e){
            // noop
        }
    }

    private void setWifiEnabled(boolean enabled) {
        Logger.info("setting wifi enabled state to " + enabled);
        wifiManager.setWifiEnabled(enabled);
    }

    private boolean isWifiEnabled() {
        int state = wifiManager.getWifiState();
        return state == WifiManager.WIFI_STATE_ENABLING || state == WifiManager.WIFI_STATE_ENABLED;
    }

    private void updateWifiSwitch() {
        boolean wifiEnabled = isWifiEnabled();
        String summary;
        if (wifiEnabled) {
            NetworkInfo networkInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
            WifiInfo wifiInfo = wifiManager.getConnectionInfo();
            if (networkInfo.isConnected()) {
                summary = res.getString(R.string.connectionStateConnectedTo) + " " + wifiInfo.getSSID();
                startLoginActivity();
            } else {
                NetworkInfo.DetailedState state = WifiInfo.getDetailedStateOf(wifiInfo.getSupplicantState());
                switch (state) {
                    case SCANNING:
                        summary = res.getString(R.string.connectionStateWifiScanning);
                        break;
                    case AUTHENTICATING:
                    case CONNECTING:
                    case OBTAINING_IPADDR:
                        summary = res.getString(R.string.connectionStateConnecting);
                        break;
                    default:
                        summary = res.getString(R.string.connectionStateWifiEnabled);
                }
            }
        } else {
            summary = res.getString(R.string.connectionStateWifiDisabled);
        }
        textViewWifiState.setText(summary);
    }

    private void startLoginActivity(){
        try {
            unregisterReceiver(receiver);
        } catch (Exception e){
            // noop
        }
        this.startActivity(new Intent(this, LoginActivity.class));
        finish();
    }

    @Override
    protected void onActivityResult(int wifiEnabled, int result, Intent intent) {
        Logger.info("returned from wifi settings");
        super.onActivityResult(wifiEnabled, result, intent);
        setWifiEnabled(wifiEnabled == 1);
    }
}