import { EstadoCaptacion } from '@win2win/shared';
import { isNil } from 'lodash';
import { useQuasar } from 'quasar';
import AppNotificationDialog from 'src/components/dialogs/AppNotificationDialog.vue';
import { AppNotificationDialogData, ArchivosESTADO_APROBACION } from 'src/models';
import TieDialog from 'src/widgets/TieDialog.vue';
import { computed, ref, watch } from 'vue';
import { useRouter } from 'vue-router';
import { useStore } from 'vuex';
import { useCaptacionActions } from './useCaptacionActions';
import { useCaptacionPage } from './useCaptacionPage';

export function useIndicacionesSolicitud() {
  const { dialog } = useQuasar();
  const { captacion, activeIncidents, documents, budgets, showBudgetDetails } = useCaptacionPage();
  const { showActionDialog } = useCaptacionActions();
  const router = useRouter();
  const store = useStore();
  const isAdmin = computed(() => store.getters['auth/isAdmin']);
  const isShowingDialog = ref(false);
  const okButton = {
    label: 'Entendido',
    fn: () => {},
  };
  const cancelButton = {
    label: 'En otro momento',
    fn: () => {},
  };

  watch(
    () => captacion.value?.ESTADO,
    (value) => {
      if (captacion && !isNil(value) && !isShowingDialog.value) {
        const dialogData = isAdmin.value ? buildAdminDialogData() : buildUserDialogData();
        if (!dialogData) return;
        isShowingDialog.value = true;
        showNotification(dialogData).onCancel(() => {
          isShowingDialog.value = false;
        });
      }
    },
    { immediate: true }
  );

  function showNotification(data: AppNotificationDialogData) {
    return dialog({
      component: AppNotificationDialog,
      componentProps: {
        data,
      },
    });
  }

  function buildUserDialogData(): AppNotificationDialogData | null {
    switch (captacion.value.ESTADO) {
      case EstadoCaptacion.EN_ESTUDIO:
        if (documents.value.filter((doc) => !doc.FECHA_SUBIDA).length) {
          return {
            title: 'Documentación pendiente',
            message: 'Tienes documentos pendientes por subir',
            actions: [
              cancelButton,
              {
                label: 'Subir documentos',
                fn: () => router.push('documentacion'),
              },
            ],
          };
        } else if (activeIncidents.value.length) {
          return {
            title: 'Incidencias pendientes',
            message: 'Tienes incidencias pendientes por resolver.',
            actions: [
              cancelButton,
              {
                label: 'Resolver incidencias',
                fn: () => router.push('incidencias'),
              },
            ],
          };
        } else {
          return null;
        }
      case EstadoCaptacion.PRE_APROBADA: {
        if (documents.value.filter((doc) => !doc.FECHA_SUBIDA).length) {
          return {
            title: 'Documentación pendiente',
            message: 'Tienes documentos pendientes por subir',
            actions: [
              cancelButton,
              {
                label: 'Subir documentos',
                fn: () => router.push('documentacion'),
              },
            ],
          };
        } else if (activeIncidents.value.length) {
          return {
            title: 'Incidencias pendientes',
            message: 'Tienes incidencias pendientes por resolver.',
            actions: [
              cancelButton,
              {
                label: 'Resolver incidencias',
                fn: () => router.push('incidencias'),
              },
            ],
          };
        } else {
          return null;
        }
      }
      case EstadoCaptacion.APROBADA:
        if (documents.value.filter((doc) => !doc.FECHA_SUBIDA).length) {
          return {
            title: 'Documentación pendiente',
            message: 'Tienes documentos pendientes por subir',
            actions: [
              cancelButton,
              {
                label: 'Subir documentos',
                fn: () => router.push('documentacion'),
              },
            ],
          };
        } else if (activeIncidents.value.length) {
          return {
            title: 'Incidencias pendientes',
            message: 'Tienes incidencias pendientes por resolver.',
            actions: [
              cancelButton,
              {
                label: 'Resolver incidencias',
                fn: () => router.push('incidencias'),
              },
            ],
          };
        } else if (documents.value.some((doc) => !doc.FECHA_APROBADO)) {
          return null;
        } else {
          return null;
        }
      case EstadoCaptacion.EN_NEGOCIACION:
        return {
          title: 'Tu cotización ya está realizada',
          message: 'Puedes aprobarla o rechazarla en cualquier momento',
          actions: [
            cancelButton,
            {
              label: 'Ver cotización ahora',
              fn: () => {
                if (budgets.value.length === 1) {
                  showBudgetDetails(budgets.value[0]);
                } else {
                  router.push('cotizacion');
                }
              },
            },
          ],
        };
      case EstadoCaptacion.NEGOCIACION_FINALIZADA:
        return null;
      case EstadoCaptacion.CONFIRMADA:
        return null;
      case EstadoCaptacion.FINALIZADA:
        return null;
    }
    return null;
  }

  function buildAdminDialogData(): AppNotificationDialogData | null {
    const id = captacion.value.ID_CAPTACION;
    switch (captacion.value.ESTADO) {
      case EstadoCaptacion.EN_ESTUDIO:
        return null;
      case EstadoCaptacion.PRE_APROBADA: {
        if (documents.value.filter((doc) => !doc.FECHA_SUBIDA).length) return null;
        else if (activeIncidents.value.length) return null;
        else if (documents.value.some((doc) => doc.APROBADA !== ArchivosESTADO_APROBACION.APROBADA))
          return {
            title: 'Documentación por verificar',
            message: 'El solicitante subió documentación que no se ha verificado',
            actions: [
              cancelButton,
              {
                label: 'Verificar documentación',
                fn: () => router.push({ path: 'documentacion', query: { showDialog: 1 } }),
              },
            ],
          };
        else break;
      }
      case EstadoCaptacion.APROBADA:
        if (documents.value.some((doc) => doc.APROBADA !== ArchivosESTADO_APROBACION.APROBADA))
          return {
            title: 'Documentación por verificar',
            message: 'El solicitante subió documentación que no se ha verificado',
            actions: [
              cancelButton,
              {
                label: 'Verificar documentación',
                fn: () => router.push({ path: 'documentacion', query: { showDialog: 1 } }),
              },
            ],
          };

        if (documents.value.every((doc) => doc.APROBADA == ArchivosESTADO_APROBACION.APROBADA)) {
          return {
            title: 'Cotización pendiente',
            message: 'El solicitante está en espera de una cotización',
            actions: [
              cancelButton,
              {
                label: 'Generar cotización',
                fn: () => {
                  dialog({
                    component: TieDialog,
                    componentProps: {
                      captacion: captacion.value,
                    },
                  });
                },
              },
            ],
          };
        }
        return null;
      case EstadoCaptacion.EN_NEGOCIACION:
        return null;
      case EstadoCaptacion.NEGOCIACION_FINALIZADA:
        return null;
      case EstadoCaptacion.CONFIRMADA:
        return null;
      case EstadoCaptacion.FINALIZADA:
        return null;
    }
    return null;
  }
}
