package com.ejie.ab79.service;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;

import javax.annotation.Resource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.ejie.ab79.clientesWS.ab61WebService.DocumentoExpediente;
import com.ejie.ab79.clientesWS.ab61WebService.Usuario;
import com.ejie.ab79.comun.Constantes;
import com.ejie.ab79.dao.DocumentosDescargarDao;
import com.ejie.ab79.model.DocumentosDescargar;
import com.ejie.ab79.model.DocumentosSubidos;
import com.ejie.ab79.model.DocumentosTablet;
import com.ejie.ab79.model.VReateDocumentos;
import com.ejie.ab79.model.REST.servicioWeb.DocumentoActividadAsociada;
import com.ejie.ab79.model.REST.servicioWeb.DocumentoExpRelacionado;
import com.ejie.ab79.model.REST.servicioWeb.DocumentoFicha;
import com.ejie.ab79.model.inspecciones.Inspecciones;
import com.ejie.x38.dto.JerarquiaDto;
import com.ejie.x38.dto.TableRequestDto;
import com.ejie.x38.dto.TableResponseDto;
import com.ejie.x38.dto.TableRowDto;

/**
 * DocumentosDescargarServiceImpl  
 * 
 *  
 */

@Service(value = "documentosDescargarService")
public class DocumentosDescargarServiceImpl implements DocumentosDescargarService {

	@Autowired
	private DocumentosDescargarDao documentosDescargarDao;

	@Resource
	ReloadableResourceBundleMessageSource appMessageSource;

	/**
	 * Inserts a single row in the DocumentosDescargar table.
	 *
	 * @param documentosDescargar
	 *            DocumentosDescargar
	 * @return DocumentosDescargar
	 */
	@Transactional(rollbackFor = Throwable.class)
	public DocumentosDescargar add(DocumentosDescargar documentosDescargar) {
		return this.documentosDescargarDao.add(documentosDescargar);
	}

	/**
	 * Updates a single row in the DocumentosDescargar table.
	 *
	 * @param documentosDescargar
	 *            DocumentosDescargar
	 * @return DocumentosDescargar
	 */
	@Transactional(rollbackFor = Throwable.class)
	public DocumentosDescargar update(DocumentosDescargar documentosDescargar) {
		return this.documentosDescargarDao.update(documentosDescargar);
	}

	/**
	 * Finds a single row in the DocumentosDescargar table.
	 *
	 * @param documentosDescargar
	 *            DocumentosDescargar
	 * @return DocumentosDescargar
	 */
	public DocumentosDescargar find(DocumentosDescargar documentosDescargar) {
		return (DocumentosDescargar) this.documentosDescargarDao.find(documentosDescargar);
	}

	/**
	 * Deletes a single row in the DocumentosDescargar table.
	 *
	 * @param documentosDescargar
	 *            DocumentosDescargar
	 */
	@Transactional(rollbackFor = Throwable.class)
	public void remove(DocumentosDescargar documentosDescargar) {
		this.documentosDescargarDao.remove(documentosDescargar);
	}

	/**
	 * Finds a list of rows in the DocumentosDescargar table.
	 *
	 * @param documentosDescargar
	 *            DocumentosDescargar
	 * @param tableRequestDto
	 *            TableRequestDto
	 * @return List<DocumentosDescargar>
	 */
	public List<DocumentosDescargar> findAll(DocumentosDescargar documentosDescargar, TableRequestDto tableRequestDto) {
		return (List<DocumentosDescargar>) this.documentosDescargarDao.findAll(documentosDescargar, tableRequestDto);
	}

	/**
	 * Finds rows in the DocumentosDescargar table using like.
	 *
	 * @param documentosDescargar
	 *            DocumentosDescargar
	 * @param tableRequestDto
	 *            TableRequestDto
	 * @param startsWith
	 *            Boolean
	 * @return List<DocumentosDescargar>
	 */
	public List<DocumentosDescargar> findAllLike(DocumentosDescargar documentosDescargar,
			TableRequestDto tableRequestDto, Boolean startsWith) {
		return (List<DocumentosDescargar>) this.documentosDescargarDao.findAllLike(documentosDescargar, tableRequestDto,
				startsWith);
	}

	@Override
	public List<DocumentoFicha> findDocumentoFichaREST(Integer idInspeccion) {
		return (List<DocumentoFicha>) this.documentosDescargarDao.findDocumentoFichaREST(idInspeccion);
	}

