package eu.pretix.pretixdroid.ui;

import android.content.DialogInterface;
import android.os.Bundle;
import android.preference.CheckBoxPreference;
import android.preference.Preference;
import android.preference.PreferenceFragment;
import android.preference.SwitchPreference;
import android.support.annotation.RawRes;
import android.support.annotation.StringRes;
import android.support.v7.app.AlertDialog;
import android.text.Html;
import android.text.method.LinkMovementMethod;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

import com.joshdholtz.sentry.Sentry;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import eu.pretix.libpretixsync.db.QueuedCheckIn;

import eu.pretix.pretixdroid.AppConfig;
import eu.pretix.pretixdroid.PretixDroid;
import eu.pretix.pretixdroid.R;

public class SettingsFragment extends PreferenceFragment {

    private void resetApp() {
//        DaoSession daoSession = ((PretixDroid) getActivity().getApplication()).getDaoSession();
//        daoSession.getQueuedCheckInDao().deleteAll();
//        daoSession.getTicketDao().deleteAll();

        AppConfig config = new AppConfig(getActivity());
        config.resetEventConfig();
        Toast.makeText(getActivity(), R.string.reset_success, Toast.LENGTH_SHORT).show();
    }

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

        // Load the preferences from an XML resource
        addPreferencesFromResource(R.xml.preferences);

        Preference reset = (Preference) findPreference("action_reset");
        reset.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
            @Override
            public boolean onPreferenceClick(Preference preference) {
                long cnt = ((PretixDroid) getActivity().getApplication()).getData().count(QueuedCheckIn.class).get().value();
                if (cnt > 0) {
                    new AlertDialog.Builder(getActivity())
                            .setMessage(R.string.pref_reset_warning)
                            .setNegativeButton(getString(R.string.cancel), new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int whichButton) {
                                    // do nothing
                                }
                            })
                            .setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int whichButton) {
                                    resetApp();
                                }
                            }).create().show();

                } else {
                    resetApp();
                }
                return true;
            }
        });

        final Preference about = findPreference("action_about");
        about.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
            @Override
            public boolean onPreferenceClick(Preference preference) {
                asset_dialog(R.raw.about, R.string.about);
                return true;
            }
        });

        final CheckBoxPreference async = (CheckBoxPreference) findPreference("async");
        async.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
            @Override
            public boolean onPreferenceChange(Preference preference, Object newValue) {
                final AppConfig config = new AppConfig(getActivity());
                if (newValue instanceof Boolean && ((Boolean) newValue) != config.getAsyncModeEnabled()) {
                    final boolean isEnabled = (Boolean) newValue;
                    if (isEnabled) {
                        if (config.getApiVersion() < 3) {
                            new AlertDialog.Builder(getActivity())
                                    .setMessage(R.string.pref_async_not_supported)
                                    .setPositiveButton(getString(R.string.dismiss), new DialogInterface.OnClickListener() {
                                        @Override
                                        public void onClick(DialogInterface dialog, int whichButton) {
                                        }
                                    }).create().show();
                            return false;
                        }

                        new AlertDialog.Builder(getActivity())
                                .setTitle(R.string.pref_async)
                                .setMessage(R.string.pref_async_warning)
                                .setNegativeButton(getString(R.string.cancel), new DialogInterface.OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialog, int whichButton) {
                                    }
                                })
                                .setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialog, int whichButton) {
                                        config.setAsyncModeEnabled(true);
                                        async.setChecked(true);
                                    }
                                }).create().show();

                        return false;
                    }
                }
                return true;
            }
        });
    }

    private void asset_dialog(@RawRes int htmlRes, @StringRes int title) {
        final View view = LayoutInflater.from(getActivity()).inflate(R.layout.dialog_about, null, false);
        final AlertDialog dialog = new AlertDialog.Builder(getActivity())
                .setTitle(title)
                .setView(view)
                .setPositiveButton(R.string.dismiss, null)
                .create();

        TextView textView = (TextView) view.findViewById(R.id.aboutText);

        String text = "";

        StringBuilder builder = new StringBuilder();
        InputStream fis;
        try {
            fis = getResources().openRawResource(htmlRes);
            BufferedReader reader = new BufferedReader(new InputStreamReader(fis, "utf-8"));
            String line;
            while ((line = reader.readLine()) != null) {
                builder.append(line);
            }

            text = builder.toString();
            fis.close();
        } catch (IOException e) {
            Sentry.captureException(e);
            e.printStackTrace();
        }

        textView.setText(Html.fromHtml(text));
        textView.setMovementMethod(LinkMovementMethod.getInstance());

        dialog.show();
    }
}