package com.ejie.ab79.service.preguntasRespuestas;
import com.ejie.ab79.dao.preguntasRespuestas.TiposPreguntasDao;
import com.ejie.ab79.model.preguntasRespuestas.TiposPreguntas;
import com.ejie.ab79.service.preguntasRespuestas.TiposPreguntasService;
import com.ejie.x38.dto.JerarquiaDto;
import com.ejie.x38.dto.TableRequestDto;
import com.ejie.x38.dto.TableResponseDto;
import com.ejie.x38.dto.TableRowDto;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
 * TiposPreguntasServiceImpl  
 *  
 */

@Service(value = "tiposPreguntasService")
public class TiposPreguntasServiceImpl implements TiposPreguntasService {

	@Autowired
	private TiposPreguntasDao tiposPreguntasDao;

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

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

	/**
	 * Finds a single row in the TiposPreguntas table.
	 *
	 * @param tiposPreguntas TiposPreguntas
	 * @return TiposPreguntas
	 */
	public TiposPreguntas find(TiposPreguntas tiposPreguntas) {
		return (TiposPreguntas) this.tiposPreguntasDao.find(tiposPreguntas);
	}
	
	/**
	 * Deletes a single row in the TiposPreguntas table.
	 *
	 * @param tiposPreguntas TiposPreguntas
	 */
	@Transactional(rollbackFor = Throwable.class)
	public void remove(TiposPreguntas tiposPreguntas) {
		this.tiposPreguntasDao.remove(tiposPreguntas);
	}

	/**
	 * Finds a list of rows in the TiposPreguntas table.
	 *
	 * @param tiposPreguntas TiposPreguntas
	 * @param tableRequestDto TableRequestDto
	 * @return List<TiposPreguntas>
	 */
	public List<TiposPreguntas> findAll(TiposPreguntas tiposPreguntas, TableRequestDto tableRequestDto){
		return (List<TiposPreguntas>) this.tiposPreguntasDao.findAll(tiposPreguntas, tableRequestDto);
	}
    
	/**
	 * Finds rows in the TiposPreguntas table using like.
	 *
	 * @param tiposPreguntas TiposPreguntas
	 * @param tableRequestDto TableRequestDto
     * @param startsWith Boolean	 
	 * @return List<TiposPreguntas>
	 */
	public List<TiposPreguntas> findAllLike(TiposPreguntas tiposPreguntas, TableRequestDto tableRequestDto, Boolean startsWith){
		return (List<TiposPreguntas>) this.tiposPreguntasDao.findAllLike(tiposPreguntas, tableRequestDto, startsWith);
	}

	/*
	 * OPERACIONES RUP_TABLE
	 */
	 
	/**
	 * Removes rows from the TiposPreguntas table.
	 *
	 * @param filterTiposPreguntas TiposPreguntas
	 * @param tableRequestDto TableRequestDto
	 * @param startsWith Boolean
	 */	
	public void removeMultiple(TiposPreguntas filterTiposPreguntas, TableRequestDto tableRequestDto,  Boolean startsWith){
		this.tiposPreguntasDao.removeMultiple(filterTiposPreguntas, tableRequestDto, startsWith);
	}
        
