/*
 * *
 *  * This file is part of QuickLyric
 *  * Copyright © 2017 QuickLyric SPRL
 *  *
 *  * QuickLyric is free software: you can redistribute it and/or modify
 *  * it under the terms of the GNU General Public License as published by
 *  * the Free Software Foundation, either version 3 of the License, or
 *  * (at your option) any later version.
 *  *
 *  * QuickLyric is distributed in the hope that it will be useful,
 *  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  * GNU General Public License for more details.
 *  * You should have received a copy of the GNU General Public License
 *  * along with QuickLyric.  If not, see <http://www.gnu.org/licenses/>.
 *
 */

package com.geecko.QuickLyric.fragment;

import android.app.NotificationManager;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.drawable.ColorDrawable;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.preference.Preference;
import android.preference.PreferenceFragment;
import android.preference.PreferenceManager;
import android.provider.Settings;
import android.text.format.DateFormat;
import android.util.TypedValue;
import android.view.View;

import com.cgollner.unclouded.preferences.SwitchPreferenceCompat;
import com.geecko.QuickLyric.App;
import com.geecko.QuickLyric.R;
import com.geecko.QuickLyric.broadcastReceiver.MusicBroadcastReceiver;
import com.geecko.QuickLyric.services.LyricsOverlayService;
import com.geecko.QuickLyric.utils.MediaControllerCallback;
import com.geecko.QuickLyric.utils.PermissionsChecker;
import com.geecko.QuickLyric.view.AppCompatListPreference;
import com.squareup.leakcanary.RefWatcher;
import com.wdullaer.materialdatetimepicker.time.RadialPickerLayout;
import com.wdullaer.materialdatetimepicker.time.TimePickerDialog;

import java.util.Arrays;

