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.utils.constants.IberErrorsMsgConstants;
import com.ejie.m62fb.utils.error.UFException;
import com.ejie.m62fb.dao.registroVPP.ContratoAlquileradDao;
import com.ejie.m62fb.model.ContratoAlquiler;
import com.ejie.m62fb.model.ContratoAlquilerad;
import com.ejie.x38.dto.JQGridRequestDto;
import com.ejie.x38.dto.JQGridResponseDto;
import com.ejie.x38.dto.TableRowDto;

/**
 * ContratoAlquileradServiceImpl generated by UDA, 08-oct-2015 9:02:54.
XXXX
 */

@Service(value = "contratoAlquileradService")
public class ContratoAlquileradServiceImpl implements ContratoAlquileradService {

	@Autowired
	private ContratoAlquileradDao contratoAlquileradDao;

	/**
	 * Inserts a single row in the ContratoAlquilerad table.
	 *
	 * @param contratoAlquilerad ContratoAlquilerad
	 * @return ContratoAlquilerad
	 */
	@Transactional(rollbackFor = Throwable.class)
@PreAuthorize("hasPermission('CONTRATO_ALQUILERAD_SERVICE','SecureService','create')")
	public ContratoAlquilerad add(ContratoAlquilerad contratoAlquilerad) {
		
		ContratoAlquilerad contratoAlquileradBD = null;
		// Validacion fechas inicio/fin. Mensaje de error si la fecha fin es
		// menor que la fecha inicio
		if (contratoAlquilerad.getFecFin()
				.before(contratoAlquilerad.getFecInicio())) {
			// Mensaje error
			throw new UFException(IberErrorsMsgConstants.FECHA_FIN_MAYOR);
		} else {
			// ADD
			contratoAlquileradBD = this.contratoAlquileradDao.add(contratoAlquilerad);
			// Además de añadir el registro en BBDD, tenemos que validar si
			// debemos
			// modificar la fecha fin del contrato anterior
			Integer resultado = this.validarFechaFinContrato(contratoAlquilerad);
			if (resultado != null) {
				// Actualizacion del contrato anterior
				contratoAlquileradDao.updateFecFinContratoAnterior(
						contratoAlquilerad, resultado);
			}
		}
		return contratoAlquileradBD;
		
	}

