package com.fox2code.mmm;

import android.util.Log;
import android.view.View;
import android.widget.Toast;

import androidx.annotation.AttrRes;
import androidx.annotation.DrawableRes;
import androidx.annotation.StringRes;

import com.fox2code.mmm.compat.CompatActivity;
import com.fox2code.mmm.installer.InstallerInitializer;
import com.fox2code.mmm.repo.RepoManager;
import com.fox2code.mmm.utils.Files;
import com.fox2code.mmm.utils.IntentHelper;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipFile;

interface NotificationTypeCst {
    String TAG = "NotificationType";
}

public enum NotificationType implements NotificationTypeCst {
    SHOWCASE_MODE(R.string.showcase_mode, R.drawable.ic_baseline_monitor_24,
            R.attr.colorPrimary, R.attr.colorOnPrimary) {
        @Override
        public boolean shouldRemove() {
            return !MainApplication.isShowcaseMode();
        }
    },
    NO_ROOT(R.string.fail_root_magisk, R.drawable.ic_baseline_numbers_24) {
        @Override
        public boolean shouldRemove() {
            return InstallerInitializer.peekMagiskPath() != null;
        }
    },
    MAGISK_OUTDATED(R.string.magisk_outdated, R.drawable.ic_baseline_update_24) {
        @Override
        public boolean shouldRemove() {
            return InstallerInitializer.peekMagiskPath() == null ||
                    InstallerInitializer.peekMagiskVersion() >=
                            Constants.MAGISK_VER_CODE_PATH_SUPPORT;
        }
    },
    NO_INTERNET(R.string.fail_internet, R.drawable.ic_baseline_cloud_off_24) {
        @Override
        public boolean shouldRemove() {
            return RepoManager.getINSTANCE().hasConnectivity();
        }
    },
    INSTALL_FROM_STORAGE(R.string.install_from_storage, R.drawable.ic_baseline_storage_24,
            R.attr.colorBackgroundFloating, R.attr.colorOnBackground, v -> {
        CompatActivity compatActivity = CompatActivity.getCompatActivity(v);
        final File module = new File(compatActivity.getCacheDir(),
                "installer" + File.separator + "module.zip");
        IntentHelper.openFileTo(compatActivity, module, (d, s) -> {
            if (s) {
                try {
                    boolean needPatch;
                    try (ZipFile zipFile = new ZipFile(d)) {
                        needPatch = zipFile.getEntry("module.prop") == null;
                    }
                    if (needPatch) {
                        Files.patchModuleSimple(Files.read(d),
                                new FileOutputStream(d));
                    }
                    try (ZipFile zipFile = new ZipFile(d)) {
                        needPatch = zipFile.getEntry("module.prop") == null;
                    }
                    if (needPatch) {
                        if (d.exists() && !d.delete())
                            Log.w(TAG, "Failed to delete non module zip");
                        Toast.makeText(compatActivity,
                                R.string.invalid_format, Toast.LENGTH_SHORT).show();
                    } else {
                        IntentHelper.openInstaller(compatActivity, d.getAbsolutePath(),
                                compatActivity.getString(
                                        R.string.local_install_title), null);
                    }
                } catch (IOException ignored) {
                    if (d.exists() && !d.delete())
                        Log.w(TAG, "Failed to delete invalid module");
                    Toast.makeText(compatActivity,
                            R.string.invalid_format, Toast.LENGTH_SHORT).show();
                }
            }
        });
    }, true) {
        @Override
        public boolean shouldRemove() {
            return MainApplication.isShowcaseMode() ||
                    InstallerInitializer.peekMagiskPath() == null;
        }
    };

    @StringRes
    public final int textId;
    @DrawableRes
    public final int iconId;
    @AttrRes
    public final int backgroundAttr;
    @AttrRes
    public final int foregroundAttr;
    public final View.OnClickListener onClickListener;
    public final boolean special;

    NotificationType(@StringRes int textId, int iconId) {
        this(textId, iconId, R.attr.colorError, R.attr.colorOnError);
    }

    NotificationType(@StringRes int textId, int iconId, int backgroundAttr, int foregroundAttr) {
        this(textId, iconId, backgroundAttr, foregroundAttr, null);
    }

    NotificationType(@StringRes int textId, int iconId, int backgroundAttr, int foregroundAttr, View.OnClickListener onClickListener) {
        this(textId, iconId, backgroundAttr, foregroundAttr, null, false);
    }

    NotificationType(@StringRes int textId, int iconId, int backgroundAttr, int foregroundAttr, View.OnClickListener onClickListener, boolean special) {
        this.textId = textId;
        this.iconId = iconId;
        this.backgroundAttr = backgroundAttr;
        this.foregroundAttr = foregroundAttr;
        this.onClickListener = onClickListener;
        this.special = special;
    }

    public boolean shouldRemove() {
        return false;
    }
}
