package cn.com.ty.lift.ud.neety.process;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

import cn.com.ty.lift.ud.chat.mapper.entity.ChatSessionEntity;
import cn.com.ty.lift.ud.neety.protocol.ChatMsgDTO;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

import cn.com.ty.lift.ud.neety.protocol.IMMessage;
import cn.com.ty.lift.ud.neety.protocol.IMP;
import cn.com.ty.lift.ud.neety.protocol.RoomVo;
import cn.com.ty.lift.ud.neety.support.WebSoketSupport;
import io.netty.channel.Channel;
import lombok.extern.slf4j.Slf4j;

/**
 * 用户登录websoket初始化操作类
 * 
 * @author sKing
 * @Date 2020年6月12日
 */
@Slf4j
public class LoginProcessor extends WebSoketSupport implements ProcessorInterface {

    /**
     * websoket消息处理
     * 
     * @param client
     * @param request
     */
    @Override
    public void process(Channel client, IMMessage request) {
        // 获取用户登录信息并放入链接中，
        String USER_NAME = request.getName();
        String USER_ID = request.getUserId();
        String AVATAR_URL = request.getAvatarUrl();

        client.attr(USERID).getAndSet(USER_ID);
        client.attr(USERNAME).getAndSet(USER_NAME);
        client.attr(HEAD_PIC).getAndSet(AVATAR_URL);
        client.attr(IP_ADDR).getAndSet(getAddress(client));

        //连接成功之后把链接与用户相关联，方便以后推送消息。
        userChannel.put(USER_ID, client);


//        // room为总得大房间，map中的key为小房间的房间号，值为房间内对应每个用户的对象
//        Map<String, List<RoomVo>> redisRoom = redis.get(MAX_ROOM, HashMap.class);
//        String txt = redis.getKey(MAX_ROOM);
//
//        Object ob = (txt == null || "null".equals(txt)) ? null : JSONObject.parseObject(txt, HashMap.class).get(room);
//
//
//
//
//
//
//        // 获取当前用户的小房间持有用户
//        Set<Channel> minRoom = new HashSet<>();
//        // 当前用户有效的房间号
//        List<String> DBsessionList = sessionService.findListByUserId(sendId);
//        for (String dbSession : DBsessionList) {
//            Set<HashMap<String, Channel>> userChannel = roomUserChannel.get(dbSession);
//
//            Set<HashMap<String, Channel>> newUserChannel = new HashSet<>();
//            if (null != userChannel && userChannel.size() > 0) {
//                for (HashMap<String, Channel> map : userChannel) {
//                    map.keySet().forEach(item -> {
//                        log.info("keySet():{}", item);
//                        if (item.equals(sendId)) {
//                            log.info("sendId:{}重连item存在:{}", sendId, item);
//                            map.put(item, client);
//                        } else if (!map.containsKey(sendId)) {
//                            log.info("重连sendId不存在:{}", sendId);
//                            map.put(sendId, client);
//
//                        }
//                        newUserChannel.add(map);
//                    });
//
//                }
//
//                roomUserChannel.put(dbSession, newUserChannel);
//            } else {
//                userChannel = new HashSet<>();
//                HashMap<String, Channel> map = new HashMap<>();
//                map.put(sendId, client);
//                userChannel.add(map);
//
//                // for (String session : DBsessionList) {
//                roomUserChannel.put(dbSession, userChannel);
//                // }
//            }
//
//        }
//
//        for (String dbSession : DBsessionList) {
//            for (Map<String, Channel> map : roomUserChannel.get(dbSession)) {
//                map.values().forEach(item -> {
//                    minRoom.add(item);
//                    log.info("房间里面的channel:{}", item.id());
//                });
//
//            }
//            roomUser.put(dbSession, minRoom);
//        }
//
//        Map allMsg = JSONObject.parseObject(txt, HashMap.class);
//        if (null != DBsessionList && null != allMsg) {
//            /** 房间号所对应的用户信息 */
//            List<RoomVo> voList = new ArrayList<>();
//            // List<RoomVo> unreadList = new ArrayList<>();
//            /** 未读消息列表 */
//            Map<String, List<RoomVo>> unreadMap = new HashMap<>();
//            /** 登录对象集合 */
//            Map<String, List<RoomVo>> loginMap = new HashMap<>();
//
//            for (String sessionKey : DBsessionList) {
//                Object keyValue = allMsg.get(sessionKey);
//                List<RoomVo> unreadList = new ArrayList<>();
//                RoomVo vo = new RoomVo(sendId, 0, username, avatarUrl, true, sessionKey);
//                if (null != keyValue) {
//
//                    // 对应房间的用户信息
//                    voList = JSONArray.parseArray(keyValue.toString(), RoomVo.class);
//                    for (RoomVo item : voList) {
//                        if (item.getUserId().equals(sendId)) {
//
//                            unreadList.add(item);
//                        }
//                    }
//
//                    if (null == ob) {// 拿到当前房间号
//                        voList.add(vo);
//                        redisRoom.put(room, voList);
//                    } else {
//
//                        voList = JSONArray.parseArray(ob.toString(), RoomVo.class);
//                        voList.add(vo);
//                        voList = voList.stream().filter(distinctByKey(RoomVo::getUserId)).collect(Collectors.toList()); // 去重
//                        // 设置该用户持有房间的在线状态
//                        for (RoomVo item : voList) {
//                            if (sendId.equals(item.getUserId())) {
//                                item.setAvatarUrl(avatarUrl);
//                                item.setFlag(true);
//                                item.setName(username);
//                            }
//                        }
//
////                        redisRoom.put(sessionKey, voList);
//                    }
//                    // UNreadList.addAll(unreadList);
//
//                    // 组装在线消息
//                    String loginList = JSONObject.toJSONString(voList);
//
//
//                  /*  for (RoomVo item : voList) {
//                        if (sendId.equals(item.getUserId())) {
//                            item.setAvatarUrl(avatarUrl);
//                            item.setFlag(true);
//                            item.setName(username);
//                        }
//                    }*/
//                    unreadMap.put(sessionKey, unreadList);
//                    loginMap.put(sessionKey, voList);
//
//                    // 向我的所有房间发送上线消息
//                    for (Channel item : roomUser.get(sessionKey)) {
//
//                        if (item != client) {
//                            // 自定义系统消息格式
//                            IMMessage requestSystem = new IMMessage(IMP.SYSTEM.getName(), sysTime(), 0, loginList);
//                            sendMessage(item, requestSystem);
//                        }
//                    }
//
//                    // 写入缓存对象
//                    redisRoom.put(sessionKey, voList);
//                }
//
//            }
//
//            /** 向自己发送消 */
//            // 组装 UNREAD消息
//            request = new IMMessage(IMP.UNREAD.getName(), sysTime(), 0, JSONObject.toJSONString(unreadMap));
//            // sendOnline(client, JSONObject.toJSONString(loginMap));
//            sendMessage(client, request);
//
//            // 更新缓存中所有房间的未读消息列表,将未读消息置空
//            for (RoomVo item : voList) {
//                if (item.getMsgList().size() > 0 && item.getUserId().equals(sendId)) {
//                    item.setMsgList(null);// 将未读消息置空
//                }
//            }
//        }
//
//        // 更新缓存
//        redis.setValue(MAX_ROOM, redisRoom);
    }

}