	/**
	 * Updates a single row in the ContratoAlquilerad table.
	 *
	 * @param contratoAlquilerad ContratoAlquilerad
	 * @return ContratoAlquilerad
	 */
	@Transactional(rollbackFor = Throwable.class)
@PreAuthorize("hasPermission('CONTRATO_ALQUILERAD_SERVICE','SecureService','write')")
	public ContratoAlquilerad update(ContratoAlquilerad contratoAlquilerad) {
		
		ContratoAlquilerad contratoAlquileradModificado = null;
		// find for update
		ContratoAlquilerad contratoAlquileradBD = this.contratoAlquileradDao
				.findForUpdate(contratoAlquilerad);
		
		// actualizar datos modificables
		contratoAlquileradBD.getAlojamientoDotacional().setIdAlojReg(
				contratoAlquilerad.getAlojamientoDotacional().getIdAlojReg());
		
		contratoAlquileradBD.setNumContrato(contratoAlquilerad
				.getNumContrato());	
		
		contratoAlquileradBD.setFecEntContrato(contratoAlquilerad
				.getFecEntContrato());		
		contratoAlquileradBD.setFecInicio(contratoAlquilerad.getFecInicio());
		contratoAlquileradBD.setFecFin(contratoAlquilerad.getFecFin());
		contratoAlquileradBD.setIndVisado(contratoAlquilerad.getIndVisado());
		contratoAlquileradBD.setFecVisado(contratoAlquilerad.getFecVisado());
		contratoAlquileradBD.setFecEmpadron(contratoAlquilerad.getFecEmpadron());
		contratoAlquileradBD.setPagadorRenta(contratoAlquilerad.getPagadorRenta());
//		contratoAlquileradBD.setImpPrecioRenta(contratoAlquilerad
//				.getImpPrecioRenta());
		contratoAlquileradBD.setImcPrecioRenta(contratoAlquilerad
				.getImcPrecioRenta());
//		contratoAlquileradBD.setImpFianza(contratoAlquilerad
//				.getImpFianza());
		contratoAlquileradBD.setImcFianza(contratoAlquilerad
				.getImcFianza());
		contratoAlquileradBD.setCuentaBancaria(contratoAlquilerad
				.getCuentaBancaria());
		contratoAlquileradBD.setTexObservaciones(contratoAlquilerad
				.getTexObservaciones());
//		contratoAlquileradBD.setFecEnvContrato(contratoAlquilerad
//				.getFecEnvContrato());
//		contratoAlquileradBD.setFecEnvFinContrato(contratoAlquilerad
//				.getFecEnvFinContrato());
//		contratoAlquileradBD.setFecIniFac(contratoAlquilerad
//				.getFecIniFac());
		contratoAlquileradBD.setDireccion(contratoAlquilerad.getDireccion());
		

		// Validacion fechas inicio/fin. Mensaje de error si la fecha fin es
		// menor que la fecha inicio
		if (contratoAlquilerad.getFecFin()
				.before(contratoAlquilerad.getFecInicio())) {
			// Mensaje error
			throw new UFException(IberErrorsMsgConstants.FECHA_FIN_MAYOR);
		} else {
			// Actualiza en BBDD
			contratoAlquileradModificado = this.contratoAlquileradDao
					.update(contratoAlquileradBD);

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

	/**
	 * Finds a single row in the ContratoAlquilerad table.
	 *
	 * @param contratoAlquilerad ContratoAlquilerad
	 * @return ContratoAlquilerad
	 */
@PreAuthorize("hasPermission('CONTRATO_ALQUILERAD_SERVICE','SecureService','read')")
	public ContratoAlquilerad find(ContratoAlquilerad contratoAlquilerad) {
		return (ContratoAlquilerad) this.contratoAlquileradDao.find(contratoAlquilerad);
	}
	
	/**
	 * Deletes a single row in the ContratoAlquilerad table.
	 *
	 * @param contratoAlquilerad ContratoAlquilerad
	 */
	@Transactional(rollbackFor = Throwable.class)
@PreAuthorize("hasPermission('CONTRATO_ALQUILERAD_SERVICE','SecureService','delete')")
	public void remove(ContratoAlquilerad contratoAlquilerad) {
		this.contratoAlquileradDao.remove(contratoAlquilerad);
	}

	/**
	 * Finds a list of rows in the ContratoAlquilerad table.
	 *
	 * @param contratoAlquilerad ContratoAlquilerad
	 * @param jqGridRequestDto JQGridRequestDto
	 * @return List<ContratoAlquilerad>
	 */
@PreAuthorize("hasPermission('CONTRATO_ALQUILERAD_SERVICE','SecureService','read')")
	public List<ContratoAlquilerad> findAll(ContratoAlquilerad contratoAlquilerad, JQGridRequestDto jqGridRequestDto){
		return (List<ContratoAlquilerad>) this.contratoAlquileradDao.findAll(contratoAlquilerad, jqGridRequestDto);
	}
    
	/**
	 * Finds rows in the ContratoAlquilerad table using like.
	 *
	 * @param contratoAlquilerad ContratoAlquilerad
	 * @param jqGridRequestDto JQGridRequestDto
     * @param startsWith Boolean	 
	 * @return List<ContratoAlquilerad>
	 */
@PreAuthorize("hasPermission('CONTRATO_ALQUILERAD_SERVICE','SecureService','read')")
	public List<ContratoAlquilerad> findAllLike(ContratoAlquilerad contratoAlquilerad, JQGridRequestDto jqGridRequestDto, Boolean startsWith){
		return (List<ContratoAlquilerad>) this.contratoAlquileradDao.findAllLike(contratoAlquilerad, jqGridRequestDto, startsWith);
	}

	/*
	 * OPERACIONES RUP_TABLE
	 */
	 
	/**
	 * Filter method in the ContratoAlquilerad table.
	 *
	 * @param filterContratoAlquilerad ContratoAlquilerad
	 * @param jqGridRequestDto JQGridRequestDto
	 * @param startsWith Boolean
	 * @return JQGridResponseDto<ContratoAlquilerad>
	 */	
@PreAuthorize("hasPermission('CONTRATO_ALQUILERAD_SERVICE','SecureService','read')")
	public JQGridResponseDto< ContratoAlquilerad> filter(ContratoAlquilerad filterContratoAlquilerad, JQGridRequestDto jqGridRequestDto,  Boolean startsWith){
		List<ContratoAlquilerad> listaContratoAlquilerad =  this.contratoAlquileradDao.findAllLike(filterContratoAlquilerad, jqGridRequestDto, false);
		Long recordNum =  this.contratoAlquileradDao.findAllLikeCount(filterContratoAlquilerad != null ? filterContratoAlquilerad: new ContratoAlquilerad (),false);
		if (jqGridRequestDto.getMultiselection().getSelectedIds()!=null){
			List< TableRowDto< ContratoAlquilerad>> reorderSelection = this.contratoAlquileradDao.reorderSelection(filterContratoAlquilerad, jqGridRequestDto, startsWith);
			return new JQGridResponseDto<ContratoAlquilerad>(jqGridRequestDto, recordNum, listaContratoAlquilerad, reorderSelection);
		}
		return new JQGridResponseDto<ContratoAlquilerad>(jqGridRequestDto, recordNum, listaContratoAlquilerad);   
	}
    
    
    /**
	 * Reorder the selection made in ContratoAlquilerad table.
	 *
	 * @param filterContratoAlquilerad ContratoAlquilerad
	 * @param jqGridRequestDto JQGridRequestDto
	 * @param startsWith Boolean
	 * @return Object
	 */	
@PreAuthorize("hasPermission('CONTRATO_ALQUILERAD_SERVICE','SecureService','read')")
    public Object reorderSelection(ContratoAlquilerad filterContratoAlquilerad, JQGridRequestDto jqGridRequestDto, Boolean startsWith){
		return this.contratoAlquileradDao.reorderSelection(filterContratoAlquilerad, 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 ContratoAlquilerad
	 *            ContratoAlquilerAd
	 * @return String
	 */
	@Override
	@Transactional(rollbackFor = Throwable.class)
	public @ResponseBody
	String validarFechasIniFin(ContratoAlquilerad contratoAlquilerAd) {
		return this.contratoAlquileradDao.validarFechasIniFin(contratoAlquilerAd);
	}

	/**
	 * Si estamos modificando el ultimo contrato del alojamiento dotacional, 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 ContratoAlquilerad
	 *            ContratoAlquilerAd
	 * @return String
	 */
	@Override
	@Transactional(rollbackFor = Throwable.class)
	public Integer validarFechaFinContrato(ContratoAlquilerad contratoAlquilerAd) {
		return this.contratoAlquileradDao
				.validarFechaFinContrato(contratoAlquilerAd);
	}
    
	 /**
	 * Returns a Integer. Máximo NUM_CONTRATO que hay para un alojamiento en
	 * la tabla CONTRATO_ALQUILERAD e incrementandolo en 1.
	 * 
	 * @param idAlojReg
	 *            Integer
	 * @return Integer Siguiente n&uacute;mero de contrato
	 */
	@Override
	@Transactional(readOnly = true)
	public Integer findNumContratoMaxMasUno(Integer idAlojReg) {
		return this.contratoAlquileradDao
		.findNumContratoMaxMasUno(idAlojReg);
	}
}

