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.net;
  
  import com.taobao.luaview.fun.base.BaseMethodMapper;
  import com.taobao.luaview.fun.mapper.LuaViewLib;
  import com.taobao.luaview.userdata.net.UDHttp;
  import com.taobao.luaview.util.LuaUtil;
  
  import org.luaj.vm2.LuaFunction;
  import org.luaj.vm2.LuaTable;
  import org.luaj.vm2.LuaValue;
  import org.luaj.vm2.Varargs;
  
  import java.util.List;
  
  /**
   * http 接口封装
   *
   * @author song
   * @date 15/8/21
   */
  @LuaViewLib(revisions = {"20170306已对标", "iOS不支持对象调用，只支持创建方式调用，待统一"})
  public class HttpMethodMapper<U extends UDHttp> extends BaseMethodMapper<U> {
  
      private static final String TAG = "HttpMethodMapper";
      private static final String[] sMethods = new String[]{
              "url",//0
              "method",//1
              "retryTimes",//2
              "timeout",//3
              "params",//4
              "callback",//5
              "request",//6
              "cancel",//7
              "get",//8
              "post"//9
      };
  
      @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 url(target, varargs);
              case 1:
                  return method(target, varargs);
              case 2:
                  return retryTimes(target, varargs);
              case 3:
                  return timeout(target, varargs);
              case 4:
                  return params(target, varargs);
              case 5:
                  return callback(target, varargs);
              case 6:
                  return request(target, varargs);
              case 7:
                  return cancel(target, varargs);
              case 8:
                  return get(target, varargs);
              case 9:
                  return post(target, varargs);
          }
          return super.invoke(code, target, varargs);
      }
  
      //--------------------------------------- API --------------------------------------------------
  
  
      /**
       * 设置请求url
       *
       * @param http
       * @param varargs
       * @return
       */
      public LuaValue url(U http, Varargs varargs) {
          if (varargs.narg() > 1) {
              return setUrl(http, varargs);
          } else {
              return getUrl(http, varargs);
          }
      }
  
      public LuaValue setUrl(U http, Varargs varargs) {
          final String url = varargs.optjstring(2, null);
          return http.setUrl(url);
      }
  
      public LuaValue getUrl(U http, Varargs varargs) {
          return valueOf(http.getUrl());
      }
  
      /**
       * 请求方法
       *
       * @param http
       * @param varargs
       * @return
       */
      public LuaValue method(U http, Varargs varargs) {
          if (varargs.narg() > 1) {
              return setMethod(http, varargs);
          } else {
              return getMethod(http, varargs);
          }
      }
  
      public LuaValue setMethod(U http, Varargs varargs) {
          final String method = varargs.optjstring(2, UDHttp.METHOD_POST);
          return http.setMethod(method);
      }
  
      public LuaValue getMethod(U http, Varargs varargs) {
          return valueOf(http.getMethod());
      }
  
      /**
       * 重试次数
       *
       * @param http
       * @param varargs
       * @return
       */
      public LuaValue retryTimes(U http, Varargs varargs) {
          if (varargs.narg() > 1) {
              return setRetryTimes(http, varargs);
          } else {
              return getRetryTimes(http, varargs);
          }
      }
  
      public LuaValue setRetryTimes(U http, Varargs varargs) {
          final int retryTimes = varargs.optint(2, UDHttp.DEFAULT_RETRY_TIMES);
          return http.setRetryTimes(retryTimes);
      }
  
      public LuaValue getRetryTimes(U http, Varargs varargs) {
          return valueOf(http.getRetryTimes());
      }
  
      /**
       * 延时
       *
       * @param http
       * @param varargs
       * @return
       */
      public LuaValue timeout(U http, Varargs varargs) {
          if (varargs.narg() > 1) {
              return setTimeout(http, varargs);
          } else {
              return getTimeout(http, varargs);
          }
      }
  
      public LuaValue setTimeout(U http, Varargs varargs) {
          final int timeout = varargs.optint(2, UDHttp.DEFAULT_TIMEOUT);
          return http.setTimeout(timeout);
      }
  
      public LuaValue getTimeout(U http, Varargs varargs) {
          return valueOf(http.getTimeout());
      }
  
      /**
       * 参数
       *
       * @param http
       * @param varargs
       * @return
       */
      public LuaValue params(U http, Varargs varargs) {
          if (varargs.narg() > 1) {
              return setParams(http, varargs);
          } else {
              return getParams(http, varargs);
          }
      }
  
      public LuaValue setParams(U http, Varargs varargs) {
          final LuaTable params = http.opttable(2, null);
          return http.setParams(params);
      }
  
      public LuaValue getParams(U http, Varargs varargs) {
          return http.getParams();
      }
  
      /**
       * 回调
       *
       * @param http
       * @param varargs
       * @return
       */
      public LuaValue callback(U http, Varargs varargs) {
          if (varargs.narg() > 1) {
              return setCallback(http, varargs);
          } else {
              return getCallback(http, varargs);
          }
      }
  
      public LuaValue setCallback(U http, Varargs varargs) {
          final LuaFunction callback = varargs.optfunction(2, null);
          return http.setCallback(callback);
      }
  
      public LuaValue getCallback(U http, Varargs varargs) {
          return http.getCallback();
      }
  
      /**
       * 请求
       *
       * @param http
       * @param varargs
       * @return
       */
      public LuaValue request(U http, Varargs varargs) {
          return http.request();
      }
  
      /**
       * 取消
       *
       * @param http
       * @param varargs
       * @return
       */
      public LuaValue cancel(U http, Varargs varargs) {
          return http.cancel();
      }
  
      /**
       * get请求
       *
       * @param http
       * @param varargs
       * @return
       */
      public LuaValue get(U http, Varargs varargs) {
          final String url = LuaUtil.getString(varargs, 2);
          final LuaTable params = LuaUtil.getTable(varargs, 3, 2);
          final LuaFunction callback = LuaUtil.getFunction(varargs, 4, 3, 2);
          return http.get(url, params, callback);
      }
  
      /**
       * pos 请求
       *
       * @param http
       * @param varargs
       * @return
       */
      public LuaValue post(U http, Varargs varargs) {
          final String url = LuaUtil.getString(varargs, 2);
          final LuaTable params = LuaUtil.getTable(varargs, 3, 2);
          final LuaFunction callback = LuaUtil.getFunction(varargs, 4, 3, 2);
          return http.post(url, params, callback);
      }
  }
  