import { call, put, select } from 'redux-saga/effects';
import { del, post } from 'services/requests';
import { Api } from 'routes/Api';
import { handleError } from 'modules/error-handler';
import * as actions from 'lib/redux/actions/follows-actions';
import { fetchedMultipleShops } from '../actions/shops-actions';
import { showGlobalLogin } from '../actions/global-helpers-actions';

export function* doFollow(action): Generator {
	try {
		const res: Record<string, any> = yield call(() => post({
			url: Api.follows,
			data: action.payload
		}));

		if (action.payload.model_type == 'shops') {
			const getDataToAlter = state => state.shops;
			const dataToAlter = yield select(getDataToAlter);
			dataToAlter['data'] = dataToAlter['data']?.map(shop => {
				if (shop.id == action.payload.model_id) shop.user_follows = res.data;
				return shop;
			});
			yield put(fetchedMultipleShops({ data: dataToAlter }));
		}
		if (action.payload.model_type == 'shop') {
			const getDataToAlter = state => state.shop;
			const dataToAlter = yield select(getDataToAlter);
			dataToAlter['user_follows'] = res.data;
			yield put(fetchedMultipleShops({ data: dataToAlter }));
		}
		if (action.payload.model_type == 'user') {
			const getDataToAlter = state => state.public_user;
			const dataToAlter = yield select(getDataToAlter);
			dataToAlter['user_follows'] = res.data;
			yield put(fetchedMultipleShops({ data: dataToAlter }));
		}

		yield put(actions.didFollow({ data: res.data }));
	}
	catch (error) {
		yield put(actions.failedDoFollow({ error: error.message }));

		if (error.response?.status == 401) return yield put(showGlobalLogin());

		handleError(error);
	}
}

export function* undoFollow(action): Generator {
	try {
		const res = yield call(() => del({
			url: Api.follows + '/' + action.payload.entity.user_follows.id
		}));

		if (action.payload.model_type == 'shops') {
			const getDataToAlter = state => state.shops;
			const dataToAlter = yield select(getDataToAlter);
			dataToAlter['data'] = dataToAlter['data'].map(shop => {
				if (shop.id == action.payload.model_id) shop.user_follows = res['data'];
				return shop;
			});
			yield put(fetchedMultipleShops({ data: dataToAlter }));
		}
		if (action.payload.model_type == 'shop') {
			const getDataToAlter = state => state.shop;
			const dataToAlter = yield select(getDataToAlter);
			dataToAlter['user_follows'] = res['data'];
			yield put(fetchedMultipleShops({ data: dataToAlter }));
		}
		if (action.payload.model_type == 'user') {
			const getDataToAlter = state => state.public_user;
			const dataToAlter = yield select(getDataToAlter);
			dataToAlter['user_follows'] = res['data'];
			yield put(fetchedMultipleShops({ data: dataToAlter }));
		}

		yield put(actions.undidFollow({ data: res['data'] }));
	}
	catch (error) {
		if (error.response?.status == 401) return yield put(showGlobalLogin());

		yield put(actions.failedUndoFollow({ error: error.message }));

		handleError(error);
	}
}