	@Override
	public List<com.ejie.ab79.model.REST.servicioWeb.DocumentoExpediente> findDocumentoExpedienteREST(
			Integer idInspeccion) {
		return (List<com.ejie.ab79.model.REST.servicioWeb.DocumentoExpediente>) this.documentosDescargarDao
				.findDocumentoExpedienteREST(idInspeccion);
	}

	@Override
	public List<DocumentoExpRelacionado> findDocumentoExpRelacionadoREST(Integer idInspeccion) {
		return (List<DocumentoExpRelacionado>) this.documentosDescargarDao
				.findDocumentoExpRelacionadoREST(idInspeccion);
	}

	@Override
	public List<DocumentoActividadAsociada> findDocumentoActividadAsociadaREST(Integer idInspeccion) {
		return (List<DocumentoActividadAsociada>) this.documentosDescargarDao
				.findDocumentoActividadAsociadaREST(idInspeccion);
	}

	/*
	 * OPERACIONES RUP_TABLE
	 */

	/**
	 * Removes rows from the DocumentosDescargar table.
	 *
	 * @param filterDocumentosDescargar
	 *            DocumentosDescargar
	 * @param tableRequestDto
	 *            TableRequestDto
	 * @param startsWith
	 *            Boolean
	 */
	public void removeMultiple(DocumentosDescargar filterDocumentosDescargar, TableRequestDto tableRequestDto,
			Boolean startsWith) {
		this.documentosDescargarDao.removeMultiple(filterDocumentosDescargar, tableRequestDto, startsWith);
	}

	/**
	 * Filter method in the DocumentosDescargar table.
	 *
	 * @param filterDocumentosDescargar
	 *            DocumentosDescargar
	 * @param tableRequestDto
	 *            TableRequestDto
	 * @param startsWith
	 *            Boolean
	 * @return TableResponseDto<DocumentosDescargar>
	 */
	public TableResponseDto<DocumentosDescargar> filter(DocumentosDescargar filterDocumentosDescargar,
			TableRequestDto tableRequestDto, Boolean startsWith) {
		List<DocumentosDescargar> listaDocumentosDescargar = this.documentosDescargarDao
				.findAllLike(filterDocumentosDescargar, tableRequestDto, false);
		Long recordNum = this.documentosDescargarDao.findAllLikeCount(
				filterDocumentosDescargar != null ? filterDocumentosDescargar : new DocumentosDescargar(), false);

		TableResponseDto<DocumentosDescargar> usuarioDto = new TableResponseDto<DocumentosDescargar>(tableRequestDto,
				recordNum, listaDocumentosDescargar);

		if (tableRequestDto.getMultiselection().getSelectedIds() != null) {
			List<TableRowDto<DocumentosDescargar>> reorderSelection = this.documentosDescargarDao
					.reorderSelection(filterDocumentosDescargar, tableRequestDto, startsWith);
			usuarioDto.setReorderedSelection(reorderSelection);
			usuarioDto.addAdditionalParam("reorderedSelection", reorderSelection);
			usuarioDto.addAdditionalParam("selectedAll", tableRequestDto.getMultiselection().getSelectedAll());
		}
		if (tableRequestDto.getSeeker().getSelectedIds() != null) {
			tableRequestDto.setMultiselection(tableRequestDto.getSeeker());
			List<TableRowDto<DocumentosDescargar>> reorderSeeker = this.documentosDescargarDao
					.reorderSelection(filterDocumentosDescargar, tableRequestDto, startsWith);
			usuarioDto.setReorderedSeeker(reorderSeeker);
			usuarioDto.addAdditionalParam("reorderedSeeker", reorderSeeker);
		}
		return usuarioDto;
	}

	/**
	 * Searches rows in the DocumentosDescargar table.
	 *
	 * @param filterDocumentosDescargar
	 *            DocumentosDescargar
	 * @param searchDocumentosDescargar
	 *            DocumentosDescargar
	 * @param tableRequestDto
	 *            TableRequestDto
	 * @param startsWith
	 *            Boolean
	 * @return List<TableRowDto<DocumentosDescargar>>
	 */
	public List<TableRowDto<DocumentosDescargar>> search(DocumentosDescargar filterDocumentosDescargar,
			DocumentosDescargar searchDocumentosDescargar, TableRequestDto tableRequestDto, Boolean startsWith) {
		return this.documentosDescargarDao.search(filterDocumentosDescargar, searchDocumentosDescargar, tableRequestDto,
				startsWith);
	}

