/*
 * Created by LuaView.
 * Copyright (c) 2017, Alibaba Group. All rights reserved.
 *
 * This source code is licensed under the MIT.
 * For the full copyright and license information,please view the LICENSE file in the root directory of this source tree.
 */

package com.taobao.luaview.userdata.kit;

import com.taobao.luaview.fun.mapper.LuaViewLib;
import com.taobao.luaview.global.SdkVersion;
import com.taobao.luaview.global.VmVersion;
import com.taobao.luaview.userdata.base.BaseLuaTable;
import com.taobao.luaview.util.AndroidUtil;
import com.taobao.luaview.util.DimenUtil;
import com.taobao.luaview.util.LuaUtil;

import org.luaj.vm2.Globals;
import org.luaj.vm2.LuaBoolean;
import org.luaj.vm2.LuaTable;
import org.luaj.vm2.LuaValue;
import org.luaj.vm2.Varargs;
import org.luaj.vm2.lib.VarArgFunction;
import org.luaj.vm2.lib.ZeroArgFunction;

import cn.com.venvy.common.utils.VenvyDeviceUtil;

/**
 * System 用户数据封装
 *
 * @author song
 * @date 15/9/6
 */
@LuaViewLib(revisions = {"20170306已对标"})
public class UDSystem extends BaseLuaTable {

    public UDSystem(Globals globals, LuaValue metatable) {
        super(globals, metatable);
        set("ios", new ios());//是否ios
        set("android", new android());//是否android
        set("sdkVersion", new sdkVersion());//LuaView版本
        set("osVersion", new osVersion());//系统版本
        set("platform", new platform());//平台信息
        set("scale", new scale());//屏幕分辨率
        set("device", new device());//设备信息
        set("screenSize", new screenSize());//屏幕尺寸
        set("gc", new gc());
        set("keepScreenOn", new keepScreenOn());
    }

    class ios extends VarArgFunction {
        @Override
        public Varargs invoke(Varargs args) {
            return LuaBoolean.FALSE;
        }
    }

    class android extends VarArgFunction {
        @Override
        public Varargs invoke(Varargs args) {
            return LuaBoolean.TRUE;
        }
    }

    class sdkVersion extends VarArgFunction {
        @Override
        public Varargs invoke(Varargs args) {
            return valueOf(SdkVersion.getCurrent());
        }
    }

    class osVersion extends VarArgFunction {
        @Override
        public Varargs invoke(Varargs args) {
            return valueOf(VenvyDeviceUtil.getOsVersion());
        }
    }

    class platform extends VarArgFunction {
        @Override
        public Varargs invoke(Varargs args) {
            return valueOf(AndroidUtil.getOsModel());
        }
    }

    class scale extends VarArgFunction {
        @Override
        public Varargs invoke(Varargs args) {
            return valueOf(AndroidUtil.getDensity(getContext()));
        }
    }

    class device extends VarArgFunction {
        @Override
        public Varargs invoke(Varargs args) {
            LuaTable table = new LuaTable();
            table.set("device", AndroidUtil.getDevice());
            table.set("brand", AndroidUtil.getBrand());
            table.set("product", AndroidUtil.getProduct());
            table.set("manufacturer", AndroidUtil.getManufacturer());

            //screen size
            int[] screenSize = AndroidUtil.getWindowSizeInDp(getContext());
            table.set("window_width", screenSize[0]);
            table.set("window_height", screenSize[1]);

            //action bar height
            int actionBarHeight = AndroidUtil.getActionBarHeightInDp(getContext());
            table.set("nav_height", actionBarHeight);
            int bottomNavHeight = AndroidUtil.getNavigationBarHeightInDp(getContext());
            table.set("bottom_nav_height", bottomNavHeight);
            int statusBarHeight = AndroidUtil.getStatusBarHeightInDp(getContext());
            table.set("status_bar_height", statusBarHeight);
            return table;
        }
    }


    /**
     * 系统屏幕大小
     */
    class screenSize extends VarArgFunction {
        @Override
        public Varargs invoke(Varargs args) {
            return varargsOf(new LuaValue[]{valueOf(DimenUtil.pxToDpi(AndroidUtil.getScreenWidth(getContext()))), valueOf(DimenUtil.pxToDpi(AndroidUtil.getScreenHeight(getContext())))});
        }
    }

    /**
     * 系统垃圾回收
     */
    class gc extends ZeroArgFunction {
        @Override
        public LuaValue call() {
            System.gc();
            return UDSystem.this;
        }
    }


    /**
     * 屏幕常亮开启
     */
    class keepScreenOn extends VarArgFunction {
        @Override
        public Varargs invoke(Varargs varargs) {
            if (getGlobals() != null && getGlobals().getRenderTarget() != null) {
                 Boolean keepScreenOn = LuaUtil.getBoolean(varargs, 2);
                getGlobals().getRenderTarget().setKeepScreenOn(keepScreenOn != null ? keepScreenOn : true);
            }
            return LuaValue.NIL;
        }
    }
}