package com.yhao.floatwindow.utils;

import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.provider.Settings;
import android.view.View;
import android.view.WindowManager;

import com.yhao.floatwindow.impl.FloatLifecycleReceiver;
import com.yhao.floatwindow.interfaces.ResumedListener;
import com.yhao.floatwindow.permission.PermissionListener;
import com.yhao.floatwindow.permission.PermissionUtil;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

/**
 * @Copyright © 2017 Analysys Inc. All rights reserved.
 * @Description: <pre>
 *   需要清楚:一个MIUI版本对应小米各种机型,基于不同的安卓版本,但是权限设置页跟MIUI版本有关
 *   测试TYPE_TOAST类型:
 *   7.0:
 *   小米      5        MIUI8         -------------------- 失败
 *   小米   Note2       MIUI9         -------------------- 失败
 *   6.0.1
 *   小米   5                         -------------------- 失败
 *   小米   红米note3                  -------------------- 失败
 *   6.0:
 *   小米   5                         -------------------- 成功
 *   小米   红米4A      MIUI8         -------------------- 成功
 *   小米   红米Pro     MIUI7         -------------------- 成功
 *   小米   红米Note4   MIUI8         -------------------- 失败
 *  * <p/>
 *  * 经过各种横向纵向测试对比,得出一个结论,就是小米对TYPE_TOAST的处理机制毫无规律可言!
 *  * 跟Android版本无关,跟MIUI版本无关,addView方法也不报错
 *  * 所以最后对小米6.0以上的适配方法是:不使用 TYPE_TOAST 类型,统一申请权限
 *               </pre>
 * @Version: 1.0.9
 * @Create: 2017/12/30 17:11:30
 * @Author: yhao
 */
public class Miui {

    private static final String MIUI = "ro.MIUI.ui.version.name";
    private static final String MIUI5 = "V5";
    private static final String MIUI6 = "V6";
    private static final String MIUI7 = "V7";
    private static final String MIUI8 = "V8";
    private static final String MIUI9 = "V9";
    private static List<PermissionListener> mPermissionListenerList;
    private static PermissionListener mPermissionListener;

    public static boolean rom() {
        L.d(" Miui  : " + Miui.getProp());
        return "Xiaomi".equals(Build.MANUFACTURER);
    }

    private static String getProp() {
        return Rom.getProp(MIUI);
    }

    /**
     * Android6.0以下申请权限
     */
    public static void requestPermission(final Context context, PermissionListener permissionListener) {
        if (PermissionUtil.hasPermission(context)) {
            permissionListener.onSuccess();
            return;
        }
        if (mPermissionListenerList == null) {
            mPermissionListenerList = new ArrayList<PermissionListener>();
            mPermissionListener = new PermissionListener() {
                @Override
                public void onSuccess() {
                    for (PermissionListener listener : mPermissionListenerList) {
                        listener.onSuccess();
                    }
                    mPermissionListenerList.clear();
                }

                @Override
                public void onFail() {
                    for (PermissionListener listener : mPermissionListenerList) {
                        listener.onFail();
                    }
                    mPermissionListenerList.clear();
                }
            };
            requestPermission(context);
        }
        mPermissionListenerList.add(permissionListener);
    }

    private static void requestPermission(final Context context) {
        String prop = getProp();
        if (MIUI5.equals(prop)) {
            reqForMiui5(context);
        } else if (MIUI6.equals(prop) || MIUI7.equals(prop)) {
            reqForMiui67(context);
        } else if (MIUI8.equals(prop) || MIUI9.equals(prop)) {
            reqForMiui89(context);
        }
        FloatLifecycleReceiver.setResumedListener(new ResumedListener() {
            @Override
            public void onResumed() {
                if (PermissionUtil.hasPermission(context)) {
                    mPermissionListener.onSuccess();
                } else {
                    mPermissionListener.onFail();
                }
            }
        });
    }

    private static void reqForMiui5(Context context) {
        String packageName = context.getPackageName();
        Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
        Uri uri = Uri.fromParts("package", packageName, null);
        intent.setData(uri);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        if (Rom.isIntentAvailable(intent, context)) {
            context.startActivity(intent);
        } else {
            L.e("intent is not available!");
        }
    }

    private static void reqForMiui67(Context context) {
        Intent intent = new Intent("MIUI.intent.action.APP_PERM_EDITOR");
        intent.setClassName("com.MIUI.securitycenter", "com.MIUI.permcenter.permissions.AppPermissionsEditorActivity");
        intent.putExtra("extra_pkgname", context.getPackageName());
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        if (Rom.isIntentAvailable(intent, context)) {
            context.startActivity(intent);
        } else {
            L.e("intent is not available!");
        }
    }

    private static void reqForMiui89(Context context) {
        Intent intent = new Intent("MIUI.intent.action.APP_PERM_EDITOR");
        intent.setClassName("com.MIUI.securitycenter", "com.MIUI.permcenter.permissions.PermissionsEditorActivity");
        intent.putExtra("extra_pkgname", context.getPackageName());
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        if (Rom.isIntentAvailable(intent, context)) {
            context.startActivity(intent);
        } else {
            intent = new Intent("MIUI.intent.action.APP_PERM_EDITOR");
            intent.setPackage("com.MIUI.securitycenter");
            intent.putExtra("extra_pkgname", context.getPackageName());
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            if (Rom.isIntentAvailable(intent, context)) {
                context.startActivity(intent);
            } else {
                L.e("intent is not available!");
            }
        }
    }

    /**
     * 有些机型在添加TYPE-TOAST类型时会自动改为TYPE_SYSTEM_ALERT,通过此方法可以屏蔽修改 但是...即使成功显示出悬浮窗,移动的话也会崩溃
     */
    @SuppressWarnings("unused")
    private static void addViewToWindow(WindowManager wm, View view, WindowManager.LayoutParams params) {
        setMiUIInternational(true);
        wm.addView(view, params);
        setMiUIInternational(false);
    }

    private static void setMiUIInternational(boolean flag) {
        try {
            Class<?> buildClazz = Class.forName("MIUI.os.Build");
            Field isInternational = buildClazz.getDeclaredField("IS_INTERNATIONAL_BUILD");
            isInternational.setAccessible(true);
            isInternational.setBoolean(null, flag);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}