	/**
	 * Reorder the selection made in DocumentosDescargar table.
	 *
	 * @param filterDocumentosDescargar
	 *            DocumentosDescargar
	 * @param tableRequestDto
	 *            TableRequestDto
	 * @param startsWith
	 *            Boolean
	 * @return Object
	 */
	public Object reorderSelection(DocumentosDescargar filterDocumentosDescargar, TableRequestDto tableRequestDto,
			Boolean startsWith) {
		return this.documentosDescargarDao.reorderSelection(filterDocumentosDescargar, tableRequestDto, startsWith);
	}

	/*
	 * OPERACIONES RUP_TABLE JERARQUIA
	 */

	/**
	 * Finder method in the hierarchical the DocumentosDescargar table.
	 *
	 * @param filterDocumentosDescargar
	 *            DocumentosDescargar
	 * @param tableRequestDto
	 *            TableRequestDto
	 * @param startsWith
	 *            Boolean
	 * @return TableResponseDto<JerarquiaDto<DocumentosDescargar>>
	 */
	public TableResponseDto<JerarquiaDto<DocumentosDescargar>> jerarquia(DocumentosDescargar filterDocumentosDescargar,
			TableRequestDto tableRequestDto, Boolean startsWith) {
		List<JerarquiaDto<DocumentosDescargar>> listaDocumentosDescargar = this.documentosDescargarDao
				.findAllLikeJerarquia(filterDocumentosDescargar, tableRequestDto);
		Long recordNum = this.documentosDescargarDao.findAllLikeCountJerarquia(filterDocumentosDescargar,
				tableRequestDto);
		return new TableResponseDto<JerarquiaDto<DocumentosDescargar>>(tableRequestDto, recordNum,
				listaDocumentosDescargar);
	}

	/**
	 * Finder method for siblings rows in the hierarchical the
	 * DocumentosDescargar table.
	 *
	 * @param filterDocumentosDescargar
	 *            DocumentosDescargar
	 * @param tableRequestDto
	 *            TableRequestDto
	 * @return TableResponseDto<JerarquiaDto<DocumentosDescargar>>
	 */
	public TableResponseDto<JerarquiaDto<DocumentosDescargar>> jerarquiaChildren(
			DocumentosDescargar filterDocumentosDescargar, TableRequestDto tableRequestDto) {
		TableResponseDto<JerarquiaDto<DocumentosDescargar>> tableResponseDto = new TableResponseDto<JerarquiaDto<DocumentosDescargar>>();
		tableResponseDto.addAdditionalParam(TableResponseDto.CHILDREN,
				this.documentosDescargarDao.findAllChild(filterDocumentosDescargar, tableRequestDto));
		return tableResponseDto;
	}

	/**
	 * Exporta Datos al clipBoard
	 *
	 */
	public List<DocumentosDescargar> getMultiple(DocumentosDescargar filterDocumentosDescargar,
			TableRequestDto tableRequestDto, Boolean startsWith) {
		return this.documentosDescargarDao.getMultiple(filterDocumentosDescargar, tableRequestDto, startsWith);
	}

	public String findNombreByOid(String oid) {
		return this.documentosDescargarDao.findNombreByOid(oid);
	}

	@Override
	@Transactional
	public List<DocumentosDescargar> guardarDocumentos(int idInspeccion, DocumentosTablet documentosTablet,
			Usuario usuario) throws ParseException {

		this.documentosDescargarDao.removeByIdInspeccion(idInspeccion);

		List<DocumentosDescargar> listaDocumentosDescargar = this.rellenarDocumentosDescargar(idInspeccion,
				documentosTablet, usuario);

		for (DocumentosDescargar documentoDescargar : listaDocumentosDescargar) {
			this.documentosDescargarDao.add(documentoDescargar);
		}

		return listaDocumentosDescargar;
	}

