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.userdata.net;
  
  import com.taobao.luaview.userdata.base.BaseLuaTable;
  import com.taobao.luaview.userdata.kit.UDData;
  import com.taobao.luaview.util.LuaUtil;
  
  import org.luaj.vm2.Globals;
  import org.luaj.vm2.LuaTable;
  import org.luaj.vm2.LuaValue;
  import org.luaj.vm2.Varargs;
  import org.luaj.vm2.lib.VarArgFunction;
  
  import java.util.List;
  import java.util.Map;
  
  /**
   * Http 返回数据
   * @author song 
   */
  public class UDHttpResponse extends BaseLuaTable {
      private byte[] mData;
      private int mStatusCode = -1;
      private String mResponseMsg;
      private Map<String, List<String>> mHeaders;
  
      public UDHttpResponse(Globals globals, LuaValue metatable, Varargs varargs) {
          super(globals, metatable, varargs);
          init();
      }
  
      private void init() {
          set("data", new data());
          set("code", new code());
          set("header", new header());
          set("message", new message());//TODO iOS无
      }
  
      public UDHttpResponse setData(byte[] mData) {
          this.mData = mData;
          return this;
      }
  
      public LuaValue getData() {
          return mData != null ? new UDData(getGlobals(), getmetatable(), null).append(mData) : LuaValue.NIL;
      }
  
      public UDHttpResponse setResponseMsg(String message) {
          this.mResponseMsg = message;
          return this;
      }
  
      public String getResponseMsg() {
          return mResponseMsg;
      }
  
      public UDHttpResponse setStatusCode(int statusCode) {
          this.mStatusCode = statusCode;
          return this;
      }
  
      public int getStatusCode() {
          return mStatusCode;
      }
  
      public UDHttpResponse setHeaders(Map<String, List<String>> headers) {
          this.mHeaders = headers;
          return this;
      }
  
      public LuaValue getHeaders(String name) {
          if (mHeaders != null) {
              if (name != null) {//获取某一个header
                  return LuaUtil.toTable(mHeaders.get(name));
              } else {//获取所有的header
                  return LuaUtil.toTable(mHeaders);
              }
          }
          return NIL;
      }
  
      /**
       * convert response to LuaTable
       *
       * @return
       */
      public LuaTable toTable() {
          LuaTable result = new LuaTable();
          result.set("data", new UDData(getGlobals(), getmetatable(), null).append(mData));
          result.set("code", LuaValue.valueOf(mStatusCode));
          result.set("header", LuaUtil.toTable(mHeaders));
          result.set("message", LuaValue.valueOf(mResponseMsg));
          return result;
      }
  
      //-----------------------------------------functions--------------------------------------------
  
      /**
       * 获取数据
       */
      class data extends VarArgFunction {
          @Override
          public Varargs invoke(Varargs args) {
              return getData();
          }
      }
  
      /**
       * 错误码
       */
      class code extends VarArgFunction {
          @Override
          public Varargs invoke(Varargs args) {
              return valueOf(mStatusCode);
          }
      }
  
      /**
       * 请求头
       */
      class header extends VarArgFunction {
          @Override
          public Varargs invoke(Varargs args) {
              return getHeaders(args.narg() > 1 ? args.optjstring(2, null) : null);
          }
      }
  
      /**
       * 错误信息
       */
      class message extends VarArgFunction {
          public Varargs invoke(Varargs args) {
              return valueOf(mResponseMsg);
          }
      }
  }