	/**
	 * Filter method in the TiposPreguntas table.
	 *
	 * @param filterTiposPreguntas TiposPreguntas
	 * @param tableRequestDto TableRequestDto
	 * @param startsWith Boolean
	 * @return TableResponseDto<TiposPreguntas>
	 */	
	public TableResponseDto< TiposPreguntas> filter(TiposPreguntas filterTiposPreguntas, TableRequestDto tableRequestDto,  Boolean startsWith){
		List<TiposPreguntas> listaTiposPreguntas =  this.tiposPreguntasDao.findAllLike(filterTiposPreguntas, tableRequestDto, false);
		Long recordNum =  this.tiposPreguntasDao.findAllLikeCount(filterTiposPreguntas != null ? filterTiposPreguntas: new TiposPreguntas (),false);
		
		TableResponseDto<TiposPreguntas> usuarioDto = new TableResponseDto<TiposPreguntas>(tableRequestDto, recordNum, listaTiposPreguntas);
		
		if (tableRequestDto.getMultiselection().getSelectedIds()!=null){
			List< TableRowDto< TiposPreguntas>> reorderSelection = this.tiposPreguntasDao.reorderSelection(filterTiposPreguntas, 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< TiposPreguntas>> reorderSeeker = this.tiposPreguntasDao.reorderSelection(filterTiposPreguntas, tableRequestDto, startsWith);
			usuarioDto.setReorderedSeeker(reorderSeeker);
			usuarioDto.addAdditionalParam("reorderedSeeker", reorderSeeker);
		}
		return usuarioDto;   
	}
    /**
	 * Searches rows in the TiposPreguntas table.
	 *
	 * @param filterTiposPreguntas TiposPreguntas
	 * @param searchTiposPreguntas TiposPreguntas
	 * @param tableRequestDto TableRequestDto
	 * @param startsWith Boolean
	 * @return List<TableRowDto<TiposPreguntas>>
	 */	
    public List< TableRowDto< TiposPreguntas>> search(TiposPreguntas filterTiposPreguntas, TiposPreguntas searchTiposPreguntas, TableRequestDto tableRequestDto, Boolean startsWith){
		return this.tiposPreguntasDao.search(filterTiposPreguntas, searchTiposPreguntas, tableRequestDto, startsWith);
	}
    
    /**
	 * Reorder the selection made in TiposPreguntas table.
	 *
	 * @param filterTiposPreguntas TiposPreguntas
	 * @param tableRequestDto TableRequestDto
	 * @param startsWith Boolean
	 * @return Object
	 */	
    public Object reorderSelection(TiposPreguntas filterTiposPreguntas, TableRequestDto tableRequestDto, Boolean startsWith){
		return this.tiposPreguntasDao.reorderSelection(filterTiposPreguntas, tableRequestDto, startsWith);
	}
    
    /*
	 * OPERACIONES RUP_TABLE JERARQUIA
	 */
	 
	/**
	 * Finder method in the hierarchical the TiposPreguntas table.
	 *
	 * @param filterTiposPreguntas TiposPreguntas
	 * @param tableRequestDto TableRequestDto
	 * @param startsWith Boolean
	 * @return TableResponseDto<JerarquiaDto<TiposPreguntas>>
	 */	
	public TableResponseDto<JerarquiaDto<TiposPreguntas>> jerarquia(TiposPreguntas filterTiposPreguntas, TableRequestDto tableRequestDto, Boolean startsWith){
		List<JerarquiaDto<TiposPreguntas>> listaTiposPreguntas =  this.tiposPreguntasDao.findAllLikeJerarquia(filterTiposPreguntas, tableRequestDto);
		Long recordNum = this.tiposPreguntasDao.findAllLikeCountJerarquia(filterTiposPreguntas, tableRequestDto);
		return new TableResponseDto<JerarquiaDto<TiposPreguntas>>(tableRequestDto, recordNum, listaTiposPreguntas);
	}
	
	/**
	 * Finder method for siblings rows in the hierarchical the TiposPreguntas table.
	 *
	 * @param filterTiposPreguntas TiposPreguntas
	 * @param tableRequestDto TableRequestDto
	 * @return TableResponseDto<JerarquiaDto<TiposPreguntas>>
	 */	
	public TableResponseDto<JerarquiaDto<TiposPreguntas>> jerarquiaChildren(TiposPreguntas filterTiposPreguntas, TableRequestDto tableRequestDto){
		TableResponseDto<JerarquiaDto<TiposPreguntas>> tableResponseDto = new TableResponseDto<JerarquiaDto<TiposPreguntas>>();
		tableResponseDto.addAdditionalParam(TableResponseDto.CHILDREN, this.tiposPreguntasDao.findAllChild(filterTiposPreguntas, tableRequestDto));
		return tableResponseDto;
	}
	
	/**
    * Exporta Datos al clipBoard
    *
    */
    public List<TiposPreguntas> getMultiple(TiposPreguntas filterTiposPreguntas, TableRequestDto tableRequestDto,  Boolean startsWith){
		return this.tiposPreguntasDao.getMultiple(filterTiposPreguntas, tableRequestDto, startsWith);
	}

	@Override
	public List<TiposPreguntas> findTiposPreguntaValidar() {
		return this.tiposPreguntasDao.findTiposPreguntaValidar();
	}
}