public class SettingsFragment extends PreferenceFragment implements
        Preference.OnPreferenceChangeListener, TimePickerDialog.OnTimeSetListener, DialogInterface.OnCancelListener {

    private static final String NIGHT_START_TIME_DIALOG_TAG = "StartPickerDialog";
    private static final String NIGHT_END_TIME_DIALOG_TAG = "EndPickerDialog";
    private int[] themes = new int[]{R.string.defaut_theme, R.string.red_theme,
            R.string.purple_theme, R.string.indigo_theme, R.string.green_theme,
            R.string.lime_theme, R.string.brown_theme, R.string.dark_theme};

    private int[] nightTimeStart = new int[]{42, 0};

    @Override
    public void onCreate(Bundle savedInstanceState) {
        setRetainInstance(true);
        setHasOptionsMenu(true);
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.preferences);
        SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getActivity());
        int themeNum = Integer.valueOf(sharedPref.getString("pref_theme", "0"));
        boolean isOverlayEnabled = sharedPref.getBoolean("pref_overlay", false);

        findPreference("pref_theme").setSummary(themes[themeNum]);
        findPreference("pref_theme").setOnPreferenceChangeListener(this);
        findPreference("pref_opendyslexic").setOnPreferenceChangeListener(this);
        findPreference("pref_night_mode").setOnPreferenceChangeListener(this);
        findPreference("pref_notifications").setOnPreferenceChangeListener(this);
        findPreference("pref_notifications").setEnabled(!isOverlayEnabled);
        findPreference("pref_notifications").setSummary(isOverlayEnabled ?
                R.string.pref_notification_sum_disabled : R.string.pref_notifications_sum);
        findPreference("pref_overlay").setOnPreferenceChangeListener(this);
        findPreference("pref_overlay_behavior").setOnPreferenceChangeListener(this);
        findPreference("pref_overlay_behavior").setEnabled(isOverlayEnabled);


        AppCompatListPreference notificationsPref = ((AppCompatListPreference) findPreference("pref_notifications"));
        CharSequence[] entries = notificationsPref.getEntries();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            notificationsPref.setDefaultValue("1");
            CharSequence[] values = notificationsPref.getEntryValues();
            notificationsPref.setEntries(Arrays.copyOfRange(entries, 1, 3));
            notificationsPref.setEntryValues(Arrays.copyOfRange(values, 1, 3));
        } else {
            entries[0] = entries[0].toString().replaceAll("\\s?\\(.*\\)", "");
            notificationsPref.setEntries(entries);
        }
    }

    public void onResume() {
        super.onResume();
    }

    @Override
    public boolean onPreferenceChange(Preference pref, Object newValue) {
        switch (pref.getKey()) {
            case "pref_theme":
                findPreference("pref_theme").setSummary(themes[Integer.valueOf((String) newValue)]);
                break;
            case "pref_notifications":
                if (newValue.equals("0")) {
                    ((NotificationManager) getActivity()
                            .getSystemService(Context.NOTIFICATION_SERVICE)).cancelAll();
                } else
                    broadcast();
                break;
            case "pref_night_mode":
                if ((Boolean) newValue) {
                    boolean twentyFourHourStyle = DateFormat.is24HourFormat(getActivity());
                    TimePickerDialog tpd = TimePickerDialog
                            .newInstance(this, 21, 0, twentyFourHourStyle);
                    tpd.setOnCancelListener(this);
                    tpd.setTitle(getActivity().getString(R.string.nighttime_start_dialog_title));
                    tpd.show(getFragmentManager(), NIGHT_START_TIME_DIALOG_TAG);
                } else {
                    this.onCancel(null);
                }
                break;
            case "pref_overlay":
                findPreference("pref_overlay_behavior").setEnabled((Boolean) newValue);
                findPreference("pref_notifications").setEnabled(!((Boolean) newValue));
                findPreference("pref_notifications").setSummary((Boolean) newValue ?
                        R.string.pref_notification_sum_disabled : R.string.pref_notifications_sum);
                if ((Boolean) newValue) {
                    PreferenceManager.getDefaultSharedPreferences(getActivity()).edit().putBoolean(pref.getKey(), (Boolean) newValue).apply();
                    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M || Settings.canDrawOverlays(getActivity())) {
                        broadcast();
                    } else {
                        final Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getActivity().getPackageName()));
                        getActivity().startActivity(intent);
                    }
                    PermissionsChecker.displayMIUIPopupPermission(getActivity());
                } else {
                    LyricsOverlayService.removeCustomFloatingView(getActivity());
                }
                break;
            case "pref_overlay_behavior":
                LyricsOverlayService.removeCustomFloatingView(getActivity());
                break;
        }
        return true;
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        if (this.isHidden())
            return;
        TypedValue typedValue = new TypedValue();
        view.getContext().getTheme().resolveAttribute(android.R.attr.colorBackground, typedValue, true);
        view.setBackgroundDrawable(new ColorDrawable(typedValue.data));
    }

    @Override
    public void onTimeSet(RadialPickerLayout radialPickerLayout, int h, int min) {
        if (nightTimeStart[0] >= 25) {
            nightTimeStart = new int[]{h, min};
            boolean twentyFourHourStyle = DateFormat.is24HourFormat(getActivity());
            TimePickerDialog tpd = TimePickerDialog
                    .newInstance(this, 6, 0, twentyFourHourStyle);
            tpd.setOnCancelListener(this);
            tpd.setTitle(getActivity().getString(R.string.nighttime_end_dialog_title));
            tpd.show(getFragmentManager(), NIGHT_END_TIME_DIALOG_TAG);
        } else {
            SharedPreferences current = getActivity().getSharedPreferences("night_time", Context.MODE_PRIVATE);
            current.edit().putInt("startHour", nightTimeStart[0])
                    .putInt("startMinute", nightTimeStart[1])
                    .putInt("endHour", h)
                    .putInt("endMinute", min)
                    .apply();

            nightTimeStart[0] = 42;
        }
    }

    @Override
    public void onHiddenChanged(boolean hidden) {
        super.onHiddenChanged(hidden);
        if (!hidden)
            this.onViewCreated(getView(), null);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        RefWatcher refWatcher = App.getRefWatcher(getActivity());
        refWatcher.watch(this);
    }

    @Override
    public void onCancel(DialogInterface dialog) {
        SharedPreferences current = getActivity().getSharedPreferences("night_time", Context.MODE_PRIVATE);
        current.edit().putInt("startHour", 42)
                .putInt("endHour", 45)
                .apply();
        ((SwitchPreferenceCompat) findPreference("pref_night_mode")).setChecked(false);
    }

    private void broadcast() {
        Intent localIntent = new Intent("com.android.music.metachanged");
        SharedPreferences current = getActivity().getSharedPreferences("current_music", Context.MODE_PRIVATE);
        String artist = current.getString("artist", "Michael Jackson");
        String track = current.getString("track", "Bad");
        boolean playing = current.getBoolean("playing", false);
        long position = MediaControllerCallback.getActiveControllerPosition(getActivity());
        localIntent.putExtra("artist", artist);
        localIntent.putExtra("track", track);
        localIntent.putExtra("playing", playing);
        localIntent.putExtra("duration", 600);
        if (position != -1)
            localIntent.putExtra("position", position);
        new MusicBroadcastReceiver().onReceive(getActivity(), localIntent);
    }
}