package cf.playhi.freezeyou;

import android.app.ActivityManager;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
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.preference.PreferenceScreen;
import android.provider.Settings;
import android.widget.ListView;

import androidx.annotation.Nullable;

import net.grandcentrix.tray.AppPreferences;

import java.io.File;

import cf.playhi.freezeyou.utils.DataStatisticsUtils;
import cf.playhi.freezeyou.utils.DevicePolicyManagerUtils;
import cf.playhi.freezeyou.utils.OneKeyListUtils;

import static cf.playhi.freezeyou.PreferenceSupport.initSummary;
import static cf.playhi.freezeyou.PreferenceSupport.updatePrefSummary;
import static cf.playhi.freezeyou.VersionUtils.checkUpdate;
import static cf.playhi.freezeyou.VersionUtils.getVersionName;
import static cf.playhi.freezeyou.utils.AccessibilityUtils.openAccessibilitySettings;
import static cf.playhi.freezeyou.utils.AlertDialogUtils.buildAlertDialog;
import static cf.playhi.freezeyou.utils.FileUtils.deleteAllFiles;
import static cf.playhi.freezeyou.utils.MoreUtils.requestOpenDonateWebSite;
import static cf.playhi.freezeyou.utils.MoreUtils.requestOpenWebSite;
import static cf.playhi.freezeyou.utils.ToastUtils.showToast;

public class SettingsFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener {


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

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

