package com.hss01248.bottomtabs;

import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.os.Build;
import android.support.annotation.ColorRes;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;

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

/**
 *
 * compile 'com.readystatesoftware.systembartint:systembartint:1.0.3'
 *
 * Created by Administrator on 2017/1/11 0011.
 */

public class StatusbarUtil {

    private static int statusHeight;


    private static String getHandSetInfo() {
        String handSetInfo = "手机型号:" + Build.MODEL
                + "\n系统版本:" + Build.VERSION.RELEASE
                + "\n产品型号:" + Build.PRODUCT
                + "\n版本显示:" + Build.DISPLAY
                + "\n系统定制商:" + Build.BRAND
                + "\n设备参数:" + Build.DEVICE
                + "\n开发代号:" + Build.VERSION.CODENAME
                + "\nSDK版本号:" + Build.VERSION.SDK_INT
                + "\nCPU类型:" + Build.CPU_ABI
                + "\n硬件类型:" + Build.HARDWARE
                + "\n主机:" + Build.HOST
                + "\n生产ID:" + Build.ID
                + "\nROM制造商:" + Build.MANUFACTURER // 这行返回的是rom定制商的名称
                ;
        Log.e("tt",handSetInfo);
        return handSetInfo;
    }

    private static boolean isMeizu(){
        //魅族rom手机
        return "Meizu".equalsIgnoreCase(Build.MANUFACTURER);
    }

    private static boolean isXiaomi(){
        //小米rom手机
        return "Xiaomi".equalsIgnoreCase(Build.MANUFACTURER);
    }





