package com.ejie.m62fb.service.registroVPP;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.access.prepost.PreAuthorize;

import java.util.List;

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

import com.ejie.m62fb.dao.registroVPP.ContratoAlquilerElementoDao;
import com.ejie.m62fb.model.ContratoAlquilerElemento;
import com.ejie.x38.dto.JQGridRequestDto;
import com.ejie.x38.dto.JQGridResponseDto;
import com.ejie.x38.dto.TableRowDto;

/**
 * ContratoAlquilerElementoServiceImpl generated by UDA, 09-dic-2015 10:41:39.
 * 
XXXX
 */

@Service(value = "contratoAlquilerElementoService")
public class ContratoAlquilerElementoServiceImpl implements
		ContratoAlquilerElementoService {

	@Autowired
	private ContratoAlquilerElementoDao contratoAlquilerElementoDao;

	/**
	 * Inserts a single row in the ContratoAlquilerElemento table.
	 * 
	 * @param contratoAlquilerElemento
	 *            ContratoAlquilerElemento
	 * @return ContratoAlquilerElemento
	 */
	@Override
	@Transactional(rollbackFor = Throwable.class)
@PreAuthorize("hasPermission('CONTRATO_ALQUILER_ELEMENTO_SERVICE','SecureService','create')")
	public ContratoAlquilerElemento add(
			ContratoAlquilerElemento contratoAlquilerElemento) {
		ContratoAlquilerElemento contratoAlquilerElementoBD = this.contratoAlquilerElementoDao.add(contratoAlquilerElemento);
		// Además de modificar el registro en BBDD, tenemos que validar si
		// debemos modificar la fecha fin del contrato anterior
		Integer resultado = this
				.validarFechaFinContrato(contratoAlquilerElemento);
		if (resultado != null) {
			// Actualizacion del contrato anterior
			contratoAlquilerElementoDao.updateFecFinContratoAnterior(
					contratoAlquilerElementoBD, resultado);
		}
		return contratoAlquilerElementoBD;
	}

	/**
	 * Updates a single row in the ContratoAlquilerElemento table.
	 * 
	 * @param contratoAlquilerElemento
	 *            ContratoAlquilerElemento
	 * @return ContratoAlquilerElemento
	 */
	@Override
	@Transactional(rollbackFor = Throwable.class)
@PreAuthorize("hasPermission('CONTRATO_ALQUILER_ELEMENTO_SERVICE','SecureService','write')")
	public ContratoAlquilerElemento update(
			ContratoAlquilerElemento contratoAlquilerElemento) {
		ContratoAlquilerElemento contratoAlquilerElementoModificado = null;
		// find for update
		ContratoAlquilerElemento contratoAlquilerElementoBD = this.contratoAlquilerElementoDao
				.findForUpdate(contratoAlquilerElemento);
		// actualizar datos modificables
		contratoAlquilerElementoBD.setFecEntContrato(contratoAlquilerElemento
				.getFecEntContrato());
		contratoAlquilerElementoBD.setFecInicio(contratoAlquilerElemento
				.getFecInicio());
		contratoAlquilerElementoBD.setFecFin(contratoAlquilerElemento
				.getFecFin());
		contratoAlquilerElementoBD.setFecEmpadron(contratoAlquilerElemento
				.getFecEmpadron());
		contratoAlquilerElementoBD.setFecEnvContrato(contratoAlquilerElemento
				.getFecEnvContrato());
		contratoAlquilerElementoBD
				.setFecEnvFinContrato(contratoAlquilerElemento
						.getFecEnvFinContrato());
		contratoAlquilerElementoBD.setFecIniFac(contratoAlquilerElemento
				.getFecIniFac());
		contratoAlquilerElementoBD.setPagador(contratoAlquilerElemento
				.getPagador());
		contratoAlquilerElementoBD.setDireccion(contratoAlquilerElemento
				.getDireccion());
		contratoAlquilerElementoBD.setImcPrecioRenta(contratoAlquilerElemento
				.getImcPrecioRenta());
		contratoAlquilerElementoBD
				.setTipoContratoAlquiler(contratoAlquilerElemento
						.getTipoContratoAlquiler());
		contratoAlquilerElementoBD.setCuentaBancaria(contratoAlquilerElemento
				.getCuentaBancaria());
		contratoAlquilerElementoBD.setIndVisado(contratoAlquilerElemento
				.getIndVisado());
		contratoAlquilerElementoBD.setFecVisado(contratoAlquilerElemento
				.getFecVisado());
		contratoAlquilerElementoBD.setTexObservaciones(contratoAlquilerElemento
				.getTexObservaciones());

		// Actualiza en BBDD
		contratoAlquilerElementoModificado = this.contratoAlquilerElementoDao
				.update(contratoAlquilerElemento);

		// Además de modificar el registro en BBDD, tenemos que validar si
		// debemos modificar la fecha fin del contrato anterior
		Integer resultado = this
				.validarFechaFinContrato(contratoAlquilerElemento);
		if (resultado != null) {
			// Actualizacion del contrato anterior
			contratoAlquilerElementoDao.updateFecFinContratoAnterior(
					contratoAlquilerElementoBD, resultado);
		}
		return contratoAlquilerElementoModificado;
	}

	/**
	 * Finds a single row in the ContratoAlquilerElemento table.
	 * 
	 * @param contratoAlquilerElemento
	 *            ContratoAlquilerElemento
	 * @return ContratoAlquilerElemento
	 */
	@Override
@PreAuthorize("hasPermission('CONTRATO_ALQUILER_ELEMENTO_SERVICE','SecureService','read')")
	public ContratoAlquilerElemento find(
			ContratoAlquilerElemento contratoAlquilerElemento) {
		return this.contratoAlquilerElementoDao.find(contratoAlquilerElemento);
	}

	/**
	 * Deletes a single row in the ContratoAlquilerElemento table.
	 * 
	 * @param contratoAlquilerElemento
	 *            ContratoAlquilerElemento
	 */
	@Override
	@Transactional(rollbackFor = Throwable.class)
@PreAuthorize("hasPermission('CONTRATO_ALQUILER_ELEMENTO_SERVICE','SecureService','delete')")
	public void remove(ContratoAlquilerElemento contratoAlquilerElemento) {
		this.contratoAlquilerElementoDao.remove(contratoAlquilerElemento);
	}

	/**
	 * Finds a list of rows in the ContratoAlquilerElemento table.
	 * 
	 * @param contratoAlquilerElemento
	 *            ContratoAlquilerElemento
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @return List<ContratoAlquilerElemento>
	 */
	@Override
@PreAuthorize("hasPermission('CONTRATO_ALQUILER_ELEMENTO_SERVICE','SecureService','read')")
	public List<ContratoAlquilerElemento> findAll(
			ContratoAlquilerElemento contratoAlquilerElemento,
			JQGridRequestDto jqGridRequestDto) {
		return this.contratoAlquilerElementoDao.findAll(
				contratoAlquilerElemento, jqGridRequestDto);
	}

	/**
	 * Finds rows in the ContratoAlquilerElemento table using like.
	 * 
	 * @param contratoAlquilerElemento
	 *            ContratoAlquilerElemento
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @param startsWith
	 *            Boolean
	 * @return List<ContratoAlquilerElemento>
	 */
	@Override
@PreAuthorize("hasPermission('CONTRATO_ALQUILER_ELEMENTO_SERVICE','SecureService','read')")
	public List<ContratoAlquilerElemento> findAllLike(
			ContratoAlquilerElemento contratoAlquilerElemento,
			JQGridRequestDto jqGridRequestDto, Boolean startsWith) {
		return this.contratoAlquilerElementoDao.findAllLike(
				contratoAlquilerElemento, jqGridRequestDto, startsWith);
	}

	/*
	 * OPERACIONES RUP_TABLE
	 */

	/**
	 * Filter method in the ContratoAlquilerElemento table.
	 * 
	 * @param filterContratoAlquilerElemento
	 *            ContratoAlquilerElemento
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @param startsWith
	 *            Boolean
	 * @return JQGridResponseDto<ContratoAlquilerElemento>
	 */
	@Override
@PreAuthorize("hasPermission('CONTRATO_ALQUILER_ELEMENTO_SERVICE','SecureService','read')")
	public JQGridResponseDto<ContratoAlquilerElemento> filter(
			ContratoAlquilerElemento filterContratoAlquilerElemento,
			JQGridRequestDto jqGridRequestDto, Boolean startsWith) {
		List<ContratoAlquilerElemento> listaContratoAlquilerElemento = this.contratoAlquilerElementoDao
				.findAllLike(filterContratoAlquilerElemento, jqGridRequestDto,
						false);
		Long recordNum = this.contratoAlquilerElementoDao
				.findAllLikeCount(
						filterContratoAlquilerElemento != null ? filterContratoAlquilerElemento
								: new ContratoAlquilerElemento(), false);
		if (jqGridRequestDto.getMultiselection().getSelectedIds() != null) {
			List<TableRowDto<ContratoAlquilerElemento>> reorderSelection = this.contratoAlquilerElementoDao
					.reorderSelection(filterContratoAlquilerElemento,
							jqGridRequestDto, startsWith);
			return new JQGridResponseDto<ContratoAlquilerElemento>(
					jqGridRequestDto, recordNum, listaContratoAlquilerElemento,
					reorderSelection);
		}
		return new JQGridResponseDto<ContratoAlquilerElemento>(
				jqGridRequestDto, recordNum, listaContratoAlquilerElemento);
	}

	/**
	 * Reorder the selection made in ContratoAlquilerElemento table.
	 * 
	 * @param filterContratoAlquilerElemento
	 *            ContratoAlquilerElemento
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @param startsWith
	 *            Boolean
	 * @return Object
	 */
	@Override
@PreAuthorize("hasPermission('CONTRATO_ALQUILER_ELEMENTO_SERVICE','SecureService','read')")
	public Object reorderSelection(
			ContratoAlquilerElemento filterContratoAlquilerElemento,
			JQGridRequestDto jqGridRequestDto, Boolean startsWith) {
		return this.contratoAlquilerElementoDao.reorderSelection(
				filterContratoAlquilerElemento, jqGridRequestDto, startsWith);
	}

	/**
	 * Funcion que valida la coherencia entre las fechas inicio y fin. Consulta
	 * si estamos en el ultimo contrato. Si estamos en el ultimo contrato, la
	 * fecha inicio debe ser mayor que la fecha inicio del resto de contratos.
	 * Si no estamos en el ultimo contrato, hay que comprobar el rango de fechas
	 * inicio/fin.
	 * 
	 * @param contratoAlquilerElemento
	 *            ContratoAlquilerElemento
	 * @return String
	 */
	@Override
	@Transactional(rollbackFor = Throwable.class)
	public @ResponseBody
	String validarFechasIniFin(ContratoAlquilerElemento contratoAlquilerElemento) {
		return this.contratoAlquilerElementoDao
				.validarFechasIniFin(contratoAlquilerElemento);
	}

	/**
	 * Si estamos modificando el ultimo contrato de la vivienda, se valida si
	 * debemos modificar la fecha fin del contrato anterior, bien porque este
	 * sea nulo o sea superior a la fecha inicio de nuestro contrato, con el día
	 * anterior a la fecha de inicio de nuestro contrato.
	 * 
	 * @param contratoAlquilerElemento
	 *            ContratoAlquilerElemento
	 * @return String
	 */
	@Override
	@Transactional(rollbackFor = Throwable.class)
	public @ResponseBody
	Integer validarFechaFinContrato(
			ContratoAlquilerElemento contratoAlquilerElemento) {
		return this.contratoAlquilerElementoDao
				.validarFechaFinContrato(contratoAlquilerElemento);
	}
}