	@Override
	public List<DocumentosDescargar> rellenarDocumentosDescargar(Integer idInspeccion,
			DocumentosTablet documentosTablet, Usuario usuario) throws ParseException {
		List<DocumentosDescargar> listaDocumentosDescargar = new ArrayList<DocumentosDescargar>();
		Locale locale = LocaleContextHolder.getLocale();

		if (documentosTablet.getDocumentosSubidos() != null) {
			for (DocumentosSubidos documentoSubido : documentosTablet.getDocumentosSubidos()) {
				DocumentosDescargar documentoDescargarAux = new DocumentosDescargar();
				Inspecciones inspeccion = new Inspecciones();
				inspeccion.setIdInspeccion(idInspeccion);
				documentoDescargarAux.setInspeccion(inspeccion);
				documentoDescargarAux.setOid(documentoSubido.getOidDocumento());
				documentoDescargarAux.setOrigenOid(documentoSubido.getOrigenDocumento());
				if (documentoSubido.getTipoPlantilla() != null) {
					documentoDescargarAux.setIdTipoPlantilla(documentoSubido.getTipoPlantilla().getIdTipoPlantilla());
					documentoDescargarAux.setDescripcionTipoCastellano(
							documentoSubido.getTipoPlantilla().getDescripcionCastellano());
					documentoDescargarAux
							.setDescripcionTipoEuskera(documentoSubido.getTipoPlantilla().getDescripcionEuskera());
				}
				documentoDescargarAux.setNombreDocumento(documentoSubido.getNombreDocumento());
				documentoDescargarAux.setOrigenDocumentacion(Constantes.DocumentosDescargar.ORIGEN_FICHA_INSPECCION);
				documentoDescargarAux.setDescripcionDocumentacion(
						appMessageSource.getMessage("tablet.tituloDocFichaInspeccion", null, locale));
				documentoDescargarAux.setFechaAportado(documentoSubido.getFechaAportadoPid());
				documentoDescargarAux.setIdActuacion(documentoSubido.getIdActuacion());
				documentoDescargarAux.setUsuarioRegistro(usuario.getUsuario());
				listaDocumentosDescargar.add(documentoDescargarAux);
			}
		}

		if (documentosTablet.getDocumentoExpediente() != null) {
			for (DocumentoExpediente documentoExpediente : documentosTablet.getDocumentoExpediente()) {
				DocumentosDescargar documentoDescargarAux = new DocumentosDescargar();
				Inspecciones inspeccion = new Inspecciones();
				inspeccion.setIdInspeccion(idInspeccion);
				documentoDescargarAux.setInspeccion(inspeccion);
				documentoDescargarAux.setFolderNumber(documentoExpediente.getFolderNumber());
				documentoDescargarAux.setOid(documentoExpediente.getOidDokusi());
				documentoDescargarAux.setOrigenOid(Constantes.ORIGEN_OID_DOKUSI);
				documentoDescargarAux.setDescripcionTipoCastellano(documentoExpediente.getTipoDocumento());
				documentoDescargarAux.setDescripcionTipoEuskera(documentoExpediente.getTipoDocumento());
				documentoDescargarAux.setNombreDocumento(documentoExpediente.getNombreDocumento());
				documentoDescargarAux.setTituloDocumento(documentoExpediente.getTituloDocumento());
				if (documentoExpediente.getFechaSubidaStr() != null
						&& !"".equals(documentoExpediente.getFechaSubidaStr())) {
					Date fechaSubida = null;
					if (locale.toString().equals(Constantes.CASTELLANO)) {
						fechaSubida = new SimpleDateFormat(Constantes.FORMATO_FECHA_ES)
								.parse(documentoExpediente.getFechaSubidaStr());
					} else if (locale.toString().equals(Constantes.EUSKERA)) {
						fechaSubida = new SimpleDateFormat(Constantes.FORMATO_FECHA_EU)
								.parse(documentoExpediente.getFechaSubidaStr());
					}
					documentoDescargarAux.setFechaAportado(fechaSubida);
				}
				documentoDescargarAux.setOrigenDocumentacion(Constantes.DocumentosDescargar.ORIGEN_EXPEDIENTE);
				documentoDescargarAux.setDescripcionDocumentacion(
						appMessageSource.getMessage("tablet.tituloDocExpediente", null, locale));
				documentoDescargarAux.setUsuarioRegistro(usuario.getUsuario());
				listaDocumentosDescargar.add(documentoDescargarAux);
			}
		}

		if (documentosTablet.getvReateDocumentos() != null) {
			for (VReateDocumentos vReateDocumentos : documentosTablet.getvReateDocumentos()) {
				DocumentosDescargar documentoDescargarAux = new DocumentosDescargar();
				Inspecciones inspeccion = new Inspecciones();
				inspeccion.setIdInspeccion(idInspeccion);
				documentoDescargarAux.setInspeccion(inspeccion);
				documentoDescargarAux.setOid(vReateDocumentos.getOid());
				if (Constantes.PID_STR.equals(vReateDocumentos.getRepositorio())) {
					documentoDescargarAux.setOrigenOid(Constantes.ORIGEN_OID_PID);
				} else {
					documentoDescargarAux.setOrigenOid(Constantes.ORIGEN_OID_DOKUSI);
				}
				documentoDescargarAux.setDescripcionTipoCastellano(vReateDocumentos.getDescPlantillaCastellano());
				documentoDescargarAux.setDescripcionTipoEuskera(vReateDocumentos.getDescPlantillaEuskera());
				documentoDescargarAux.setNombreDocumento(vReateDocumentos.getNombreDocumento());
				documentoDescargarAux.setFechaAportado(vReateDocumentos.getFechaAportadoPid());
				documentoDescargarAux.setOrigenDocumentacion(Constantes.DocumentosDescargar.ORIGEN_ACTIVIDAD);
				documentoDescargarAux.setDescripcionDocumentacion(
						appMessageSource.getMessage("tablet.tituloDocActividad", null, locale));
				documentoDescargarAux.setUsuarioRegistro(usuario.getUsuario());
				listaDocumentosDescargar.add(documentoDescargarAux);
			}
		}

		if (documentosTablet.getDocumentosExpRel() != null) {
			for (DocumentoExpediente documentoExpRel : documentosTablet.getDocumentosExpRel()) {
				DocumentosDescargar documentoDescargarAux = new DocumentosDescargar();
				Inspecciones inspeccion = new Inspecciones();
				inspeccion.setIdInspeccion(idInspeccion);
				documentoDescargarAux.setInspeccion(inspeccion);
				documentoDescargarAux.setFolderNumber(documentoExpRel.getFolderNumber());
				documentoDescargarAux.setOid(documentoExpRel.getOidDokusi());
				documentoDescargarAux.setOrigenOid(Constantes.ORIGEN_OID_DOKUSI);
				documentoDescargarAux.setDescripcionTipoCastellano(documentoExpRel.getTipoDocumento());
				documentoDescargarAux.setDescripcionTipoEuskera(documentoExpRel.getTipoDocumento());
				documentoDescargarAux.setNombreDocumento(documentoExpRel.getNombreDocumento());
				documentoDescargarAux.setTituloDocumento(documentoExpRel.getTituloDocumento());
				if (documentoExpRel.getFechaSubidaStr() != null && !"".equals(documentoExpRel.getFechaSubidaStr())) {
					Date fechaSubida = null;
					if (locale.toString().equals(Constantes.CASTELLANO)) {
						fechaSubida = new SimpleDateFormat(Constantes.FORMATO_FECHA_ES)
								.parse(documentoExpRel.getFechaSubidaStr());
					} else if (locale.toString().equals(Constantes.EUSKERA)) {
						fechaSubida = new SimpleDateFormat(Constantes.FORMATO_FECHA_EU)
								.parse(documentoExpRel.getFechaSubidaStr());
					}
					documentoDescargarAux.setFechaAportado(fechaSubida);
				}
				documentoDescargarAux.setOrigenDocumentacion(Constantes.DocumentosDescargar.ORIGEN_EXP_RELACIONADO);
				documentoDescargarAux.setDescripcionDocumentacion(
						appMessageSource.getMessage("tablet.tituloDocExpRel", null, locale));
				documentoDescargarAux.setUsuarioRegistro(usuario.getUsuario());
				listaDocumentosDescargar.add(documentoDescargarAux);
			}
		}

		return listaDocumentosDescargar;
	}

	@Override
	public List<DocumentosDescargar> obtenerEnviados(Integer idInspeccion, Integer origenDocumentacion) {
		return (List<DocumentosDescargar>) this.documentosDescargarDao.obtenerEnviados(idInspeccion,
				origenDocumentacion);
	}

	@Override
	public List<DocumentosDescargar> obtenerEnviadosExpRel(Integer idInspeccion) {
		return (List<DocumentosDescargar>) this.documentosDescargarDao.obtenerEnviadosExpRel(idInspeccion);
	}

}