    /**
     * 状态栏背景色为淡色时,为防止状态栏上白色字体看不清而采取的一系列适配措施.
     *
     * 适用于状态栏情况单一的activity,此方法中,不仅设置了背景色,还更改了状态栏文字颜色
     *
     * @param activity
     * @param colorLight UI图上给的状态栏背景色
     * @param colorDeep 在无法变更状态栏文字颜色的手机上,状态栏背景采用什么颜色.传入的是R.color.xxx
     */
    public static void setBgColorLight(Activity activity, @ColorRes int colorLight, @ColorRes int colorDeep) {
        int color = colorLight;

        if(isXiaomi()){
            setMiuiStatusBarDarkMode(activity,true);
        }else if(isMeizu()){
            setMeizuStatusBarDarkIcon(activity,true);
        }else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            setBlackFontUpM(activity,true);
        }else {
            color = colorDeep;
        }
        setBgColor(activity, color);
    }


    /**
     * 当UI图上状态栏背景为淡色时,适配时实际应设置的颜色是什么.
     * 只是提供一个颜色计算功能,没有实际去改变任何东西
     *
     * 适用于多tab切换时计算,然后就可以动态变更状态栏颜色
     * @param activity
     */
    public static @ColorRes
    int getBgColorIfLight(Activity activity, @ColorRes int colorLight, @ColorRes int colorDeep) {

        int color = colorLight;

        if(isXiaomi()){

        }else if(isMeizu()){

        }else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

        }else {
            color = colorDeep;
        }
        return color;
    }


    /**
     * 可以无限调用,无在初始化时的限制.适用于多tab切换,其中一个或几个tab有白色,并还有其他颜色的情况
     * @param activity
     * @param isDark
     */
    public static void setFontBlack(Activity activity,boolean isDark){
       // setStatusBarFontIconDark(activity,isDark);

        if(isXiaomi() && Build.VERSION.SDK_INT < Build.VERSION_CODES.M){//对于小米手机6.0以上,应该优先调用小米的方法,而不是M上的,应该改ROM了
            setMiuiStatusBarDarkMode(activity,isDark);
        }else if(isMeizu()){
            setMeizuStatusBarDarkIcon(activity,isDark);
        }else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            setBlackFontUpM(activity,isDark);
        }else {
            /*if(isDark){
                SystemBarTintManager mTintManager = new SystemBarTintManager(activity);
                mTintManager.setStatusBarTintEnabled(true);
                mTintManager.setStatusBarTintResource(R.color.half_trans);
            }else {
                SystemBarTintManager mTintManager = new SystemBarTintManager(activity);
                mTintManager.setStatusBarTintEnabled(true);
                mTintManager.setStatusBarTintResource(R.color.trans);
            }*/
        }
    }




    public static int getStatusBarHeight(Context context) {

        if(statusHeight <=0){
             statusHeight = 50;
            int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
            if (resourceId > 0) {
                statusHeight = context.getResources().getDimensionPixelSize(resourceId);
            }

            Log.e("h","getStatusBarHeight:"+statusHeight);
            return statusHeight;

        }else {
            return statusHeight;
        }


    }

    public static void initInTabs(Activity activity){
        setBgTransparent(activity);
        //StatusBarCompat.setTranslucent(activity.getWindow(),true);
    }


    /**
     * 没有页面内容沉浸入状态栏的情况,不同tab不同颜色
     * @param activity
     * @param colorBeans
     * @param statusBarView
     * @param index
     */
    public static void onTabChangeIfNoThrough(Activity activity, List<StatusColorBean> colorBeans, View statusBarView, int index){



        StatusColorBean bean = colorBeans.get(index);

        setFontBlack(activity,bean.isLight);

        if(bean.isThrough){
            statusBarView.setVisibility(View.GONE);
            return;
        }


        setStatusBarViewHeight(activity, statusBarView);



        if(bean.isLight){
            int color = getBgColorIfLight(activity,bean.colorRes,bean.colorResBackup);
            statusBarView.setBackgroundResource(color);
        }else {
            statusBarView.setBackgroundResource(bean.colorRes);
        }

    }



    /**
     * 没有页面内容沉浸入状态栏的情况,不同tab不同颜色
     * @param activity
     * @param colorBeans
     * @param index
     */
    public static void onTabChangeIfHasThrough(Activity activity, List<StatusColorBean> colorBeans, int index){

        StatusColorBean bean = colorBeans.get(index);
        View statusBarView = bean.statusBarView;

        setFontBlack(activity,bean.isLight);

        if(bean.isThrough){
            statusBarView.setVisibility(View.GONE);
            return;
        }

        statusBarView.setVisibility(View.VISIBLE);
        setStatusBarViewHeight(activity, statusBarView);



        if(bean.isLight){
            int color = getBgColorIfLight(activity,bean.colorRes,bean.colorResBackup);
            statusBarView.setBackgroundResource(color);
        }else {
            statusBarView.setBackgroundResource(bean.colorRes);
        }

    }











    private static void setStatusBarViewHeight(Activity activity, View statusBarView) {
        int height = getStatusBarHeight(activity);
        ViewGroup.LayoutParams layoutParams = statusBarView.getLayoutParams();
        layoutParams.height = height;
        statusBarView.setLayoutParams(layoutParams);
        statusBarView.setVisibility(View.VISIBLE);
    }


    /**
     * 需要在setContentview之后再调用
     * @param activity
     */
    public static void setBgColor(Activity activity, @ColorRes int colorRes) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            //setTranslucentStatus(activity, true);
            setTranslucentStatus(activity,activity.getResources().getColor(colorRes));
           /* SystemBarTintManager mTintManager = new SystemBarTintManager(activity);
            mTintManager.setStatusBarTintEnabled(true);
            mTintManager.setStatusBarTintResource(colorRes);*/
        }
    }

    public static void setBgTransparent(Activity activity) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            setTranslucentStatus(activity,Color.TRANSPARENT);
            /*setTranslucentStatus(activity, true);
            SystemBarTintManager mTintManager = new SystemBarTintManager(activity);
            mTintManager.setStatusBarTintEnabled(true);
            mTintManager.setStatusBarTintColor(Color.TRANSPARENT);*/
        }
    }



    /**
     * 单纯地设置状态栏透明
     * @param activity
     */
    public static void setStatusBarTranslucent(Activity activity) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            setTranslucentStatus(activity, true);
            //activity.getWindow().getDecorView().
        }
    }


    @TargetApi(19)
    private static void setTranslucentStatus(Activity activity, boolean on) {
        Window win = activity.getWindow();
        WindowManager.LayoutParams winParams = win.getAttributes();
        final int bits = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
        if (on) {
            winParams.flags |= bits;
        } else {
            winParams.flags &= ~bits;
        }

        win.setAttributes(winParams);
    }


    public static void setTranslucentStatus(Activity activity,int statusBarPlaceColor) {

        // 5.0以上系统状态栏透明
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            Window window = activity.getWindow();
            //window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

            window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            //window.setStatusBarColor(Color.TRANSPARENT);
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        }
    }


    /**
     * 在新的 MIUI 版本(即基于 Android 6.0 ,开发版 7.7.13 及以后版本):

     使用 View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR ,来设置「状态栏黑色字符」效果
     同时要设置 WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS,
     并且无 WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
     * @param activity
     * @param darkmode
     * @return
     */
    public static boolean setMiuiStatusBarDarkMode(Activity activity, boolean darkmode) {

        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){

           /* Window window = activity.getWindow();

            if(darkmode){
                window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
                window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
                window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
            }else {
                int flag = window.getDecorView().getSystemUiVisibility() & ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
                window.getDecorView().setSystemUiVisibility(flag);
            }*/
            return true;
        }else {
            Class<? extends Window> clazz = activity.getWindow().getClass();
            try {
                int darkModeFlag = 0;
                Class<?> layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams");
                Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE");
                darkModeFlag = field.getInt(layoutParams);
                Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class);
                extraFlagField.invoke(activity.getWindow(), darkmode ? darkModeFlag : 0, darkModeFlag);
                return true;
            } catch (Exception e) {
                e.printStackTrace();
            }
            return false;
        }

    }

    private static boolean setMeizuStatusBarDarkIcon(Activity activity, boolean dark) {
        boolean result = false;
        if (activity != null) {
            try {
                WindowManager.LayoutParams lp = activity.getWindow().getAttributes();
                Field darkFlag = WindowManager.LayoutParams.class
                        .getDeclaredField("MEIZU_FLAG_DARK_STATUS_BAR_ICON");
                Field meizuFlags = WindowManager.LayoutParams.class
                        .getDeclaredField("meizuFlags");
                darkFlag.setAccessible(true);
                meizuFlags.setAccessible(true);
                int bit = darkFlag.getInt(null);
                int value = meizuFlags.getInt(lp);
                if (dark) {
                    value |= bit;
                } else {
                    value &= ~bit;
                }
                meizuFlags.setInt(lp, value);
                activity.getWindow().setAttributes(lp);
                result = true;
            } catch (Exception e) {
            }
        }
        return result;
    }

    /**
     * 6.0以上的系统,将字体改成深色
     * @param activity
     */
    private static void setBlackFontUpM(Activity activity,boolean dark){
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if(dark){
                activity.getWindow().getDecorView().setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN|View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
            }else {
                activity.getWindow().getDecorView().setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
            }

        }
    }

    public static class StatusColorBean{
        public @ColorRes  int colorRes;
        public boolean isLight;//是否为浅色
        public boolean isThrough;//是否为沉浸式
        public @ColorRes  int colorResBackup;//浅色时备用的颜色

        public View statusBarView;

        /*public StatusColorBean(int colorRes, boolean isLight, boolean isThrough,int colorResBackup) {
                this.colorRes = colorRes;
                this.isLight = isLight;
                this.isThrough = isThrough;
                this.colorResBackup = colorResBackup;
        }*/

        public StatusColorBean(int colorRes, boolean isLight, boolean isThrough,int colorResBackup,View statusBarView) {
            this.colorRes = colorRes;
            this.isLight = isLight;
            this.isThrough = isThrough;
            this.colorResBackup = colorResBackup;
            this.statusBarView = statusBarView;
        }

        /**
         *
         * @param colorRes
         * @param isLight
         * @param colorResBackup
         */
        public StatusColorBean(int colorRes, boolean isLight,int colorResBackup) {
            this.colorRes = colorRes;
            this.isLight = isLight;
            this.isThrough = false;
            this.colorResBackup = colorResBackup;
        }


    }

    public interface onTabChangeListener{
        void onChange(int index);
    }


    private static void setStatusBarFontIconDark(Activity activity,boolean dark) {
        // 小米MIUI
        try {
            Window window = activity.getWindow();
            Class clazz = activity.getWindow().getClass();
            Class layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams");
            Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE");
            int darkModeFlag = field.getInt(layoutParams);
            Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class);
            if (dark) {    //状态栏亮色且黑色字体
                extraFlagField.invoke(window, darkModeFlag, darkModeFlag);
            } else {       //清除黑色字体
                extraFlagField.invoke(window, 0, darkModeFlag);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        // 魅族FlymeUI
        try {
            Window window = activity.getWindow();
            WindowManager.LayoutParams lp = window.getAttributes();
            Field darkFlag = WindowManager.LayoutParams.class
                .getDeclaredField("MEIZU_FLAG_DARK_STATUS_BAR_ICON");
            Field meizuFlags = WindowManager.LayoutParams.class.getDeclaredField("meizuFlags");
            darkFlag.setAccessible(true);
            meizuFlags.setAccessible(true);
            int bit = darkFlag.getInt(null);
            int value = meizuFlags.getInt(lp);
            if (dark) {
                value |= bit;
            } else {
                value &= ~bit;
            }
            meizuFlags.setInt(lp, value);
            window.setAttributes(lp);
        } catch (Exception e) {
            e.printStackTrace();
        }
        // android6.0+系统
        // 这个设置和在xml的style文件中用这个<item name="android:windowLightStatusBar">true</item>属性是一样的
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (dark) {
                activity.getWindow().getDecorView().setSystemUiVisibility(
                    View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                        | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
            } else {
                int uiVisibility = activity.getWindow().getDecorView().getSystemUiVisibility();
                activity.getWindow().getDecorView()
                    .setSystemUiVisibility(uiVisibility | View.SYSTEM_UI_FLAG_VISIBLE);
            }
        }
    }
}