package io.v.todos.sharing;

import android.app.Fragment;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.annotation.Nullable;
import android.support.v7.widget.SwitchCompat;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.CompoundButton;
import android.widget.Toast;

import io.v.syncbase.Syncbase;
import io.v.syncbase.core.VError;
import io.v.todos.R;

/**
 * A fragment encapsulating menu options and functionality related to list sharing.
 */
public class NeighborhoodFragment extends Fragment
        implements SharedPreferences.OnSharedPreferenceChangeListener {
    public static final String
            FRAGMENT_TAG = NeighborhoodFragment.class.getSimpleName();

    private static final String PREF_ADVERTISE_NEIGHBORHOOD = "advertise neighborhood";

    private static SharedPreferences sPrefs;

    // This has to be a field because registerOnSharedPreferenceChangeListener does not keep a hard
    // reference to the listener, making it otherwise susceptible to garbage collection.
    private static final SharedPreferences.OnSharedPreferenceChangeListener sSharedPrefListener =
            new SharedPreferences.OnSharedPreferenceChangeListener() {
                @Override
                public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
                                                      String key) {
                    if (PREF_ADVERTISE_NEIGHBORHOOD.equals(key)) {
                        updateSharePresence();
                    }
                }
            };

    /**
     * Initializes advertisement of one's presence to the neighborhood and watches shared
     * preferences to toggle sharing on and off as the preference is changed.
     */
    public void initSharePresence(Context androidContext) {
        sPrefs = sPrefs != null ? sPrefs : PreferenceManager.getDefaultSharedPreferences(
                androidContext);

        sPrefs.registerOnSharedPreferenceChangeListener(sSharedPrefListener);
        updateSharePresence();
    }

    private static void updateSharePresence() {
        if (shouldAdvertise()) {
            try {
                if (!Syncbase.isAdvertisingLoggedInUserInNeighborhood()) {
                    Syncbase.advertiseLoggedInUserInNeighborhood();
                }
            } catch (VError vError) {
                Log.w(FRAGMENT_TAG, "Failed to advertise logged in user", vError);
            }
        } else if (Syncbase.isAdvertisingLoggedInUserInNeighborhood()) {
            Syncbase.stopAdvertisingLoggedInUserInNeighborhood();
        }
    }

    private static void setAdvertiseNeighborhood(boolean value) {
        sPrefs.edit().putBoolean(PREF_ADVERTISE_NEIGHBORHOOD, value).apply();
    }

    private static boolean shouldAdvertise() {
        return sPrefs.getBoolean(PREF_ADVERTISE_NEIGHBORHOOD, true);
    }

    private SwitchCompat mSwitch;

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.neighborhood, menu);
        MenuItem menuItem = menu.findItem(R.id.advertise_neighborhood);
        mSwitch = (SwitchCompat) menuItem.getActionView().
                findViewById(R.id.neighborhood_switch);
        mSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                setAdvertiseNeighborhood(isChecked);
            }
        });
        sPrefs = sPrefs != null ? sPrefs : PreferenceManager.getDefaultSharedPreferences
                (getActivity());
        sPrefs.registerOnSharedPreferenceChangeListener(this);
        updateAdvertiseNeighborhoodChecked();
    }

    @Override
    public void onDestroyOptionsMenu() {
        sPrefs.unregisterOnSharedPreferenceChangeListener(this);
    }

    @Override
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
        if (PREF_ADVERTISE_NEIGHBORHOOD.equals(key)) {
            updateAdvertiseNeighborhoodChecked();
        }
    }

    private static Boolean sLastToastCheck; // Used to track the last toasted value.

    private void updateAdvertiseNeighborhoodChecked() {
        boolean value = shouldAdvertise();
        mSwitch.setChecked(value);
        mSwitch.setThumbResource(value ?
                R.drawable.sharing_activated_0_5x :
                R.drawable.sharing_deactivated_0_5x);

        // If this was a change, then toast information to the user.
        if (sLastToastCheck == null || sLastToastCheck != value) {
            sLastToastCheck = value;
            Toast.makeText(getActivity(), value ?
                    R.string.presence_on : R.string.presence_off, Toast.LENGTH_SHORT).show();
        }
    }
}
