package com.ejie.ad74a.service;

import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Map;

import com.ejie.ad74a.exceptions.Ad74aWebserviceException;
import com.ejie.ad74a.model.NotifPostales;
import com.ejie.ad74a.util.constantes.TipoNotificacionComunicacionEnum;
import com.ejie.x38.dto.TableRequestDto;
import com.ejie.x38.dto.TableResponseDto;

/**
 * NotifPostalesService generated by UDA, 09-ene-2024 16:08:21.
 * 
 * @author UDA
 */

public interface NotifPostalesService {

	/**
	 * Inserts a single row in the NotifPostales table.
	 *
	 * @param notifPostales NotifPostales
	 * @return NotifPostales
	 */
	NotifPostales add(NotifPostales notifPostales);

	/**
	 * Updates a single row in the NotifPostales table.
	 *
	 * @param notifPostales NotifPostales
	 * @return NotifPostales
	 */
	NotifPostales update(NotifPostales notifPostales);

	/**
	 * Finds a single row in the NotifPostales table.
	 *
	 * @param notifPostales NotifPostales
	 * @return NotifPostales
	 */
	NotifPostales find(NotifPostales notifPostales);

	/**
	 * Deletes a single row in the NotifPostales table.
	 *
	 * @param notifPostales NotifPostales
	 */
	void remove(NotifPostales notifPostales);

	/**
	 * Finds rows in the NotifPostales table using like.
	 *
	 * @param notifPostales   NotifPostales
	 * @param tableRequestDto TableRequestDto
	 * @param startsWith      Boolean
	 * @return List<NotifPostales>
	 */
	List<NotifPostales> findAllLike(NotifPostales notifPostales, TableRequestDto tableRequestDto, Boolean startsWith);

	/*
	 * OPERACIONES RUP_TABLE
	 */

	/**
	 * Removes multiple rows from the NotifPostales table.
	 *
	 * @param filterNotifPostales NotifPostales
	 * @param tableRequestDto     TableRequestDto
	 * @param startsWith          Boolean
	 */
	void removeMultiple(NotifPostales filterNotifPostales, TableRequestDto tableRequestDto, Boolean startsWith);

	/**
	 * Filter method in the NotifPostales table.
	 *
	 * @param filterNotifPostales NotifPostales
	 * @param tableRequestDto     TableRequestDto
	 * @param startsWith          Boolean
	 * @return TableResponseDto<NotifPostales>
	 */
	TableResponseDto<NotifPostales> filter(NotifPostales filterNotifPostales, TableRequestDto tableRequestDto,
			Boolean startsWith);

	/**
	 * Reorder the selection made in NotifPostales table.
	 *
	 * @param filterNotifPostales NotifPostales
	 * @param tableRequestDto     TableRequestDto
	 * @param startsWith          Boolean
	 * @return Object
	 */
	Object reorderSelection(NotifPostales filterNotifPostales, TableRequestDto tableRequestDto, Boolean startsWith);

	/**
	 * Exporta Datos al clipBoard
	 *
	 */
	List<NotifPostales> getMultiple(NotifPostales filterNotifPostales, TableRequestDto tableRequestDto,
			Boolean startsWith);

	/**
	 * Recupera informacion de los documentos de las notificaciones postales en
	 * PLATEA. Si getContents es true, se devuelven tambien las rutas de los
	 * documentos descargados en PIF.
	 * 
	 * @param notifPostalesList
	 * @param getContents
	 * @return
	 */
	List<NotifPostales> getDocumentsFromPlatea(List<NotifPostales> notifPostalesList, boolean getContents);

	/**
	 * Actualiza desde AA66 la situación de envío de la notificación para los
	 * registros de notificacion indicados. Los registros deben ser de tipo
	 * {@link TipoNotificacionComunicacionEnum.NOTIFICACION}
	 * 
	 * @param notifPostalesList
	 * @return
	 */
	List<NotifPostales> updateMultipleSituacionEnvio(List<NotifPostales> notifPostalesList);

	/**
	 * Obtiene los datos para recuperar el listado (o listados) a correspondencia de
	 * aa66 para un intervalo de fechas dado.
	 * 
	 * @param filter Filtro de notificaciones.
	 * @return un mapa con los campos "urlList" y "ficheroNombre" para poder invocar
	 *         al servlet de descarga de listado a correspondencia
	 * @throws IOException
	 */
	Map<String, Object> obtenerParametrosListadoCorrespondenciaPorFechas(NotifPostales filter) throws IOException;

	/**
	 * Listado de parametros que devuelve el mapa del método
	 * {@link obtenerParametrosListadoCorrespondenciaPorFechas}
	 */
	enum ParametrosListadoCorrespondeciaFechas {
		URL_LIST, FICHERO_NOMBRE
	}

	/**
	 * Obtiene los documentos adjunto remito de todas las notificaciones pasadas por
	 * parámetro, juntos en un mismo PDF listo para imprimirse.
	 * 
	 * @param notifPostalesList Lista de notificaciones
	 * @return Fichero pdf con todos los documentos adjunto-remito.
	 * @throws IOException              al encontrar algún problema al descargar el
	 *                                  documento a servidor
	 * @throws Ad74aWebserviceException al encontrar algún problema al descargar el
	 *                                  documento desde PIF
	 */
	File getAdjuntoRemitoFromPlatea(List<NotifPostales> notifPostalesList) throws IOException, Ad74aWebserviceException;

	/**
	 * Crea una nuevas notificacion partiendo de una notificacion ya existente.
	 * Vuelve a notificar el mismo documento, usando los datos de notificación del
	 * expediente en platea.
	 * 
	 * @param notifPostales NotifPostales
	 * @return
	 */
	NotifPostales retramitarNotificacion(NotifPostales notifPostales);

}
