package cz.eutopia.snooperstopper;

import android.app.Activity;
import android.app.admin.DevicePolicyManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Handler;
import android.preference.Preference;
import android.preference.PreferenceFragment;
import android.preference.SwitchPreference;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    static final String TAG = MainActivity.class.getSimpleName();
    static final int ACTIVATION_REQUEST = 47; // identifies our request id
    DevicePolicyManager devicePolicyManager;
    ComponentName snooperStopperDeviceAdmin;
    SwitchPreference switchAdmin;
    ProgressBar progressBar;

    private Handler updateSwitchAdminHandler = new Handler();
    private Runnable updateSwitchAdminRunnable = new Runnable() {
        @Override
        public void run() {
            updateSwitchAdmin();
        }
    };

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

        // Use Toolbar instead of ActionBar
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        // Prepare ProgressBar
        progressBar = (ProgressBar) findViewById(R.id.progress_spinner);

        // Show app icon in Toolbar
        getSupportActionBar().setHomeButtonEnabled(true);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
        getSupportActionBar().setDisplayUseLogoEnabled(true);
        getSupportActionBar().setLogo(R.mipmap.ic_logo);

        PreferenceFragment preferenceFragment = (PreferenceFragment) getFragmentManager().findFragmentById(R.id.frag_settings);
        switchAdmin = (SwitchPreference) preferenceFragment.findPreference("pref_key_device_admin_enabled");
        switchAdmin.setOnPreferenceChangeListener(switchAdminOnChangeListener);

        // Initialize Device Policy Manager service and our receiver class
        devicePolicyManager = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
        snooperStopperDeviceAdmin = new ComponentName(this, SnooperStopperDeviceAdminReceiver.class);
    }

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

        new AsyncTask<Void, Void, Boolean>() {

            @Override
            protected void onPreExecute() {
                progressBar.setVisibility(View.VISIBLE);
            }

            @Override
            protected Boolean doInBackground(Void... params) {
                try {
                    boolean canGainSu = SuShell.canGainSu(getApplicationContext());
                    return canGainSu;
                } catch (Exception e) {
                    Log.e(TAG, "Error: " + e.getMessage(), e);
                    return false;
                }
            }

            @Override
            protected void onPostExecute(Boolean result) {
                progressBar.setVisibility(View.GONE);

                if (!result) {
                    Toast.makeText(MainActivity.this, R.string.cannot_get_su,
                                   Toast.LENGTH_LONG).show();
                    finish();
                }
            }
        }.execute();
    }

    Preference.OnPreferenceChangeListener switchAdminOnChangeListener = new Preference.OnPreferenceChangeListener() {
        @Override
        public boolean onPreferenceChange(Preference pref, Object newValue) {
            boolean isChecked = (boolean) newValue;
            if (isChecked) {
                Log.d(TAG, "switchAdmin.isChecked() == true");
                Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
                intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, snooperStopperDeviceAdmin);
                intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION,
                        "Monitors failed unlock attempts and shutdowns phone if limit is reached");
                startActivityForResult(intent, ACTIVATION_REQUEST);
            } else {
                Log.d(TAG, "switchAdmin.isChecked() == false");
                devicePolicyManager.removeActiveAdmin(snooperStopperDeviceAdmin);
                updateSwitchAdminHandler.postDelayed(updateSwitchAdminRunnable, 1000);
            }
            return true;
        }
    };

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

    public void updateSwitchAdmin() {
        if (devicePolicyManager.isAdminActive(snooperStopperDeviceAdmin)) {
            switchAdmin.setChecked(true);
        } else {
            switchAdmin.setChecked(false);
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode) {
            case ACTIVATION_REQUEST:
                if (resultCode == Activity.RESULT_OK) {
                    Log.i(TAG, "Administration enabled!");
                    switchAdmin.setChecked(true);
                } else {
                    Log.i(TAG, "Administration enable FAILED!");
                    switchAdmin.setChecked(false);
                }
                return;
        }
        super.onActivityResult(requestCode, resultCode, data);
    }
}