package cf.playhi.freezeyou;

import android.content.Intent;
import android.os.Bundle;
import android.util.Base64;
import android.view.View;
import android.widget.Button;
import android.widget.ListView;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;

import cf.playhi.freezeyou.app.FreezeYouBaseActivity;
import cf.playhi.freezeyou.utils.ToastUtils;

import static cf.playhi.freezeyou.ThemeUtils.processActionBar;
import static cf.playhi.freezeyou.ThemeUtils.processSetTheme;

public class BackupImportChooserActivity extends FreezeYouBaseActivity {

    private final HashMap<String, String> keyToStringIdValuePair = new HashMap<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        processSetTheme(this);
        super.onCreate(savedInstanceState);
        processActionBar(getActionBar());
        setContentView(R.layout.bica_main);

        onCreateInit();
    }

    private void onCreateInit() {

        Intent intent = getIntent();
        if (intent == null) {
            finish();
            return;
        }

        final ListView mainListView = findViewById(R.id.bica_main_listView);
        final ArrayList<HashMap<String, String>> titleAndSpKeyArrayList = new ArrayList<>();

        generateKeyToStringIdValuePair();

        String jsonContentString = intent.getStringExtra("jsonObjectString");
        JSONObject jsonObject = null;
        if (jsonContentString == null) {
            HashMap<String, String> keyValuePair = new HashMap<>();
            keyValuePair.put("title", getString(R.string.failed));
            keyValuePair.put("spKey", "Failed!");
            keyValuePair.put("category", "Failed!");
            titleAndSpKeyArrayList.add(keyValuePair);
        } else {
            try {
                jsonObject = new JSONObject(jsonContentString);
            } catch (JSONException e) {
                e.printStackTrace();
            }
            if (jsonObject == null) {
                HashMap<String, String> keyValuePair = new HashMap<>();
                keyValuePair.put("title", getString(R.string.parseFailed));
                keyValuePair.put("spKey", "Failed!");
                keyValuePair.put("category", "Failed!");
                titleAndSpKeyArrayList.add(keyValuePair);
            } else {
                generateList(jsonObject, titleAndSpKeyArrayList);
                if (titleAndSpKeyArrayList.size() == 0) {
                    HashMap<String, String> keyValuePair = new HashMap<>();
                    keyValuePair.put("title", getString(R.string.nothing));
                    keyValuePair.put("spKey", "Failed!");
                    keyValuePair.put("category", "Failed!");
                    titleAndSpKeyArrayList.add(keyValuePair);
                }
            }
        }

        final BackupImportChooserActivitySwitchSimpleAdapter adapter =
                new BackupImportChooserActivitySwitchSimpleAdapter(
                        this,
                        jsonObject,
                        titleAndSpKeyArrayList,
                        R.layout.bica_list_item,
                        new String[]{"title"},
                        new int[]{R.id.bica_list_item_switch});

        mainListView.setAdapter(adapter);

        processButtons();
    }

    private void processButtons() {
        final Button bicaFinishButton = findViewById(R.id.bica_finish_button);
        final Button bicaCancelButton = findViewById(R.id.bica_cancel_button);
        bicaCancelButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });
        bicaFinishButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                final ListView mainListView = findViewById(R.id.bica_main_listView);
                BackupImportChooserActivitySwitchSimpleAdapter adapter =
                        (BackupImportChooserActivitySwitchSimpleAdapter) mainListView.getAdapter();
                BackupUtils.importContents(
                        getApplicationContext(),
                        BackupImportChooserActivity.this, adapter.getFinalList());
                ToastUtils.showToast(BackupImportChooserActivity.this, R.string.finish);
                finish();
            }
        });
    }

    private void generateKeyToStringIdValuePair() {
        // String 开始
        keyToStringIdValuePair.put("onClickFuncChooseActionStyle", getString(R.string.onClickFuncChooseActionStyle));
        keyToStringIdValuePair.put("uiStyleSelection", getString(R.string.uiStyle));
        keyToStringIdValuePair.put("launchMode", getString(R.string.launchMode));
        keyToStringIdValuePair.put("organizationName", getString(R.string.organizationName));
        keyToStringIdValuePair.put("shortCutOneKeyFreezeAdditionalOptions", getString(R.string.shortCutOneKeyFreezeAdditionalOptions));
        // String 结束
        // boolean 开始
        keyToStringIdValuePair.put("allowEditWhenCreateShortcut", getString(R.string.allowEditWhCreateShortcut));
        keyToStringIdValuePair.put("noCaution", getString(R.string.nSCaution));
        keyToStringIdValuePair.put("saveOnClickFunctionStatus", getString(R.string.saveOnClickFunctionStatus));
        keyToStringIdValuePair.put("saveSortMethodStatus", getString(R.string.saveSortMethodStatus));
        keyToStringIdValuePair.put("cacheApplicationsIcons", getString(R.string.cacheApplicationsIcons));
        keyToStringIdValuePair.put("showInRecents", getString(R.string.showInRecents));
        keyToStringIdValuePair.put("lesserToast", getString(R.string.lesserToast));
        keyToStringIdValuePair.put("notificationBarFreezeImmediately", getString(R.string.notificationBarFreezeImmediately));
        keyToStringIdValuePair.put("notificationBarDisableSlideOut", getString(R.string.disableSlideOut));
        keyToStringIdValuePair.put("notificationBarDisableClickDisappear", getString(R.string.disableClickDisappear));
        keyToStringIdValuePair.put("onekeyFreezeWhenLockScreen", getString(R.string.freezeAfterScreenLock));
        keyToStringIdValuePair.put("freezeOnceQuit", getString(R.string.freezeOnceQuit));
        keyToStringIdValuePair.put("avoidFreezeForegroundApplications", getString(R.string.avoidFreezeForegroundApplications));
        keyToStringIdValuePair.put("tryToAvoidUpdateWhenUsing", getString(R.string.tryToAvoidUpdateWhenUsing));
        keyToStringIdValuePair.put("avoidFreezeNotifyingApplications", getString(R.string.avoidFreezeNotifyingApplications));
        keyToStringIdValuePair.put("openImmediately", getString(R.string.openImmediately));
        keyToStringIdValuePair.put("openAndUFImmediately", getString(R.string.openAndUFImmediately));
        keyToStringIdValuePair.put("shortcutAutoFUF", getString(R.string.shortcutAutoFUF));
        keyToStringIdValuePair.put("needConfirmWhenFreezeUseShortcutAutoFUF", getString(R.string.needCfmWhenFreeze));
        keyToStringIdValuePair.put("openImmediatelyAfterUnfreezeUseShortcutAutoFUF", getString(R.string.openImmediatelyAfterUF));
        keyToStringIdValuePair.put("enableInstallPkgFunc", getString(R.string.enableInstallPkgFunc));
        keyToStringIdValuePair.put("tryDelApkAfterInstalled", getString(R.string.tryDelApkAfterInstalled));
        keyToStringIdValuePair.put("useForegroundService", getString(R.string.useForegroundService));
        keyToStringIdValuePair.put("debugModeEnabled", getString(R.string.debugMode));
        keyToStringIdValuePair.put("notAllowInstallWhenIsObsd", getString(R.string.notAllowWhenIsObsd));
        // boolean 结束
        // Int 开始
        keyToStringIdValuePair.put("onClickFunctionStatus", getString(R.string.onClickFunctionStatus));
        keyToStringIdValuePair.put("sortMethodStatus", getString(R.string.sortMethodStatus));
        // Int 结束
        // 一键冻结、一键解冻、离开冻结列表 开始
        keyToStringIdValuePair.put("okff", getString(R.string.oneKeyFreezeList));
        keyToStringIdValuePair.put("okuf", getString(R.string.oneKeyUFList));
        keyToStringIdValuePair.put("foq", getString(R.string.freezeOnceQuitList));
        // 一键冻结、一键解冻、离开冻结列表 结束
        // 安装应用请求、URI 请求白名单 开始
        keyToStringIdValuePair.put("uriAutoAllowPkgs_allows", getString(R.string.uriAutoAllowList));
        keyToStringIdValuePair.put("installPkgs_autoAllowPkgs_allows", getString(R.string.ipaAutoAllowList));
        // 安装应用请求、URI 请求白名单 结束
    }

    private void generateList(JSONObject jsonObject, ArrayList<HashMap<String, String>> list) {

        final Iterator<String> jsonKeysIterator = jsonObject.keys();
        while (jsonKeysIterator.hasNext()) {
            switch (jsonKeysIterator.next()) {
                // 通用设置转入(更多设置 中的选项,不转移图标选择相关设置) 开始
                case "generalSettings_boolean":
                    generateGeneralSettingsBooleanList(jsonObject, list);
                    break;
                case "generalSettings_string":
                    generateGeneralSettingsStringList(jsonObject, list);
                    break;
                case "generalSettings_int":
                    generateGeneralSettingsIntList(jsonObject, list);
                    break;
                // 通用设置转出 结束
                // 一键冻结、一键解冻、离开冻结列表 开始
                case "oneKeyList":
                    generateOneKeyList(jsonObject, list);
                    break;
                // 一键冻结、一键解冻、离开冻结列表 结束
                // 计划任务 - 时间 开始
                case "userTimeScheduledTasks":
                    generateUserTimeScheduledTasksList(jsonObject, list);
                    break;
                // 计划任务 - 时间 结束
                // 计划任务 - 触发器 开始
                case "userTriggerScheduledTasks":
                    generateUserTriggerScheduledTasksList(jsonObject, list);
                    break;
                // 计划任务 - 触发器 结束
                // 用户自定分类(我的列表) 开始
                case "userDefinedCategories":
                    generateUserDefinedCategoriesList(jsonObject, list);
                    break;
                // 用户自定分类(我的列表) 结束
                // URI 请求白名单 开始
                case "uriAutoAllowPkgs_allows":
                    generateUriAutoAllowPkgsList(jsonObject, list);
                    break;
                // URI 请求白名单 结束
                // 安装应用请求白名单 开始
                case "installPkgs_autoAllowPkgs_allows":
                    generateInstallPkgsAutoAllowPkgsList(jsonObject, list);
                    break;
                // 安装应用请求白名单 结束
                default:
                    break;
            }
        }
    }

    private void generateGeneralSettingsBooleanList(JSONObject jsonObject, ArrayList<HashMap<String, String>> list) {
        JSONArray array = jsonObject.optJSONArray("generalSettings_boolean");
        if (array == null) {
            return;
        }
        JSONObject generalSettingsBooleanJSONObject = array.optJSONObject(0);
        if (generalSettingsBooleanJSONObject == null) {
            return;
        }
        Iterator<String> it = generalSettingsBooleanJSONObject.keys();
        String moreSettingsDashLineLabel = getString(R.string.moreSettingsDashLineLabel);
        String s;
        while (it.hasNext()) {
            s = it.next();
            switch (s) {
                case "allowEditWhenCreateShortcut":
                case "noCaution":
                case "saveOnClickFunctionStatus":
                case "saveSortMethodStatus":
                case "cacheApplicationsIcons":
                case "showInRecents":
                case "lesserToast":
                case "notificationBarFreezeImmediately":
                case "notificationBarDisableSlideOut":
                case "notificationBarDisableClickDisappear":
                case "onekeyFreezeWhenLockScreen":
                case "freezeOnceQuit":
                case "avoidFreezeForegroundApplications":
                case "tryToAvoidUpdateWhenUsing":
                case "avoidFreezeNotifyingApplications":
                case "openImmediately":
                case "openAndUFImmediately":
                case "shortcutAutoFUF":
                case "needConfirmWhenFreezeUseShortcutAutoFUF":
                case "openImmediatelyAfterUnfreezeUseShortcutAutoFUF":
                case "enableInstallPkgFunc":
                case "tryDelApkAfterInstalled":
                case "useForegroundService":
                case "debugModeEnabled":
                    HashMap<String, String> keyValuePair = new HashMap<>();
                    keyValuePair.put("title",
                            String.format(moreSettingsDashLineLabel,
                                    keyToStringIdValuePair.containsKey(s) ?
                                            keyToStringIdValuePair.get(s) : s));
                    keyValuePair.put("spKey", s);
                    keyValuePair.put("category", "generalSettings_boolean");
                    list.add(keyValuePair);
                    break;
                default:
                    break;
            }
        }
    }

    private void generateGeneralSettingsIntList(JSONObject jsonObject, ArrayList<HashMap<String, String>> list) {
        JSONArray array = jsonObject.optJSONArray("generalSettings_int");
        if (array == null) {
            return;
        }
        JSONObject generalSettingsIntJSONObject = array.optJSONObject(0);
        if (generalSettingsIntJSONObject == null) {
            return;
        }
        Iterator<String> it = generalSettingsIntJSONObject.keys();
        String s;
        while (it.hasNext()) {
            s = it.next();
            switch (s) {
                case "onClickFunctionStatus":
                case "sortMethodStatus":
                    HashMap<String, String> keyValuePair = new HashMap<>();
                    keyValuePair.put("title",
                            keyToStringIdValuePair.containsKey(s) ?
                                    keyToStringIdValuePair.get(s) : s);
                    keyValuePair.put("spKey", s);
                    keyValuePair.put("category", "generalSettings_int");
                    list.add(keyValuePair);
                    break;
                default:
                    break;
            }
        }
    }

    private void generateGeneralSettingsStringList(JSONObject jsonObject, ArrayList<HashMap<String, String>> list) {
        JSONArray array = jsonObject.optJSONArray("generalSettings_string");
        if (array == null) {
            return;
        }
        JSONObject generalSettingsStringJSONObject = array.optJSONObject(0);
        if (generalSettingsStringJSONObject == null) {
            return;
        }
        String moreSettingsDashLineLabel = getString(R.string.moreSettingsDashLineLabel);
        Iterator<String> it = generalSettingsStringJSONObject.keys();
        String s;
        while (it.hasNext()) {
            s = it.next();
            switch (s) {
                case "onClickFuncChooseActionStyle":
                case "uiStyleSelection":
                case "launchMode":
                case "organizationName":
                case "shortCutOneKeyFreezeAdditionalOptions":
                    HashMap<String, String> keyValuePair = new HashMap<>();
                    keyValuePair.put("title",
                            String.format(moreSettingsDashLineLabel,
                                    keyToStringIdValuePair.containsKey(s) ?
                                            keyToStringIdValuePair.get(s) : s));
                    keyValuePair.put("spKey", s);
                    keyValuePair.put("category", "generalSettings_string");
                    list.add(keyValuePair);
                    break;
                default:
                    break;
            }
        }
    }

    private void generateOneKeyList(JSONObject jsonObject, ArrayList<HashMap<String, String>> list) {
        JSONArray array = jsonObject.optJSONArray("oneKeyList");
        if (array == null) {
            return;
        }
        JSONObject generalOneKeyJSONObject = array.optJSONObject(0);
        if (generalOneKeyJSONObject == null) {
            return;
        }
        Iterator<String> it = generalOneKeyJSONObject.keys();
        String s;
        while (it.hasNext()) {
            s = it.next();
            switch (s) {
                case "okff":
                case "okuf":
                case "foq":
                    HashMap<String, String> keyValuePair = new HashMap<>();
                    keyValuePair.put("title",
                            keyToStringIdValuePair.containsKey(s) ?
                                    keyToStringIdValuePair.get(s) : s);
                    keyValuePair.put("spKey", s);
                    keyValuePair.put("category", "oneKeyList");
                    list.add(keyValuePair);
                    break;
                default:
                    break;
            }
        }
    }

    private void generateUserTimeScheduledTasksList(JSONObject jsonObject, ArrayList<HashMap<String, String>> list) {
        JSONArray array = jsonObject.optJSONArray("userTimeScheduledTasks");
        if (array == null) {
            return;
        }

        JSONObject oneUserTimeScheduledTaskJSONObject;
        String scheduledTaskDashLineLabel = getString(R.string.scheduledTaskDashLineLabel);
        String defaultLabel = getString(R.string.label);
        for (int i = 0; i < array.length(); ++i) {
            oneUserTimeScheduledTaskJSONObject = array.optJSONObject(i);
            if (oneUserTimeScheduledTaskJSONObject == null) {
                continue;
            }
            HashMap<String, String> keyValuePair = new HashMap<>();
            keyValuePair.put("title",
                    String.format(scheduledTaskDashLineLabel,
                            oneUserTimeScheduledTaskJSONObject.optString("label", defaultLabel)));
            try {
                oneUserTimeScheduledTaskJSONObject.put("i", Integer.toString(i));
            } catch (JSONException e) {
                e.printStackTrace();
            }
            keyValuePair.put("spKey", Integer.toString(i));
            keyValuePair.put("category", "userTimeScheduledTasks");
            list.add(keyValuePair);
        }
    }

    private void generateUserTriggerScheduledTasksList(JSONObject jsonObject, ArrayList<HashMap<String, String>> list) {
        JSONArray array = jsonObject.optJSONArray("userTriggerScheduledTasks");
        if (array == null) {
            return;
        }

        JSONObject oneUserTriggerScheduledTaskJSONObject;
        String scheduledTaskDashLineLabel = getString(R.string.scheduledTaskDashLineLabel);
        String defaultLabel = getString(R.string.label);
        for (int i = 0; i < array.length(); ++i) {
            oneUserTriggerScheduledTaskJSONObject = array.optJSONObject(i);
            if (oneUserTriggerScheduledTaskJSONObject == null) {
                continue;
            }
            HashMap<String, String> keyValuePair = new HashMap<>();
            keyValuePair.put("title",
                    String.format(scheduledTaskDashLineLabel,
                            oneUserTriggerScheduledTaskJSONObject.optString("label", defaultLabel)));
            try {
                oneUserTriggerScheduledTaskJSONObject.put("i", Integer.toString(i));
            } catch (JSONException e) {
                e.printStackTrace();
            }
            keyValuePair.put("spKey", Integer.toString(i));
            keyValuePair.put("category", "userTriggerScheduledTasks");
            list.add(keyValuePair);
        }
    }

    private void generateUserDefinedCategoriesList(JSONObject jsonObject, ArrayList<HashMap<String, String>> list) {
        JSONArray array = jsonObject.optJSONArray("userDefinedCategories");
        if (array == null) {
            return;
        }

        JSONObject oneUserDefinedCategoriesJSONObject;
        String myCustomizationDashLineLabel = getString(R.string.myCustomizationDashLineLabel);
        String defaultLabel = "";
        for (int i = 0; i < array.length(); ++i) {
            oneUserDefinedCategoriesJSONObject = array.optJSONObject(i);
            if (oneUserDefinedCategoriesJSONObject == null) {
                continue;
            }
            HashMap<String, String> keyValuePair = new HashMap<>();
            keyValuePair.put("title",
                    String.format(myCustomizationDashLineLabel,
                            new String(
                                    Base64.decode(
                                            oneUserDefinedCategoriesJSONObject.optString(
                                                    "label", defaultLabel),
                                            Base64.DEFAULT
                                    )
                            )
                    )
            );
            try {
                oneUserDefinedCategoriesJSONObject.put("i", Integer.toString(i));
            } catch (JSONException e) {
                e.printStackTrace();
            }
            keyValuePair.put("spKey", Integer.toString(i));
            keyValuePair.put("category", "userDefinedCategories");
            list.add(keyValuePair);
        }
    }

    private void generateUriAutoAllowPkgsList(JSONObject jsonObject, ArrayList<HashMap<String, String>> list) {
        JSONArray array = jsonObject.optJSONArray("uriAutoAllowPkgs_allows");
        if (array == null) {
            return;
        }

        JSONObject jObj = array.optJSONObject(0);
        if (jObj == null) {
            return;
        }

        HashMap<String, String> keyValuePair = new HashMap<>();
        keyValuePair.put(
                "title",
                keyToStringIdValuePair.containsKey("uriAutoAllowPkgs_allows") ?
                        keyToStringIdValuePair.get("uriAutoAllowPkgs_allows") :
                        "uriAutoAllowPkgs_allows"
        );
        keyValuePair.put("spKey", "uriAutoAllowPkgs_allows");
        keyValuePair.put("category", "uriAutoAllowPkgs_allows");
        list.add(keyValuePair);
    }

    private void generateInstallPkgsAutoAllowPkgsList(JSONObject jsonObject, ArrayList<HashMap<String, String>> list) {
        JSONArray array = jsonObject.optJSONArray("installPkgs_autoAllowPkgs_allows");
        if (array == null) {
            return;
        }

        JSONObject jObj = array.optJSONObject(0);
        if (jObj == null) {
            return;
        }

        HashMap<String, String> keyValuePair = new HashMap<>();
        keyValuePair.put(
                "title",
                keyToStringIdValuePair.containsKey("installPkgs_autoAllowPkgs_allows") ?
                        keyToStringIdValuePair.get("installPkgs_autoAllowPkgs_allows") :
                        "installPkgs_autoAllowPkgs_allows"
        );
        keyValuePair.put("spKey", "installPkgs_autoAllowPkgs_allows");
        keyValuePair.put("category", "installPkgs_autoAllowPkgs_allows");
        list.add(keyValuePair);
    }

}