package cn.com.venvy.lua.plugin;

import android.graphics.Paint;
import android.graphics.Rect;
import android.text.TextUtils;
import android.view.View;
import android.view.ViewGroup;

import com.taobao.luaview.util.AndroidUtil;
import com.taobao.luaview.util.LuaUtil;

import org.luaj.vm2.LuaValue;
import org.luaj.vm2.Varargs;
import org.luaj.vm2.lib.VarArgFunction;

import cn.com.venvy.App;
import cn.com.venvy.lua.binder.VenvyLVLibBinder;

/**
 * Created by Arthur on 2017/9/6.
 */

public class LVViewManagerPlugin {

    private static StringDrawLength sStringDrawLength;
    private static StringSizeWithWidth sStringSizeWithWidth;

    public static void install(VenvyLVLibBinder venvyLVLibBinder, View targetView) {
        venvyLVLibBinder.set("stringDrawLength", sStringDrawLength == null ? sStringDrawLength = new StringDrawLength() : sStringDrawLength);
        venvyLVLibBinder.set("destroyView", new DestroyManager(targetView));
        venvyLVLibBinder.set("stringSizeWithWidth", sStringSizeWithWidth == null ? sStringSizeWithWidth = new StringSizeWithWidth() : sStringSizeWithWidth);
    }

    private static class StringDrawLength extends VarArgFunction {
        @Override
        public Varargs invoke(Varargs args) {
            final int fixIndex = VenvyLVLibBinder.fixIndex(args);
            if (args.narg() > fixIndex) {
                String text = LuaUtil.getString(args, fixIndex + 1);
                Float size = LuaUtil.getFloat(args, fixIndex + 2);
                if (!TextUtils.isEmpty(text)) {
                    Paint paint = new Paint();
                    if (size != null) {
                        float density = AndroidUtil.getDensity(App.getContext());
                        if (density < 3) {
                            size = size - 2;
                        }
                        paint.setTextSize(size);
                    }
                    float text_width = paint.measureText(String.valueOf(text));//得到总体长度
                    return valueOf(text_width);
                }
            }
            return valueOf(0);
        }
    }

    private static class StringSizeWithWidth extends VarArgFunction {
        @Override
        public Varargs invoke(Varargs args) {
            final int fixIndex = VenvyLVLibBinder.fixIndex(args);
            if (args.narg() > fixIndex) {
                String text = LuaUtil.getString(args, fixIndex + 1);
                final Float width = LuaUtil.getFloat(args, fixIndex + 2);
                Float size = LuaUtil.getFloat(args, fixIndex + 3);
                float mathWidth = 0f;
                float mathHeight = 0f;
                if (!TextUtils.isEmpty(text)) {
                    Paint paint = new Paint();
                    if (size != null) {
                        paint.setTextSize(size);
                    }
                    float widthMeasureSpec = paint.measureText(text);
                    Rect bounds = new Rect();
                    paint.getTextBounds(text, 0, text.length(), bounds);
                    float hightMeasureSpec = bounds.height();
                    if (width >= widthMeasureSpec) {
                        mathWidth = widthMeasureSpec;
                    } else {
                        mathWidth = width;
                    }
                    int charNumInThisLine = paint.breakText(text, 0, text.length(), true, mathWidth, null);
                    if (charNumInThisLine >= text.length()) {
                        mathHeight = (float) (hightMeasureSpec * (Math.ceil(text.length() / charNumInThisLine)));
                    } else {
                        mathHeight = (float) (hightMeasureSpec * (Math.ceil(text.length() / charNumInThisLine) + 1));
                    }
                }
                LuaValue[] luaValue = new LuaValue[]{LuaValue.valueOf(mathWidth), LuaValue.valueOf(mathHeight)};
                return LuaValue.varargsOf(luaValue);
            }
            return valueOf(0);
        }
    }

    private static class DestroyManager extends VarArgFunction {

        private View rootView;

        DestroyManager(View rootView) {
            this.rootView = rootView;
        }

        @Override
        public Varargs invoke(Varargs args) {
            if (rootView == null) {//VideoOsLuaView
                return LuaValue.FALSE;
            }
            ViewGroup parent = (ViewGroup) rootView.getParent();
            int argsNum = args.narg();
            final int fixIndex = VenvyLVLibBinder.fixIndex(args);
            if (argsNum > 1) {
                String id = LuaUtil.getString(args, fixIndex + 1);
                if (!TextUtils.isEmpty(id)) {
                    View view = parent != null ? parent.findViewWithTag(id) : null;
                    if (view != null) {
                        parent.removeView(view);
                    }
                    return LuaValue.TRUE;
                }
            }
            if (parent != null) {
                parent.removeView(rootView);
                return LuaValue.TRUE;
            }
            return LuaValue.FALSE;
        }
    }
}