package com.ejie.ab79.service.preguntasRespuestas;

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.ab79.dao.preguntasRespuestas.OpcionesPreExpDao;
import com.ejie.ab79.model.REST.servicioWeb.Opcion;
import com.ejie.ab79.model.preguntasRespuestas.OpcionesPreExp;
import com.ejie.ab79.model.preguntasRespuestas.PreguntasExpediente;
import com.ejie.x38.dto.JerarquiaDto;
import com.ejie.x38.dto.TableRequestDto;
import com.ejie.x38.dto.TableResponseDto;
import com.ejie.x38.dto.TableRowDto;

/**
 * OpcionesPreExpServiceImpl  
 * 
 *  
 */

@Service(value = "opcionesPreExpService")
public class OpcionesPreExpServiceImpl implements OpcionesPreExpService {

	@Autowired
	private OpcionesPreExpDao opcionesPreExpDao;

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

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

	/**
	 * Finds a single row in the OpcionesPreExp table.
	 *
	 * @param opcionesPreExp
	 *            OpcionesPreExp
	 * @return OpcionesPreExp
	 */
	public OpcionesPreExp find(OpcionesPreExp opcionesPreExp) {
		return (OpcionesPreExp) this.opcionesPreExpDao.find(opcionesPreExp);
	}

	@Override
	public OpcionesPreExp findByIdOpcionMovil(String idOpcionMovil, Integer idPreguntaExpediente) {
		return (OpcionesPreExp) this.opcionesPreExpDao.findByIdOpcionMovil(idOpcionMovil, idPreguntaExpediente);
	}

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

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

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

	@Override
	public List<Opcion> findOpcionesREST(Integer idPreguntaExpediente) {
		return (List<Opcion>) this.opcionesPreExpDao.findOpcionesREST(idPreguntaExpediente);
	}

	/*
	 * OPERACIONES RUP_TABLE
	 */

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

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

		TableResponseDto<OpcionesPreExp> usuarioDto = new TableResponseDto<OpcionesPreExp>(tableRequestDto, recordNum,
				listaOpcionesPreExp);

		if (tableRequestDto.getMultiselection().getSelectedIds() != null) {
			List<TableRowDto<OpcionesPreExp>> reorderSelection = this.opcionesPreExpDao
					.reorderSelection(filterOpcionesPreExp, 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<OpcionesPreExp>> reorderSeeker = this.opcionesPreExpDao
					.reorderSelection(filterOpcionesPreExp, tableRequestDto, startsWith);
			usuarioDto.setReorderedSeeker(reorderSeeker);
			usuarioDto.addAdditionalParam("reorderedSeeker", reorderSeeker);
		}
		return usuarioDto;
	}

	/**
	 * Searches rows in the OpcionesPreExp table.
	 *
	 * @param filterOpcionesPreExp
	 *            OpcionesPreExp
	 * @param searchOpcionesPreExp
	 *            OpcionesPreExp
	 * @param tableRequestDto
	 *            TableRequestDto
	 * @param startsWith
	 *            Boolean
	 * @return List<TableRowDto<OpcionesPreExp>>
	 */
	public List<TableRowDto<OpcionesPreExp>> search(OpcionesPreExp filterOpcionesPreExp,
			OpcionesPreExp searchOpcionesPreExp, TableRequestDto tableRequestDto, Boolean startsWith) {
		return this.opcionesPreExpDao.search(filterOpcionesPreExp, searchOpcionesPreExp, tableRequestDto, startsWith);
	}

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

	/*
	 * OPERACIONES RUP_TABLE JERARQUIA
	 */

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

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

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

	@Override
	public void removeByIdPreguntaExpediente(PreguntasExpediente preguntaExpediente) {
		this.opcionesPreExpDao.removeByIdPreguntaExpediente(preguntaExpediente);
	}

}
