content: /*
   * 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.fun.mapper.kit;
  
  import com.taobao.luaview.fun.base.BaseMethodMapper;
  import com.taobao.luaview.fun.mapper.LuaViewApi;
  import com.taobao.luaview.fun.mapper.LuaViewLib;
  import com.taobao.luaview.global.VmVersion;
  import com.taobao.luaview.userdata.kit.UDTimer;
  import com.taobao.luaview.util.LuaUtil;
  
  import org.luaj.vm2.LuaFunction;
  import org.luaj.vm2.LuaValue;
  import org.luaj.vm2.Varargs;
  
  import java.util.List;
  
  /**
   * timer 接口封装
   *
   * @author song
   * @date 15/8/21
   */
  @LuaViewLib(revisions = {"20170306已对标"})
  public class TimerMethodMapper<U extends UDTimer> extends BaseMethodMapper<U> {
      private static final String TAG = "TimerMethodMapper";
      private static final String[] sMethods = new String[]{
              "delay",//0
              "repeat",//1
              "repeatCount",//2
              "interval",//3
              "start",//4
              "callback",//5
              "cancel"//6
      };
  
      @Override
      public List<String> getAllFunctionNames() {
          return mergeFunctionNames(TAG, super.getAllFunctionNames(), sMethods);
      }
  
      @Override
      public Varargs invoke(int code, U target, Varargs varargs) {
          final int optcode = code - super.getAllFunctionNames().size();
          switch (optcode) {
              case 0:
                  return delay(target, varargs);
              case 1:
                  return repeat(target, varargs);
              case 2:
                  return repeatCount(target, varargs);
              case 3:
                  return interval(target, varargs);
              case 4:
                  return start(target, varargs);
              case 5:
                  return callback(target, varargs);
              case 6:
                  return cancel(target, varargs);
          }
          return super.invoke(code, target, varargs);
      }
  
      //--------------------------------------- API --------------------------------------------------
  
      /**
       * 启动延时
       *
       * @param udTimer
       * @param varargs
       * @return
       */
      @LuaViewApi(since = VmVersion.V_500)
      public LuaValue delay(U udTimer, Varargs varargs) {
          if (varargs.narg() > 1) {
              return setDelay(udTimer, varargs);
          } else {
              return getDelay(udTimer, varargs);
          }
      }
  
      @LuaViewApi(since = VmVersion.V_500)
      public LuaValue setDelay(U udTimer, Varargs varargs) {
          final long delay = LuaUtil.getTimeLong(varargs, 0f, 2);
          return udTimer.setDelay(delay);
      }
  
      @LuaViewApi(since = VmVersion.V_500)
      public LuaValue getDelay(U udTimer, Varargs varargs) {
          return valueOf(udTimer.getDelay());
      }
  
      /**
       * 是否重复
       *
       * @param udTimer
       * @param varargs
       * @return
       */
      @LuaViewApi(since = VmVersion.V_500)
      public LuaValue repeat(U udTimer, Varargs varargs) {
          if (varargs.narg() > 1) {
              return setRepeat(udTimer, varargs);
          } else {
              return getRepeat(udTimer, varargs);
          }
      }
  
      @LuaViewApi(since = VmVersion.V_500)
      public LuaValue setRepeat(U udTimer, Varargs varargs) {
          final boolean repeat = LuaUtil.getBoolean(varargs, false, 2);
          return udTimer.setRepeat(repeat);
      }
  
      @LuaViewApi(since = VmVersion.V_500)
      public LuaValue getRepeat(U udTimer, Varargs varargs) {
          return valueOf(udTimer.isRepeat());
      }
  
      /**
       * 重复次数
       * TODO 修改次数控制
       * @param udTimer
       * @param varargs
       * @return
       */
      @LuaViewApi(since = VmVersion.V_511)
      @Deprecated
      public LuaValue repeatCount(U udTimer, Varargs varargs) {
          if (varargs.narg() > 1) {
              return setRepeatCount(udTimer, varargs);
          } else {
              return getRepeatCount(udTimer, varargs);
          }
      }
  
      @LuaViewApi(since = VmVersion.V_511)
      public LuaValue setRepeatCount(U udTimer, Varargs varargs) {
          final int repeat = LuaUtil.getInt(varargs, 0, 2);
          return udTimer.setRepeat(repeat > 0);
      }
  
      @LuaViewApi(since = VmVersion.V_511)
      public LuaValue getRepeatCount(U udTimer, Varargs varargs) {
          return valueOf(udTimer.isRepeat());
      }
  
  
      /**
       * 设置interval
       *
       * @param udTimer
       * @param varargs
       * @return
       */
      @LuaViewApi(since = VmVersion.V_500)
      public LuaValue interval(U udTimer, Varargs varargs) {
          if (varargs.narg() > 1) {
              return setInterval(udTimer, varargs);
          } else {
              return getInterval(udTimer, varargs);
          }
      }
  
      @LuaViewApi(since = VmVersion.V_500)
      public LuaValue setInterval(U udTimer, Varargs varargs) {
          final long interval = LuaUtil.getTimeLong(varargs, 1f, 2);
          return udTimer.setInterval(interval);
      }
  
      @LuaViewApi(since = VmVersion.V_500)
      public LuaValue getInterval(U udTimer, Varargs varargs) {
          return valueOf(udTimer.getInterval());
      }
  
      /**
       * 取消定时器
       *
       * @param udTimer
       * @param varargs
       * @return
       */
      public LuaValue start(U udTimer, Varargs varargs) {
          final Long interval = LuaUtil.getTimeLong(varargs, 2);
          final Boolean repeat = LuaUtil.getBoolean(varargs, 3);
          return udTimer.start(interval, repeat);
      }
  
      /**
       * 取消定时器
       *
       * @param udTimer
       * @param varargs
       * @return
       */
      public LuaValue callback(U udTimer, Varargs varargs) {
          if (varargs.narg() > 1) {
              return setCallback(udTimer, varargs);
          } else {
              return getCallback(udTimer, varargs);
          }
      }
  
      public LuaValue setCallback(U udTimer, Varargs varargs) {
          final LuaFunction callback = varargs.optfunction(2, null);
          return udTimer.setCallback(callback);
      }
  
      public LuaValue getCallback(U udTimer, Varargs varargs) {
          return udTimer.getCallback();
      }
  
      /**
       * 取消定时器
       *
       * @param udTimer
       * @param varargs
       * @return
       */
      public LuaValue cancel(U udTimer, Varargs varargs) {
          return udTimer.cancel();
      }
  }
  