import { Camera, CameraResultType } from '@capacitor/camera';
import { notifyError } from 'src/helpers';
import { Archivos, ArchivosESTADO_APROBACION } from 'src/models';
import ImageViewer from 'src/pages/common/ImageViewer.vue';
import { computed, createApp } from 'vue';
import { useStore } from 'vuex';
import { useRequestConfirmation } from './useRequestConfirmation';

export function useDocument() {
  const store = useStore();
  const { requestConfirmation } = useRequestConfirmation();

  const tiposDocumentos = computed(() => store.getters['contactos/state_tipos_documentos_activos']);

  const isPdf = (item: Partial<Archivos> | { LOCATION: string }) => item.LOCATION?.split('.').pop() === 'pdf';

  const openImageViewer = (imageUrl: string) => {
    if (!imageUrl) {
      notifyError(null, 'Archivo no definido');
      return false;
    }
    const app = createApp(ImageViewer, { imageUrl });
    const vm = app.mount(document.createElement('div'));
    const newTab = window.open('', '_blank');
    if (newTab) {
      newTab.document.body.appendChild(vm.$el);
    } else {
      alert('Por favor habilitar pop-ups para abrir el documento.');
    }
  };

  const openFullSreen = (elementId: string) => {
    const fullscreenImage = document.getElementById(elementId) as any;
    if (fullscreenImage.requestFullscreen) {
      fullscreenImage.requestFullscreen();
    } else if (fullscreenImage?.mozRequestFullScreen) {
      /* Firefox */
      fullscreenImage?.mozRequestFullScreen();
    } else if (fullscreenImage?.webkitRequestFullscreen) {
      /* Chrome, Safari & Opera */
      fullscreenImage?.webkitRequestFullscreen();
    } else if (fullscreenImage?.msRequestFullscreen) {
      /* IE/Edge */
      fullscreenImage?.msRequestFullscreen();
    }
  };

  const downloadDocument = (url: string) => {
    if (!url) {
      notifyError(null, 'Archivo no definido');
      return false;
    }
    const win = window.open(url, '_blank');
    win?.focus();
  };

  const getDocumentFromCamara = async () => {
    try {
      const image = await Camera.getPhoto({
        quality: 100,
        allowEditing: true,
        resultType: CameraResultType.Uri,
      });
      return image || null;
    } catch (error) {
      return null;
    }
  };

  const getDocumentFromGallery = async () => {
    try {
      const { photos } = await Camera.pickImages({
        limit: 0,
        quality: 100,
      });
      const image = photos[0];
      return image || null;
    } catch (error) {
      return null;
    }
  };

  const toggleVerify = async (document: Archivos) => {
    // no se puede verificar un documento que tenga incidencia
    if (document.APROBADA == ArchivosESTADO_APROBACION.RECHAZADA) {
      return null;
    }
    return await store.dispatch('contactos/tsUpdateAprobacionDocumento', {
      ID_ARCHIVO: document.ID_ARCHIVO,
      APROBADA: document.APROBADA == ArchivosESTADO_APROBACION.APROBADA ? -1 : 1,
    });
  };

  const requestConfirmationToDelete = (id?: number, onSuccess?: Function) => {
    if (!id) {
      notifyError('ID del documento no definido');
      return;
    }
    requestConfirmation({
      title: 'Eliminar documento',
      message: '¿Seguro que deseas eliminar el documento?',
      action: () => {
        store.dispatch('contactos/deleteArchivo', id).then(() => {
          if (onSuccess) {
            onSuccess();
          }
        });
      },
    });
  };

  return {
    tiposDocumentos,
    openImageViewer,
    getDocumentFromGallery,
    getDocumentFromCamara,
    downloadDocument,
    openFullSreen,
    toggleVerify,
    requestConfirmationToDelete,
    isPdf,
  };
}
