package cn.jiguang.imui.chatinput;

import android.annotation.TargetApi;
import android.app.Activity;
import android.app.Fragment;
import android.content.Context;
import android.graphics.Rect;
import android.os.Build;
import android.support.annotation.RequiresApi;
import android.util.DisplayMetrics;
import android.view.View;
import android.view.ViewTreeObserver;

import java.lang.reflect.Field;

import cn.jiguang.imui.chatinput.emoji.EmoticonsKeyboardUtils;

public class KeyboardStatusDetector {
    KeyboardVisibilityListener visibilityListener;

    boolean keyboardVisible = false;

    public void registerFragment(Fragment f) {
        registerView(f.getView());
    }

    private Activity activity;

    public KeyboardStatusDetector registerActivity(Activity a) {
        activity = a;
        return registerView(a.getWindow().getDecorView().findViewById(android.R.id.content));
    }

    public void removeListener() {
        if (mView != null)
            mView.getViewTreeObserver().removeGlobalOnLayoutListener(onGlobalLayoutListener);
    }

    private final int DEF_KEYBOARD_HEAGH_WITH_DP = 600;
    int lastKeyboardHeight = -1;

    public int getLastKeyboardHeight() {
        if (currentKeyboardHeight < 0) {
            currentKeyboardHeight = EmoticonsKeyboardUtils.dip2px(activity, DEF_KEYBOARD_HEAGH_WITH_DP);
        }
        return currentKeyboardHeight;
    }

    private View mView;
    private ViewTreeObserver.OnGlobalLayoutListener onGlobalLayoutListener;
    private int currentKeyboardHeight = -1;

    public KeyboardStatusDetector registerView(final View v) {
        mView = v;
        onGlobalLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener() {
            @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR1)
            @Override
            public void onGlobalLayout() {
                Rect r = new Rect();
                v.getWindowVisibleDisplayFrame(r);
                //计算出可见屏幕的高度
                int displayHight = r.bottom - r.top;
                //获得屏幕整体的高度
                int hight = v.getHeight();
                DisplayMetrics metrics = new DisplayMetrics();
                //获取当前屏幕的真实高度
                int screenHeight = v.getRootView().getHeight();
                //获得键盘高度
                int keyboardHeight = screenHeight - displayHight - getSoftButtonsBarHeight(activity);
                if (keyboardHeight > 100) { // if more than 100 pixels, its probably a keyboard...
                    int statusBarHeight = 0;
                    try {
                        Class<?> c = Class.forName("com.android.internal.R$dimen");
                        Object obj = c.newInstance();
                        Field field = c.getField("status_bar_height");
                        int x = Integer.parseInt(field.get(obj).toString());
                        statusBarHeight = activity.getResources().getDimensionPixelSize(x);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    //计算出可见屏幕的高度
                    lastKeyboardHeight = keyboardHeight - statusBarHeight;
                    /** Check this variable to debounce layout events */
                    if (!keyboardVisible) {
                        currentKeyboardHeight = lastKeyboardHeight;
                        keyboardVisible = true;
                        if (visibilityListener != null)
                            visibilityListener.onVisibilityChanged(true, getLastKeyboardHeight());
                    } else if (currentKeyboardHeight != lastKeyboardHeight) {
                        currentKeyboardHeight = lastKeyboardHeight;
                        visibilityListener.onHeightChanged(getLastKeyboardHeight());
                    }
                } else {
                    if (keyboardVisible) {
                        keyboardVisible = false;
                        if (visibilityListener != null)
                            visibilityListener.onVisibilityChanged(false, getLastKeyboardHeight());
                    }
                }
            }
        };
        v.getViewTreeObserver().addOnGlobalLayoutListener(onGlobalLayoutListener);

        return this;
    }

    /**
     * 底部虚拟按键栏的高度
     *
     * @return
     */
    @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
    private static int getSoftButtonsBarHeight(Activity activity) {
        DisplayMetrics metrics = new DisplayMetrics();
        //这个方法获取可能不是真实屏幕的高度
        activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
        int usableHeight = metrics.heightPixels;
        //获取当前屏幕的真实高度
        activity.getWindowManager().getDefaultDisplay().getRealMetrics(metrics);
        int realHeight = metrics.heightPixels;
        if (realHeight > usableHeight) {
            return realHeight - usableHeight;
        } else {
            return 0;
        }
    }

    public KeyboardStatusDetector setVisibilityListener(KeyboardVisibilityListener listener) {
        visibilityListener = listener;
        return this;
    }

    public static interface KeyboardVisibilityListener {
        public void onVisibilityChanged(boolean keyboardVisible, int keyboardHeight);

        public void onHeightChanged(int keyboardHeight);
    }
}
