package com.ejie.ab61.service.plantillas;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.ejie.ab61.dao.plantillas.DocumentosDao;
import com.ejie.ab61.model.plantillas.Documentos;
import com.ejie.ab61.model.usuario.Usuario;
import com.ejie.x38.dto.JQGridRequestDto;
import com.ejie.x38.dto.JQGridResponseDto;
import com.ejie.x38.dto.JerarquiaDto;
import com.ejie.x38.dto.TableRowDto;

/**
 * DocumentosServiceImpl  
 * 
 *  
 */

@Service(value = "documentosService")
public class DocumentosServiceImpl implements DocumentosService {

	@Autowired
	private DocumentosDao documentosDao;

	// @Resource
	// ReloadableResourceBundleMessageSource appMessageSource;

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

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

	@Override
	public Documentos updateSinFichero(Documentos documento) {
		return this.documentosDao.updateSinFichero(documento);
	}

	/**
	 * Finds a single row in the Documentos table.
	 *
	 * @param documentos
	 *            Documentos
	 * @return Documentos
	 */
	public Documentos find(Documentos documentos) {
		return (Documentos) this.documentosDao.find(documentos);
	}

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

	public void copiarFicheros(Documentos documentos, Usuario usuario) {
		this.documentosDao.copiarFicheros(documentos, usuario);
	}

	/**
	 * Finds a list of rows in the Documentos table.
	 *
	 * @param documentos
	 *            Documentos
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @return List<Documentos>
	 */
	public List<Documentos> findAll(Documentos documentos, JQGridRequestDto jqGridRequestDto) {
		return (List<Documentos>) this.documentosDao.findAll(documentos, jqGridRequestDto);
	}

	/**
	 * Finds a list of rows in the Documentos table.
	 *
	 * @param documentos
	 *            Documentos
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @return List<Documentos>
	 */
	public List<Documentos> findAllPorDireccion(Documentos documentos, JQGridRequestDto jqGridRequestDto,
			Integer direccion) {
		return (List<Documentos>) this.documentosDao.findAllPorDireccion(documentos, jqGridRequestDto, direccion);
	}

	/**
	 * Finds rows in the Documentos table using like.
	 *
	 * @param documentos
	 *            Documentos
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @param startsWith
	 *            Boolean
	 * @return List<Documentos>
	 */
	public List<Documentos> findAllLike(Documentos documentos, JQGridRequestDto jqGridRequestDto, Boolean startsWith) {
		return (List<Documentos>) this.documentosDao.findAllLike(documentos, jqGridRequestDto, startsWith);
	}

	/*
	 * OPERACIONES RUP_TABLE
	 */

	/**
	 * Removes rows from the Documentos table.
	 *
	 * @param filterDocumentos
	 *            Documentos
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @param startsWith
	 *            Boolean
	 */
	public void removeMultiple(Documentos filterDocumentos, JQGridRequestDto jqGridRequestDto, Boolean startsWith) {
		this.documentosDao.removeMultiple(filterDocumentos, jqGridRequestDto, startsWith);
	}

	/**
	 * Filter method in the Documentos table.
	 *
	 * @param filterDocumentos
	 *            Documentos
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @param startsWith
	 *            Boolean
	 * @return JQGridResponseDto<Documentos>
	 */
	public JQGridResponseDto<Documentos> filter(Documentos filterDocumentos, JQGridRequestDto jqGridRequestDto,
			Boolean startsWith) {
		List<Documentos> listaDocumentos = this.documentosDao.findAllLike(filterDocumentos, jqGridRequestDto, false);
		Long recordNum = this.documentosDao
				.findAllLikeCount(filterDocumentos != null ? filterDocumentos : new Documentos(), false);
		if (jqGridRequestDto.getMultiselection().getSelectedIds() != null) {
			List<TableRowDto<Documentos>> reorderSelection = this.documentosDao.reorderSelection(filterDocumentos,
					jqGridRequestDto, startsWith);
			return new JQGridResponseDto<Documentos>(jqGridRequestDto, recordNum, listaDocumentos, reorderSelection);
		}
		return new JQGridResponseDto<Documentos>(jqGridRequestDto, recordNum, listaDocumentos);
	}

