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.math.BigDecimal;
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.m62fb.dao.registroVPP.ViviendaReservadaDao;
import com.ejie.m62fb.dao.registroVPP.ViviendaSolicitadaDao;
import com.ejie.m62fb.model.ViviendaReservada;
import com.ejie.m62fb.model.ViviendaSolicitada;
import com.ejie.x38.dto.JQGridRequestDto;
import com.ejie.x38.dto.JQGridResponseDto;
import com.ejie.x38.dto.TableRowDto;

/**
 * ViviendaReservadaServiceImpl generated by UDA, 20-nov-2015 10:16:26.
 * 
XXXX
 */

@Service(value = "viviendaReservadaService")
public class ViviendaReservadaServiceImpl implements ViviendaReservadaService {

	@Autowired
	private ViviendaReservadaDao viviendaReservadaDao;

	@Autowired
	private ViviendaSolicitadaDao viviendaSolicitadaDao;

	/**
	 * Inserts a single row in the ViviendaReservada table.
	 * 
	 * @param viviendaReservada
	 *            ViviendaReservada
	 * @return ViviendaReservada
	 */
	@Override
	@Transactional(rollbackFor = Throwable.class)
@PreAuthorize("hasPermission('VIVIENDA_RESERVADA_SERVICE','SecureService','create')")
	public ViviendaReservada add(ViviendaReservada viviendaReservada) {
		viviendaReservada = this.viviendaReservadaDao.add(viviendaReservada);
		// Además de realizar el alta, hay que actualizar el estado de la
		// vivienda en el catalogo de viviendas para marcarla como no disponible
		// (tras el alta esa vivienda no se puede reservar)
		this.viviendaReservadaDao
				.updateDisponibilidadVivienda(viviendaReservada,false);
		return viviendaReservada;
	}

	/**
	 * Updates a single row in the ViviendaReservada table.
	 * 
	 * @param viviendaReservada
	 *            ViviendaReservada
	 * @return ViviendaReservada
	 */
	@Override
	@Transactional(rollbackFor = Throwable.class)
@PreAuthorize("hasPermission('VIVIENDA_RESERVADA_SERVICE','SecureService','write')")
	public ViviendaReservada update(ViviendaReservada viviendaReservada) {
		// find for update
		ViviendaReservada viviendaReservadaBD = this.viviendaReservadaDao
				.find(viviendaReservada);
		//se comprueba si ha cambiado la vivienda reservada para actualizar su estado o no
		if(viviendaReservada.getViviendaDisponible().getNumVivienda().compareTo(viviendaReservadaBD.getViviendaDisponible().getNumVivienda())!=0){
			// hay que actualizar el estado de la
			// vivienda nueva en el catalogo de viviendas para marcarla como no disponible
			// (tras el alta esa vivienda no se puede reservar)
			this.viviendaReservadaDao
					.updateDisponibilidadVivienda(viviendaReservadaBD,true);
			// hay que actualizar el estado de la
			// vivienda nueva en el catalogo de viviendas para marcarla como no disponible
			// (tras el alta esa vivienda no se puede reservar)
			this.viviendaReservadaDao
					.updateDisponibilidadVivienda(viviendaReservada,false);
		}
		// actualizar datos modificables
		viviendaReservadaBD.setViviendaDisponible(viviendaReservada.getViviendaDisponible());
		viviendaReservadaBD.setImcPvpTotal(viviendaReservada.getImcPvpTotal());
		viviendaReservadaBD.setIndReservaTemp(viviendaReservada
				.getIndReservaTemp());
		viviendaReservadaBD.setFecReserva(viviendaReservada.getFecReserva());
		viviendaReservadaBD.setFecFinReserva(viviendaReservada
				.getFecFinReserva());
		viviendaReservadaBD.setTexObservaciones(viviendaReservada
				.getTexObservaciones());
		// Actualiza en BBDD
		 this.viviendaReservadaDao.update(viviendaReservadaBD);
		
		return viviendaReservadaBD;
	}

	/**
	 * Finds a single row in the ViviendaReservada table.
	 * 
	 * @param viviendaReservada
	 *            ViviendaReservada
	 * @return ViviendaReservada
	 */
	@Override
@PreAuthorize("hasPermission('VIVIENDA_RESERVADA_SERVICE','SecureService','read')")
	public ViviendaReservada find(ViviendaReservada viviendaReservada) {
		viviendaReservada = this.viviendaReservadaDao.find(viviendaReservada);
		// Una vez obtenidos los datos de la vivienda reservada, hay que buscar
		// los datos de la vivienda solicitada con el idM62R40T0 devuelto por la
		// reservada.
		if (viviendaReservada.getViviendaSolicitada().getIdM62r40t0() != null) {
			ViviendaSolicitada viviendaSolicitada = viviendaSolicitadaDao
					.find(viviendaReservada.getViviendaSolicitada());
			viviendaReservada.setViviendaSolicitada(viviendaSolicitada);
		}
		return viviendaReservada;
	}

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

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

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

	/*
	 * OPERACIONES RUP_TABLE
	 */

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

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