import storage from '@/utils/storage'
import {
	ACCESS_TOKEN,
	USER_ID
} from '@/store/mutation-types'
import io from '@hyoga/uni-socket.io';
import {
	isEmpty
} from '@/utils/util'
import Vue from 'vue'
import {
	socketUrl
} from "@/config.js"
import {
	getConversationList,
	sendMessage,
	getFriemdMessages,
	postMarkRead,
	removeConversation
} from '@/api/chat.js'
import {
	getUserDetail
} from '@/api/love-user-profile.js'
import {getArticleCommentUnreadCount} from '@/api/article-comment.js'
import {pageLike} from '@/api/user-like.js'
import {pageLook} from '@/api/user-look.js'
const theme = {
	state: {
		conversations: {},
		friends: [],
		unReadCommentNumber: 0,
		unReadLikeNumber: 0,
		unReadLikeMeNumber: 0,
		unReadLookNumber: 0,
	},

	mutations: {
		ADD_FRIEND(state, userInfo) {
			if (!state.conversations[userInfo.userId]) {
				Vue.set(state.conversations, userInfo.userId, {
					friendInfo: userInfo,
					messages: [],
					unRead: 0,
					updateTime: new Date()
				});
			}
		},
		REMOVE_FRIEND(state, userId) {
			if (state.conversations[userId]) {
				Vue.delete(state.conversations,userId)
			}
		},
		ADD_MESSAGE(state, {
			userId,
			message,
			friendInfo
		}) {

			if (!state.conversations[userId]) {

				// todo getFriendInfo
				Vue.set(state.conversations, userId, {
					messages: [],
					unRead: 0,
					friendInfo,
					updateTime: new Date()
				});
			}
			state.conversations[userId].messages.push(message);
			// console.log(message.formUserId, storage.get(USER_ID));
			if (message.formUserId != storage.get(USER_ID)) {
				state.conversations[userId].unRead++
			}
			state.conversations[userId].updateTime = new Date()
			console.log(message.type);
			if (message.type == 'image') {
				state.conversations[userId].content = '[图片]'
			} else if (message.type == 'card') {
				state.conversations[userId].content = '[卡片]'
			} else {
				state.conversations[userId].content = message.content
			}
			
			uni.$emit('message' + userId, message)
		},

		SET_CONVERSATION(state, data) {
			state.conversations = data
		},

		SET_MESSAGES(state, {
			friendId,
			messages
		}) {
			state.conversations[friendId].messages = messages
		},
		MARK_READ(state, friendId) {
			state.conversations[friendId].unRead = 0
		},
		SET_UNREAD_COMMENT_NUMBER(state, number) {
			if(number < 0) {
				return
			}
			state.unReadCommentNumber = number
		},
		SET_UNREAD_LIKE_NUMBER(state, number) {
			if(number < 0) {
				return
			}
			state.unReadLikeNumber = number
		},
		SET_UNREAD_LIKE_ME_NUMBER(state, number) {
			if(number < 0) {
				return
			}
			state.unReadLikeMeNumber = number
		},
		SET_UNREAD_LOOK_NUMBER(state, number) {
			if(number < 0) {
				return
			}
			state.unReadLookNumber = number
		}
	},

	actions: {
		async RemoveFriend({
			state,
			commit
		}, friendId){
			removeConversation(state.conversations[friendId].id)
			commit('REMOVE_FRIEND', friendId);
			
		},

		async SendMessage({
			commit
		}, data) {
			await sendMessage(data)
			data.createTime = new Date()
			commit('ADD_MESSAGE', {
				userId: data.toUserId,
				message: data
			})
		},
		async LoadFriendMessage({
			commit
		}, friendId) {
			const res = await getFriemdMessages(friendId)
			commit('SET_MESSAGES', {
				friendId: friendId,
				messages: res.data
			})

		},
		ConnectSocket({
			state,
			commit
		}, data) {
			console.log("ConnectSocket");
			const socket = io(socketUrl, {
				//这里是连接时所携带的数据
				query: {
					token: storage.get(ACCESS_TOKEN),
					userId: storage.get(USER_ID)
				},
				//连接方式
				transports: ['websocket', 'polling'],
				//过期时间
				timeout: 5000,
			});

			socket.on('connect', () => {
				const {
					id
				} = socket
				console.log("socketio 已连接 clientId" + id);
				uni.socket = socket
				// 获取聊天记录
				getConversationList().then(res => {
					const data = {}
					res.data.forEach(item => {
						item.messages = []
						if(item.friendInfo){
							data[item.friendInfo.userId] = item
						}
					})
					console.log('SET_CONVERSATION', data);
					commit('SET_CONVERSATION', data)
				}).catch(err=>{
					console.log(err)
				})
				// 获取恋爱圈未读消息
				getArticleCommentUnreadCount().then(res=>{
					commit('SET_UNREAD_COMMENT_NUMBER', res.data)
				})
				// 喜欢我和我喜欢
				pageLike({
					sceneType: 'UN_READ_USER_LIKE'
				}).then(res=>{
					commit('SET_UNREAD_LIKE_NUMBER', res.data.count)
				})
				pageLike({
					sceneType: 'UN_READ_USER_LIKE_ME'
				}).then(res=>{
					commit('SET_UNREAD_LIKE_ME_NUMBER', res.data.count)
				})
				pageLook({
					sceneType: 'UN_READ_USER_LOOK'
				}).then(res=>{
					commit('SET_UNREAD_LOOK_NUMBER', res.data.count)
				})
			})

			socket.on('message', (data) => {
				if (!state.conversations[data.formUserId]) {
					getUserDetail(data.formUserId).then(res => {
						commit('ADD_MESSAGE', {
							userId: data.formUserId,
							message: data,
							friendInfo: res.data.userInfo
						})
					})
				} else {
					commit('ADD_MESSAGE', {
						userId: data.formUserId,
						message: data
					})
				}
			})

			socket.on('pyq', (data) => {
				commit('SET_UNREAD_COMMENT_NUMBER', data)
			})
			
			socket.on('likeme', (data) => {
				console.log("likeme",state.unReadLikeMeNumber , data);
				commit('SET_UNREAD_LIKE_ME_NUMBER', state.unReadLikeMeNumber + data)
			})
			
			socket.on('look', (data) => {
				console.log("look",state.unReadLookNumber , data);
				commit('SET_UNREAD_LOOK_NUMBER', state.unReadLookNumber + data)
			})
			
			
			
			

		},
		MarkRead({
			state,
			commit
		}, friendId) {
			postMarkRead({
				id: state.conversations[friendId].id
			})
			commit('MARK_READ', friendId)
		},

		CloseSocket({
			state,
			commit
		}, data) {
			if (uni.socket) {
				uni.socket.close()
			}
		}

	}
}

export default theme