	/**
	 * Filter method in the Documentos table.
	 *
	 * @param filterDocumentos
	 *            Documentos
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @param startsWith
	 *            Boolean
	 * @return JQGridResponseDto<Documentos>
	 */
	public JQGridResponseDto<Documentos> documentosPorDireccion(Documentos filterDocumentos,
			JQGridRequestDto jqGridRequestDto, Boolean startsWith, Integer direccion) {
		List<Documentos> listaDocumentos = this.documentosDao.findAllLikeDocumentosPorDireccion(filterDocumentos,
				jqGridRequestDto, false, direccion);
		Long recordNum = this.documentosDao.findAllLikeCountDocumentosPorDireccion(
				filterDocumentos != null ? filterDocumentos : new Documentos(), false, direccion);
		if (jqGridRequestDto.getMultiselection().getSelectedIds() != null) {
			List<TableRowDto<Documentos>> reorderSelection = this.documentosDao.reorderSelection(filterDocumentos,
					jqGridRequestDto, startsWith);
			return new JQGridResponseDto<Documentos>(jqGridRequestDto, recordNum, listaDocumentos, reorderSelection);
		}
		return new JQGridResponseDto<Documentos>(jqGridRequestDto, recordNum, listaDocumentos);
	}

	/**
	 * Searches rows in the Documentos table.
	 *
	 * @param filterDocumentos
	 *            Documentos
	 * @param searchDocumentos
	 *            Documentos
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @param startsWith
	 *            Boolean
	 * @return List<TableRowDto<Documentos>>
	 */
	public List<TableRowDto<Documentos>> search(Documentos filterDocumentos, Documentos searchDocumentos,
			JQGridRequestDto jqGridRequestDto, Boolean startsWith) {
		return this.documentosDao.search(filterDocumentos, searchDocumentos, jqGridRequestDto, startsWith);
	}

	/**
	 * Reorder the selection made in Documentos table.
	 *
	 * @param filterDocumentos
	 *            Documentos
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @param startsWith
	 *            Boolean
	 * @return Object
	 */
	public Object reorderSelection(Documentos filterDocumentos, JQGridRequestDto jqGridRequestDto, Boolean startsWith) {
		return this.documentosDao.reorderSelection(filterDocumentos, jqGridRequestDto, startsWith);
	}

	/*
	 * OPERACIONES RUP_TABLE JERARQUIA
	 */

	/**
	 * Finder method in the hierarchical the Documentos table.
	 *
	 * @param filterDocumentos
	 *            Documentos
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @param startsWith
	 *            Boolean
	 * @return JQGridResponseDto<JerarquiaDto<Documentos>>
	 */
	public JQGridResponseDto<JerarquiaDto<Documentos>> jerarquia(Documentos filterDocumentos,
			JQGridRequestDto jqGridRequestDto, Boolean startsWith) {
		List<JerarquiaDto<Documentos>> listaDocumentos = this.documentosDao.findAllLikeJerarquia(filterDocumentos,
				jqGridRequestDto);
		Long recordNum = this.documentosDao.findAllLikeCountJerarquia(filterDocumentos, jqGridRequestDto);
		return new JQGridResponseDto<JerarquiaDto<Documentos>>(jqGridRequestDto, recordNum, listaDocumentos);
	}

	/**
	 * Finder method for siblings rows in the hierarchical the Documentos table.
	 *
	 * @param filterDocumentos
	 *            Documentos
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @return JQGridResponseDto<JerarquiaDto<Documentos>>
	 */
	public JQGridResponseDto<JerarquiaDto<Documentos>> jerarquiaChildren(Documentos filterDocumentos,
			JQGridRequestDto jqGridRequestDto) {
		JQGridResponseDto<JerarquiaDto<Documentos>> jqGridResponseDto = new JQGridResponseDto<JerarquiaDto<Documentos>>();
		jqGridResponseDto.addAdditionalParam(JQGridResponseDto.CHILDREN,
				this.documentosDao.findAllChild(filterDocumentos, jqGridRequestDto));
		return jqGridResponseDto;
	}

	public Documentos removeFicheros(Documentos documento) {
		return this.documentosDao.borrarFichero(documento);
	}

	@Override
	public List<Documentos> findAllLikeDocumentosPorDireccion(Documentos filterCamposPlantilla,
			JQGridRequestDto jqGridRequestDto, Boolean startsWith, Integer direccion) {
		return this.documentosDao.findAllLikeDocumentosPorDireccion(filterCamposPlantilla, jqGridRequestDto, false,
				direccion);
	}
}
