import { CancelTokenSource } from 'axios';
import { isNil } from 'lodash';
import { api } from 'src/boot/axios';
import { notifyError } from 'src/helpers';
import { run } from '../helpers';

let cancelToken: CancelTokenSource | null = null;

export async function tsGetBankAccounts({ commit }, params) {
  return api
    .get(`/captacion/${params.id}/cuentas_bancarias`)
    .then((response) => {
      const items = response?.data;
      commit('setCaptacionBankAccounts', items);
      return items;
    })
    .catch((err) => {
      notifyError(err);
      commit('setCaptacionBankAccounts', []);
      return [];
    });
}

export async function tsUpdateDatosContacto(ctx, payload) {
  return api
    .post('/adminerp/captacion_contacto/update', payload)
    .then((response) => {
      return response.data;
    })
    .catch((err) => {
      notifyError(err);
      return false;
    });
}

export async function tsCreateContactoReArticulo(ctx, payload) {
  return api
    .post('/adminerp/contacto_re_articulo/create', payload)
    .then((response) => {
      return response.data;
    })
    .catch((err) => {
      notifyError(err);
      return false;
    });
}

export async function tsUpdateContactoReArticulo(ctx, payload) {
  return api
    .put(`adminerp/contacto_re_articulo/${payload.ID_CONTACTO_RE_ARTICULO}`, payload)
    .then((response) => {
      return response.data;
    })
    .catch((err) => {
      notifyError(err);
      return false;
    });
}

export async function tsRevisionAdministrativa(ctx, id: number) {
  return api
    .put(`/captacion/${id}/revisado_admin`, id)
    .then((response) => {
      return response.data;
    })
    .catch((err) => {
      notifyError(err);
      return false;
    });
}

export async function tsRolToggleContactoReArticulo(ctx, payload) {
  return api
    .post(`adminerp/contacto_re_articulo/rol_toggle`, payload)
    .then((response) => {
      return response.data;
    })
    .catch((err) => {
      notifyError(err);
      return false;
    });
}

export async function tsDeleteContactoReArticulo(ctx, payload) {
  return api
    .post('/adminerp/contacto_re_articulo/delete', payload)
    .then((response) => {
      return response.data;
    })
    .catch((err) => {
      console.log(err);
      notifyError(err);
      return false;
    });
}

export async function tsUpdateDatosContactoByToken(ctx, payload) {
  return api
    .post('/adminerp/public/captacion_estudio_update', payload)
    .then((response) => {
      return response.data;
    })
    .catch((err) => {
      notifyError(err);
      return false;
    });
}

export async function tsCreateIncidencia(ctx, payload) {
  return api
    .post('/adminerp/captacion/incidencia', payload)
    .then((response) => {
      return response.data;
    })
    .catch((err) => {
      notifyError(err);
      return false;
    });
}

export async function tsResolverIncidenciaContacto(ctx, payload) {
  return api
    .post('/adminerp/public/captacion_resolver_contacto_incidencias', payload)
    .then((response) => {
      return response.data;
    })
    .catch((err) => {
      notifyError(err);
      return false;
    });
}

export async function tsCaptacionDocumentacionSubida(ctx, payload) {
  return api
    .post('/adminerp/public/captacion_documentacion_subida', payload)
    .then((response) => {
      return response.data;
    })
    .catch((err) => {
      notifyError(err);
      return false;
    });
}

export async function tsCaptacionUploadDocumento(ctx, payload) {
  return api
    .post('/adminerp/public/captacion_upload_documento', payload)
    .then((response) => {
      return response.data;
    })
    .catch((err) => {
      notifyError(err);
      return false;
    });
}

export async function tsCaptacionCancelar(ctx, payload) {
  return api
    .post('/adminerp/public/captacion_estudio_delete', payload)
    .then((response) => {
      return response.data;
    })
    .catch((err) => {
      notifyError(err);
      return false;
    });
}

export async function tsUpdateDatosComerciales(ctx, payload) {
  return api
    .post('/adminerp/captacion_datos_comerciales/update', payload)
    .then((response) => {
      return response.data;
    })
    .catch((err) => {
      notifyError(err);
      return false;
    });
}

export async function tsCaptacionEstudioGetStats(ctx, payload) {
  return run(api.get('/captacion_estudios_stats', payload));
}

export async function tsCaptacionGuardarSeguimiento(ctx, payload) {
  return api
    .post('/adminerp/captacion_seguimiento/guardar', payload)
    .then((response) => {
      return response.data;
    })
    .catch((err) => {
      notifyError(err);
      return false;
    });
}

export async function tsCaptacionEstudioGetSeguimiento(ctx, payload) {
  return api
    .post('/adminerp/captacion_seguimiento/get', payload)
    .then((response) => {
      return response.data;
    })
    .catch((err) => {
      notifyError(err);
      return false;
    });
}

export async function tsCaptacionEstudioGetDatosAdicionales(ctx, payload) {
  return api
    .post('/adminerp/captacion_datos_adicionales/get', payload)
    .then((response) => {
      return response.data;
    })
    .catch((err) => {
      notifyError(err);
      return false;
    });
}

export async function tsCaptacionUploadDocumentacion(ctx, payload) {
  return run(api.post('/adminerp/captacion/upload_documento', payload));
}

