import { call, put, select } from 'redux-saga/effects';
import { get, post, del } from '@services/requests';
import { get as get2 } from '@services/requests-v2';
import { Api } from '@routes/Api';
import api from '@routes/api-v2';
import { handleError } from '@modules/error-handler';
import { Swal } from '@lib/swal/swal';
import * as actions from '@lib/redux/actions/ads-actions';
import omit from 'lodash/omit';
import { message } from 'antd';


export function* fetchAd(action): Generator {
	try {
		const res: Record<string, any> = yield call(() => get({
			url: Api.ads + '/' + action.slug
		}));

		yield put(actions.fetchedAd({ data: res.data }));

	}
	catch (error) {
		yield put(actions.failedFetchAd({ error: error.message }));

		handleError(error);
	}
}

export function* fetchMultipleAds(action): Generator {
	try {
		let res;
		if (action.data?.slug) {
			res = yield call(() => get2({
				url: api('ads.show', {slug: action.data.slug}, action.options)
			}));
			yield put(actions.fetchedMultipleAds({ data: {
				...res.pagination,
				data: res.data,
			} }));
		} else {
			res = yield call(() => get2({
				url: api('ads.index', null, action.options)
			}));
			yield put(actions.fetchedMultipleAds({ data: {
				...res.pagination,
				data: res.data,
			} }));
		}

	}
	catch (error) {
		yield put(actions.failedFetchMultipleAds({ error: error.message }));

		handleError(error);
	}
}



export function* createAd(action) {
	try {
		const res = yield call(() => post({
			url: Api.ads,
			data: action.payload
		}));


		yield put(actions.createdAd({ data: res.data }));

		Swal.fire({
			title: 'Success! New Ad Created',
			text: 'Your ad has been created. Kindly allow up to 24 hours for your ad to be reviewed.',
			// imageUrl: res.data.picture,
			imageWidth: 400,
			imageHeight: 200,
			imageAlt: res.data.name,
		}).then(() => window.location.href = action.payload.redirect_url);

	}
	catch (error) {
		if (error.response.status == 422) {
			message.error('Kindly review the data you are submitting for errors');
			return yield put(actions.failedCreateAd({ error: error.response.data.errors }));
		}
		if (error.response.status == 403) {
			yield put(actions.failedCreateAd({ error: error?.response?.data?.message }));
			handleError(error?.response?.data?.message, { allowNotify: true });
			return;
		}
		if (error.response.status == 401) {
			yield put(actions.failedCreateAd({ error: 'You have to login first' }));
			handleError('You have to login first', { allowNotify: true });
			return;
		}

		yield put(actions.failedCreateAd({ error: error.message }));
		return handleError(error);
	}
}




export function* deleteAd(action) {
	const hide = message.loading('Deleting ad');
	try {
		yield call(() => del({
			url: Api.ads + '/' + action.id
		}));

		const getDataToAlter = state => state[action.dataToAlter];

		let dataToAlter = yield select(getDataToAlter);

		switch (action.dataToAlter) {
		case 'shop':
			dataToAlter['ads'] = dataToAlter.ads.filter(ad => ad.id !== action.id);
			break;
		default:
			dataToAlter = dataToAlter.filter(ad => ad.id !== action.id);
			break;
		}

		const data = {};
		data[action.dataToAlter] = dataToAlter;

		yield put(actions.deletedAd({ data: data }));

		message.success('Ad deleted');
	}
	catch (error) {
		yield put(actions.failedDeleteAd({ error: error.message }));
		message.error('Unable to delete ad');
	}
	finally {
		hide();
	}
}


export function* updateAd(action) {
	const hide = message.loading('Updating ad details');
	try {
		const res = yield call(() => post({
			url: Api.ads + '/' + action.payload.id,
			data: action.payload
		}));

		// if(action.payload.get('shopSlug')) {
		// 	message.success('Ad details updated');
		// 	yield put(fetchShop(action.payload.get('shopSlug')));
		// 	return;
		// }
		// if(action.payload.get('shopSlug')) {
		// 	message.success('Ad details updated');
		// 	yield put(fetchMyAds());
		// 	return;
		// }
		// const getDataToAlter = state => state[action.uaDataToAlter];

		// let uaDataToAlter = yield select(getDataToAlter);

		// uaDataToAlter = uaDataToAlter.map(ad => {
		// 	if (ad.id == res.data.id) ad = res.data;
		// 	return ad;
		// });

		// const data = {};
		// data[action.uaDataToAlter] = uaDataToAlter;

		yield put(actions.updatedAd({ data: res.data }));

		Swal.fire({
			title: res.data.name,
			text: 'Ad updated',
			imageUrl: res.data.picture,
			imageWidth: 400,
			imageHeight: 200,
			imageAlt: res.data.name,
		}).then(() => window.location.href = action.payload.redirect_url);

		// window.location.href = '';
	}
	catch (error) {
		if (error?.response?.status == 422) {
			const status = {};
			status[action.uaDataToAlter] = { error: error.response.data?.errors };
			// status['status']['error'] = error.response.data.errors;
			yield put(actions.failedUpdateAd({ error: { status: status } }));
		}
		yield put(actions.failedUpdateAd({ error: error }));
		message.error('Unable to update ad');
	}
	finally {
		hide();
	}
}
