package com.yannik.anki;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.os.Environment;
import android.preference.EditTextPreference;
import android.preference.Preference;
import android.preference.PreferenceFragment;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
import android.widget.Toast;

import java.io.File;


public class SettingsActivity extends ActionBarActivity {
    static Animation rotation;
    static ImageView sendingIndicator;
    MessageReceiver messageReceiver;
    private boolean isRefreshing = false;

    private static void startRotation() {
        rotation.setRepeatCount(Animation.INFINITE);
        sendingIndicator.startAnimation(rotation);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        android.support.v7.app.ActionBar actionBar = getSupportActionBar();
        actionBar.setDisplayHomeAsUpEnabled(true);

        // Display the fragment as the main content
        getFragmentManager().beginTransaction()
                .replace(android.R.id.content, new SettingsFragment())
                .commit();

        IntentFilter messageFilter = new IntentFilter(Intent.ACTION_SEND);
        messageReceiver = new MessageReceiver();
        LocalBroadcastManager.getInstance(this).registerReceiver(messageReceiver,messageFilter);


    }

    @Override
    protected void onDestroy(){
        super.onDestroy();
        LocalBroadcastManager.getInstance(this).unregisterReceiver(messageReceiver);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        menu.clear();
        super.onCreateOptionsMenu(menu);
        //inflate a menu which shows the non-animated refresh icon
        getMenuInflater().inflate(R.menu.menu_settings, menu);

        if(rotation == null){
            rotation = AnimationUtils.loadAnimation(this, R.anim.refresh_animation);
            rotation.setRepeatCount(Animation.INFINITE);
        }

        MenuItem item = menu.findItem(R.id.sendIcon);
        item.setActionView(R.layout.action_bar_indeterminate_progress);
        sendingIndicator = (ImageView) item.getActionView().findViewById(R.id.loadingImageView);
        if (isRefreshing) {
            rotation.setRepeatCount(Animation.INFINITE);
            sendingIndicator.startAnimation(rotation);
        }
            if(rotation != null)rotation.setRepeatCount(0);
            item.getActionView().setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if(!isRefreshing) {
                        sendPreferencesToWatch();
                        isRefreshing = true;
                        rotation.setRepeatCount(Animation.INFINITE);
                        sendingIndicator.startAnimation(rotation);
                    }
                }
            });


        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();

        if (id == R.id.sendIcon) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    private void sendPreferencesToWatch() {
        Intent intent = new Intent(this, WearMessageListenerService.class);
        startService(intent);
    }

    public static class SettingsFragment extends PreferenceFragment {

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            addPreferencesFromResource(R.xml.activity_settings);

            NumberPickerPreference fontSizeNumberPicker = (NumberPickerPreference) this.findPreference(getResources().getString(R.string.font_size_key));
            NumberPickerPreference screenTimeoutNumberPicker = (NumberPickerPreference) this.findPreference(getResources().getString(R.string.screen_timeout));
            EditTextPreference mediaLocationDir = (EditTextPreference) this.findPreference(getResources().getString(R.string.media_folder_location));
            if (mediaLocationDir.getText() == null || mediaLocationDir.getText().isEmpty()) {
                mediaLocationDir.setText(Environment.getExternalStorageDirectory() + "/AnkiDroid/collection.media");
            }
            CardMedia.mediaFolder = mediaLocationDir.getText();

            SendToWatchWhenPreferencesChangeListener listener = new SendToWatchWhenPreferencesChangeListener();
            fontSizeNumberPicker.setOnPreferenceChangeListener(listener);
            screenTimeoutNumberPicker.setOnPreferenceChangeListener(listener);
            this.findPreference(getResources().getString(R.string.card_flip_animation_key)).setOnPreferenceChangeListener(listener);
            this.findPreference(getResources().getString(R.string.double_tap_key)).setOnPreferenceChangeListener(listener);
            this.findPreference(getResources().getString(R.string.play_sounds)).setOnPreferenceChangeListener(listener);
            this.findPreference(getResources().getString(R.string.ask_before_first_sound)).setOnPreferenceChangeListener(listener);
            this.findPreference(getResources().getString(R.string.day_mode)).setOnPreferenceChangeListener(listener);
            this.findPreference(getResources().getString(R.string.ambient_mode_key))
                    .setOnPreferenceChangeListener(listener);
            mediaLocationDir.setOnPreferenceChangeListener(listener);

        }

        class SendToWatchWhenPreferencesChangeListener implements Preference.OnPreferenceChangeListener {
            @Override
            public boolean onPreferenceChange(Preference preference, Object newValue) {


                if (preference.getKey().equals(getResources().getString(R.string.media_folder_location))) {
                    CardMedia.mediaFolder = (String) newValue;
                    if (!new File((String) newValue).exists()) {
                        Toast.makeText(getActivity(), "Folder does not exist", Toast.LENGTH_LONG).show();
                    }
                    return true;
                }

                ((SettingsActivity) getActivity()).sendPreferencesToWatch();
                SettingsActivity.startRotation();

                return true;
            }
        }
    }

    class MessageReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            if(intent.getIntExtra("status",-1337) != -1){
                isRefreshing = false;
                rotation.setRepeatCount(0);
            }
        }
    }
}