export async function tsUpdateAprobacionDocumento(ctx, payload) {
  return run(api.post('/adminerp/captacion/update_aprobacion_documento', payload));
}

export async function tsCaptacion_getByUser(ctx, data) {
  // ID_USUARIO
  return api.post('captacion/getByUser', data).then((response) => {
    return response.data;
  });
}

export async function tsCaptacionListFind(ctx, data) {
  return api.post('captacion/list/find', data).then((response) => {
    return response.data;
  });
}

export async function tsCaptacion_getById(ctx, data) {
  return api.post('/adminerp/captacion/one/' + data.ID_CAPTACION, data).then((response) => {
    return response.data;
  });
}

export async function tsCaptacion_getLM(ctx, data) {
  return api.post('/adminerp/vlinmer_byemp/list/all', data).then((response) => {
    return response.data;
  });
}

export async function tsCaptacionAdd(ctx, d) {
  return api
    .post('/adminerp/captacion/add', d.data)
    .then((response) => {
      return response;
    })
    .catch((err) => {
      notifyError(err, 'Ocurrió un error inesperado durante el proceso');
      return false;
    });
}

export async function tsCaptacionUpdate(ctx, d) {
  return api
    .patch('/adminerp/captacion/update/' + d.ID_CAPTACION, d.data)
    .then((response) => {
      return response;
    })
    .catch((err) => {
      notifyError(err, 'Ocurrió un error inesperado durante el proceso');
      return false;
    });
}

/*
CAPTACIONES VISITAS
*/
export async function tsCaptacionVisitas_GetByIdCaptacion(ctx, data) {
  return api.post('/adminerp/visitas_captacion/by_idCaptacion', data).then((response) => {
    return response.data;
  });
}

export async function tsCaptacionByZonas(ctx, data) {
  return api.post('adminerp/captacion/list/captacion_byzonas', data).then((response) => {
    return response.data;
  });
}

export async function crearUsuarioCaptado(xtx, data) {
  return api
    .post('/captacion/usuario', data)
    .then((response) => {
      return response.data;
    })
    .catch((err) => {
      notifyError(err);
      return false;
    });
}

export async function fetchCaptacionByToken(ctx, token: string) {
  ctx.commit('setLoading', true);
  ctx.commit('setToken', token);
  return run(api.get('/public/captacion_estudio', { params: { token } }))
    .then((data) => {
      ctx.commit('setData', data);
      return data;
    })
    .finally(() => ctx.commit('setLoading', false));
}

export async function fetchNotifications(ctx, token) {
  ctx.commit('setLoadingNotifications', true);
  if (!token) {
    token = ctx.state.token;
  }
  return run(api.get('/public/captacion_notifications', { params: { TOKEN: token, descending: true } }), null, 'Ocurrió un error al obtener las notificaciones')
    .then((data) => ctx.commit('setNotifications', data?.items || []))
    .finally(() => ctx.commit('setLoadingNotifications', false));
}

export async function updateNotification(ctx, { id, data }) {
  return run(api.put('/public/captacion_notifications/' + id, data), null, 'Ocurrió un error al actualizar la notificación').then((data) => ctx.dispatch('fetchNotifications'));
}

// ACCIONES QUE CAMBIAN EL ESTADO DE LA CAPTACION

export async function preAprobarCaptacion({ commit }, id: number) {
  commit('setLoading', true);
  return api.post(`/captacion/${id}/pre_aprobar`).finally(() => commit('setLoading', false));
}

export async function aprobarCaptacion({ commit }, id: number) {
  commit('setLoading', true);
  return api.post(`/captacion/${id}/aprobar`).finally(() => commit('setLoading', false));
}

export async function restablecerCaptacion({ dispatch, commit }, id: number) {
  commit('setLoading', true);
  return api.post(`/captacion/${id}/restablecer`).finally(() => commit('setLoading', false));
}

export async function anularCaptacion({ dispatch, commit }, { id, motivo }: { id: number; motivo: string }) {
  commit('setLoading', true);
  return api.post(`/captacion/${id}/cancelar`, { motivo }).finally(() => commit('setLoading', false));
}

export async function eliminar({ dispatch, commit }, { id }: { id: number }) {
  commit('setLoading', true);
  return api.post(`/captacion/${id}/eliminar`).finally(() => commit('setLoading', false));
}

export async function finalizarCaptacion({ dispatch, commit }, id: number) {
  commit('setLoading', true);
  return api.post(`/captacion/${id}/finalizar`).finally(() => commit('setLoading', false));
}

export async function confirmarCaptacion({ dispatch, commit }, id: number) {
  commit('setLoading', true);
  return api.post(`/captacion/${id}/confirmar`).finally(() => commit('setLoading', false));
}

export async function fetchStats({ commit }) {
  commit('setLoadingStats', true);
  return run(api.get('/captacion_estudios/stats'))
    .then((data) => commit('setStats', data))
    .finally(() => commit('setLoadingStats', false));
}

export async function addFromProducto({ commit }, ID_PRODUCTO: number) {
  if (isNil(ID_PRODUCTO)) {
    notifyError('No se ha seleccionado un producto');
    throw new Error('No se ha seleccionado un producto');
  }
  return run(api.post('/captacion_estudios', null, { params: { ID_PRODUCTO } }));
}
