package com.reactnative.rtctxim.module;

import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.WritableArray;
import com.facebook.react.bridge.WritableMap;

import com.tencent.imsdk.TIMConversationType;
import com.tencent.imsdk.log.QLog;
import com.tencent.imsdk.v2.V2TIMCallback;
import com.tencent.imsdk.v2.V2TIMConversation;
import com.tencent.imsdk.v2.V2TIMConversationListener;
import com.tencent.imsdk.v2.V2TIMConversationResult;
import com.tencent.imsdk.v2.V2TIMManager;
import com.tencent.imsdk.v2.V2TIMMessage;
import com.tencent.imsdk.v2.V2TIMValueCallback;

import java.util.List;

import javax.annotation.Nonnull;

public class MessageModule extends BaseModule {
  V2TIMConversation conversation;
  V2TIMMessage lastMsg = null;

  public MessageModule(ReactApplicationContext reactContext) {
    super(reactContext);
  }

  @Nonnull
  @Override
  public String getName() {
    return "IMMessageModule";
  }

  @ReactMethod
  public void getConversationList(Promise promise) {

    try {
      V2TIMManager.getConversationManager()
        .getConversationList(0, 100, new V2TIMValueCallback<V2TIMConversationResult>() {
          @Override
          public void onError(int i, String s) {

          }

          @Override
          public void onSuccess(V2TIMConversationResult v2TIMConversationResult) {
            final WritableMap map = Arguments.createMap();
            WritableArray array = Arguments.createArray();
            List<V2TIMConversation> list = v2TIMConversationResult.getConversationList();
            if (list != null) {
              for (V2TIMConversation timConversation : list) {
                WritableMap objmap = Arguments.createMap();
                long unreadNum = timConversation.getUnreadCount();
                int type = timConversation.getType();
                V2TIMMessage lastMsg = timConversation.getLastMessage();
                //解析消息
                String peer = timConversation.getUserID();

                objmap.putString("unread", String.valueOf(unreadNum));
                objmap.putString("peer", peer);
                objmap.putInt("type", type);
                if (TIMConversationType.Group.equals(type)) {
                  String groupName = timConversation.getGroupID();
                  objmap.putString("name", groupName);
                } else {

                }

                array.pushMap(objmap);
              }
            }
            map.putInt("code", 0);
            map.putString("msg", "");
            map.putArray("data", array);
            promise.resolve(map);
          }
        });
    } catch (Exception e) {
      promise.reject(e.getMessage());
    }
  }

  @ReactMethod
  public void readMessage(String userId) {
    V2TIMManager.getMessageManager().markC2CMessageAsRead(userId, new V2TIMCallback() {
      @Override
      public void onError(int i, String s) {
        QLog.e(getName(), "设置已读消息 失败, code: " + i + "|desc: " + s);
      }

      @Override
      public void onSuccess() {
        QLog.d(getName(), "setReadMessage succ");
      }
    });
  }

  @ReactMethod
  public void getC2CHistoryMessageList(String userId, Promise promise) {
    V2TIMManager.getMessageManager().getC2CHistoryMessageList(userId, 1000, null, new V2TIMValueCallback<List<V2TIMMessage>>() {
      @Override
      public void onError(int i, String s) {
        promise.reject("-1", s);
      }

      @Override
      public void onSuccess(List<V2TIMMessage> v2TIMMessages) {
        final WritableMap map = Arguments.createMap();
         WritableArray writableArray = Arguments.createArray();

        for (V2TIMMessage message : v2TIMMessages) {
          WritableMap messageMap = Arguments.createMap();

          messageMap.putString("msg",message.getTextElem().getText());
          messageMap.putString("msgId",message.getMsgID());
          messageMap.putBoolean("isSelf",message.isSelf());
          messageMap.putInt("status",message.getStatus());
          messageMap.putString("sender",message.getSender());
          messageMap.putString("senderNickName",message.getNickName());
          messageMap.putString("senderAvatar",message.getFaceUrl());
          messageMap.putString("receiver",message.getUserID());
          messageMap.putBoolean("isRead",message.isPeerRead());
          writableArray.pushMap(messageMap);
        }
        map.putInt("code", 0);
        map.putString("msg", "");
        map.putArray("data", writableArray);
        promise.resolve(map);
      }
    });
  }

  @ReactMethod
  public void getConversation(String peer, Promise promise) {
      V2TIMManager.getConversationManager().getConversation(peer, new V2TIMValueCallback<V2TIMConversation>() {
        @Override
        public void onError(int i, String s) {
          promise.reject("-1", s);
        }

        @Override
        public void onSuccess(V2TIMConversation v2TIMConversation) {
          final WritableMap map = Arguments.createMap();
          map.putInt("code", 0);
          map.putString("msg", "");
          promise.resolve(map);
        }
      });
  }

  @ReactMethod
  public void sendMessage(String content, Promise promise) {
    try {
//      sendMessage(MessageInfo.MSG_TYPE_TEXT, content, null, null, null, null, null, null, null);
      promise.resolve("");
    } catch (Exception ex) {
      promise.reject("-1", ex.getMessage());
    }
  }

  @ReactMethod
  public void destroyConversation() {
    this.lastMsg = null;
    if (conversation != null) {
      this.conversation = null;
    }
  }
}