        if (getVersionName(getActivity()).contains("g")) {
            ((PreferenceScreen) findPreference("more")).removePreference(findPreference("donate"));
        }
        if (DevicePolicyManagerUtils.isDeviceOwner(getActivity())) {
            ((PreferenceScreen) findPreference("dangerZone")).removePreference(findPreference("clearAllUserData"));
        }
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            ((PreferenceScreen) findPreference("backgroundService")).removeAll();
            ((PreferenceScreen) findPreference("root")).removePreference(findPreference("backgroundService"));
        }
        initSummary(getPreferenceScreen());
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getActivity());
        if (!sp.getBoolean("displayListDivider", false)) {
            ListView lv = getActivity().findViewById(android.R.id.list);
            if (lv != null) {
                lv.setDivider(getResources().getDrawable(R.color.realTranslucent));
                lv.setDividerHeight(2);
            }
        }
    }

    @Override
    public void onResume() {
        super.onResume();
        PreferenceManager.getDefaultSharedPreferences(getActivity()).registerOnSharedPreferenceChangeListener(this);
    }

    @Override
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String s) {
        final AppPreferences appPreferences = new AppPreferences(getActivity());
        SettingsUtils.syncAndCheckSharedPreference(
                getActivity().getApplicationContext(),
                getActivity(), sharedPreferences, s, appPreferences);
        updatePrefSummary(findPreference(s));
    }

    @Override
    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
        String key = preference.getKey();
        if (key != null) {
            switch (key) {
                case "clearAllCache":
                    try {
                        getActivity().getSharedPreferences("NameOfPackages", Context.MODE_PRIVATE).edit().clear().apply();
                        deleteAllFiles(getActivity().getCacheDir(), false);
                        deleteAllFiles(getActivity().getExternalCacheDir(), false);
                        deleteAllFiles(new File(getActivity().getFilesDir() + "/icon"), false);
                        showToast(getActivity(), R.string.success);
                    } catch (Exception e) {
                        e.printStackTrace();
                        showToast(getActivity(), R.string.failed);
                    }
                    break;
                case "clearNameCache":
                    getActivity().getSharedPreferences("NameOfPackages", Context.MODE_PRIVATE).edit().clear().apply();
                    showToast(getActivity(), R.string.success);
                    break;
                case "clearIconCache":
                    try {
                        deleteAllFiles(new File(getActivity().getFilesDir() + "/icon"), false);
                        deleteAllFiles(new File(getActivity().getCacheDir() + "/icon"), false);
                        showToast(getActivity(), R.string.success);
                    } catch (Exception e) {
                        e.printStackTrace();
                        showToast(getActivity(), R.string.failed);
                    }
                    break;
                case "checkUpdate":
                    checkUpdate(getActivity());
                    break;
                case "helpTranslate":
                    requestOpenWebSite(getActivity(), "https://crwd.in/freezeyou");
                    break;
                case "donate":
                    requestOpenDonateWebSite(getActivity());
                    break;
                case "thanksList":
                    requestOpenWebSite(getActivity(), "https://freezeyou.playhi.net/thanks.html");
                    break;
                case "configureAccessibilityService":
                    openAccessibilitySettings(getActivity());
                    break;
                case "faq":
                    requestOpenWebSite(getActivity(), "https://zidon.net/zh-CN/faq/");
                    break;
                case "uninstall":
                    Intent uninstall =
                            new Intent(
                                    Intent.ACTION_DELETE,
                                    Uri.parse("package:cf.playhi.freezeyou")
                            ).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    getActivity().startActivity(uninstall);
                    break;
                case "deleteAllScheduledTasks":
                    buildAlertDialog(getActivity(), android.R.drawable.ic_dialog_alert, R.string.askIfDel, R.string.caution)
                            .setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    File file;
                                    for (String name : new String[]{"scheduledTasks", "scheduledTriggerTasks"}) {
                                        file = getActivity().getApplicationContext().getDatabasePath(name);
                                        if (file.exists())
                                            file.delete();
                                    }
                                }
                            })
                            .setNegativeButton(R.string.no, new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {

                                }
                            })
                            .create().show();
                    break;
                case "clearAllUserData":
                    buildAlertDialog(getActivity(), R.mipmap.ic_launcher_new_round, R.string.clearAllUserData, R.string.notice)
                            .setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    ActivityManager activityManager = (ActivityManager) getActivity().getSystemService(Context.ACTIVITY_SERVICE);
                                    if (activityManager != null && Build.VERSION.SDK_INT >= 19) {
                                        try {
                                            showToast(getActivity(), activityManager.clearApplicationUserData() ? R.string.success : R.string.failed);
                                        } catch (Exception e) {
                                            e.printStackTrace();
                                            showToast(getActivity(), R.string.failed);
                                        }
                                    } else {
                                        showToast(getActivity(), R.string.sysVerLow);
                                    }
                                }
                            })
                            .setNegativeButton(R.string.no, null)
                            .create().show();
                    break;
                case "manageIpaAutoAllow":
                    getActivity().startActivity(
                            new Intent(getActivity(), UriAutoAllowManageActivity.class)
                                    .putExtra("isIpaMode", true)
                    );
                    break;
                case "notificationBar_more":
                    if (Build.VERSION.SDK_INT >= 26) {
                        startActivity(
                                new Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS)
                                        .putExtra(
                                                Settings.EXTRA_APP_PACKAGE,
                                                getActivity().getPackageName()
                                        )
                        );
                    } else {
                        startActivity(
                                new Intent(
                                        Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
                                        Uri.parse("package:" + getActivity().getPackageName())
                                )
                        );
                    }
                    break;
                case "clearUninstalledPkgsInOKFFList":
                    if (OneKeyListUtils.removeUninstalledFromOneKeyList(getActivity(),
                            getString(R.string.sAutoFreezeApplicationList))) {
                        showToast(getActivity(), R.string.success);
                    } else {
                        showToast(getActivity(), R.string.failed);
                    }
                    break;
                case "clearUninstalledPkgsInOKUFList":
                    if (OneKeyListUtils.removeUninstalledFromOneKeyList(getActivity(),
                            getString(R.string.sOneKeyUFApplicationList))) {
                        showToast(getActivity(), R.string.success);
                    } else {
                        showToast(getActivity(), R.string.failed);
                    }
                    break;
                case "clearUninstalledPkgsInFOQList":
                    if (OneKeyListUtils.removeUninstalledFromOneKeyList(getActivity(),
                            getString(R.string.sFreezeOnceQuit))) {
                        showToast(getActivity(), R.string.success);
                    } else {
                        showToast(getActivity(), R.string.failed);
                    }
                    break;
                case "backupAndRestore":
                    startActivity(new Intent(getActivity(), BackupMainActivity.class));
                    break;
                case "howToUse":
                    requestOpenWebSite(getActivity(), "https://zidon.net/zh-CN/guide/how-to-use.html");
                    break;
                case "resetFreezeTimes":
                    askIfResetTimes("ApplicationsFreezeTimes");
                    break;
                case "resetUFTimes":
                    askIfResetTimes("ApplicationsUFreezeTimes");
                    break;
                case "resetUseTimes":
                    askIfResetTimes("ApplicationsUseTimes");
                    break;
                default:
                    break;
            }
        }
        return super.onPreferenceTreeClick(preferenceScreen, preference);
    }

    private void askIfResetTimes(final String dbName) {
        buildAlertDialog(getActivity(), android.R.drawable.ic_dialog_alert, R.string.askIfDel, R.string.caution)
                .setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        DataStatisticsUtils.resetTimes(getActivity(), dbName);
                    }
                })
                .setNegativeButton(R.string.no, null)
                .create().show();
    }

//    private void copyAllFiles(File file, String destination) throws IOException {
//        if (file.exists()) {
//            if (file.isFile()) {
//                if (new File(destination).getParentFile().exists()) {
//                    if (!new File(destination).getParentFile().mkdirs())
//                        throw new IOException("Cannot make dirs for " + destination);
//                }
//                if (!new File(destination).exists())
//                    if (!new File(destination).createNewFile())
//                        throw new IOException("Cannot create file " + destination);
//                BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
//                BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destination));
//                int i;
//                byte[] bt = new byte[Byte.MAX_VALUE];
//                while ((i = bis.read(bt)) != -1) {
//                    bos.write(bt, 0, i);
//                }
//                bos.close();
//                bis.close();
//            } else if (file.isDirectory()) {
//                File[] files = file.listFiles();
//                for (File f : files) {
//                    copyAllFiles(f, destination + File.separator + f.getName());
//                }
//            }
//        }
//    }

    @Override
    public void onPause() {
        super.onPause();
        PreferenceManager.getDefaultSharedPreferences(getActivity()).unregisterOnSharedPreferenceChangeListener(this);
    }
}