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";
import { getToken } from "utilFuncs/utilFunctions";

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 token = getToken();
    const res = yield call(() =>
      post({
        url: Api.ads,
        data: action.payload,
        options: {
          "Content-Type": "application/json",
          "X-Requested-With": "XMLHttpRequest",
          headers: {
            Authorization: `Bearer ${getToken()}`,
          },
        },
      })
    );

    yield put(actions.createdAd({ data: res.data }));

    console.log("posted 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();
  }
}
