import { call, put, select } from 'redux-saga/effects';
import { get, post } from 'services/requests';
import { Api } from 'routes/Api';
import * as actions from 'lib/redux/actions/messages-actions';
import { message } from 'antd';
import { Action } from 'lib/types/interfaces';
import isEmpty from 'lodash/isEmpty';



export function* sendMessage(action: Action) {
	try {
		const res = yield call(() => post({
			url: Api.messages,
			data: action.payload
		}));

		const getDataToAlter = state => state.chats;
		const dataToAlter = yield select(getDataToAlter);

		if (!isEmpty(dataToAlter?.data)) {
			dataToAlter?.data?.push(res.data);
		} else {
			dataToAlter.data = [res.data];
		}

		message.success('Chat sent');
		yield put(actions.sentMessage({ data: dataToAlter }));
	}
	catch (error) {
		message.error('An error occured when sending your message.');
		if (error?.response?.status == 422) {
			return yield put(actions.failedSendMessage({ error: error.response.data.errors }));
		}
		return yield put(actions.failedSendMessage({ error }));

		yield put(actions.failedSendMessage({ error }));
	}
}


export function* fetchChat(action: Action) {
	try {
		const res = yield call(() => get({
			url: Api.messages + '/' + action.awebkeys,
		}));

		const getUnreadMessages = state => state.unread_messages;
		let unread_messages = yield select(getUnreadMessages);
		unread_messages = unread_messages.filter(um => um.thread_id !== res.data[0].thread_id);

		yield put(actions.fetchedChat({ data: res.data }));
		yield put(actions.setUnreadMessages({ data: unread_messages }));
	}
	catch (error) {
		if (error?.response?.status == 422) {
			message.error('Unable to fetch previous conversations');
			return yield put(actions.failedFetchChat({ error: error.response.data.errors }));
		}
		return yield put(actions.failedFetchChat({ error: error }));
	}
}


export function* fetchMessages() {
	try {
		const res = yield call(() => get({
			url: Api.messages,
		}));

		const unread_messages = res.data.filter(msg => !msg.recipient_read);

		yield put(actions.setUnreadMessages({ data: unread_messages }));

		yield put(actions.fetchedMessages({ data: res.data }));
	}
	catch (error) {
		if (error?.response?.status == 422) {
			message.error('Unable to fetch your conversations');
			return yield put(actions.failedFetchMessages({ error: error.response.data.errors }));
		}
		return yield put(actions.failedFetchMessages({ error }));
	}
}




