package com.ejie.m62fb.service.registroVPP;

import java.math.BigDecimal;
import java.util.ArrayList;
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.ui.ModelMap;

import com.ejie.m62fb.dao.registroVPP.AcuerdoViviendaDao;
import com.ejie.m62fb.dao.registroVPP.ViviendaReservadaDao;
import com.ejie.m62fb.model.AcuerdoVivienda;
import com.ejie.m62fb.model.SolicitudReserva;
import com.ejie.m62fb.model.ViviendaReservada;
import com.ejie.x38.dto.JQGridRequestDto;

/**
 * AcuerdoViviendaServiceImpl.
 * 
XXXX
 */
@Service(value = "acuerdoViviendaService")
public class AcuerdoViviendaServiceImpl implements AcuerdoViviendaService {

	@Autowired
	private AcuerdoViviendaDao acuerdoViviendaDao;

	@Autowired
	private ViviendaReservadaDao viviendaReservadaDao;

	/**
	 * Guarda el AcuerdoVivienda, comprueba si ya existe, y si es asi, lo borra
	 * antes
	 * 
	 * @param acuerdoVivienda
	 *            AcuerdoVivienda
	 * @return AcuerdoVivienda
	 */
	@Override
	@Transactional(rollbackFor = Throwable.class)
	public AcuerdoVivienda guardar(AcuerdoVivienda acuerdoVivienda) {

		// Si ya existe un acuerdo, lo borramos
		AcuerdoVivienda acuerdoVivAux = this.acuerdoViviendaDao
				.findBySolicitud(acuerdoVivienda.getSolicitudReserva());
		if (acuerdoVivAux != null) {
			this.acuerdoViviendaDao.remove(acuerdoVivAux);
		}

		// Hacemos el ADD del acuerdo
		acuerdoVivienda = this.acuerdoViviendaDao.add(acuerdoVivienda);

		// Actualizamos las viviendas reservadas
		this.viviendaReservadaDao.updateAcuerdo(acuerdoVivienda);

		return acuerdoVivienda;
	}

	/**
	 * Finds a single row in the AcuerdoVivienda table.
	 * 
	 * @param acuerdoVivienda
	 *            AcuerdoVivienda
	 * @return AcuerdoVivienda
	 */
	@Override
	public AcuerdoVivienda find(AcuerdoVivienda acuerdoVivienda) {
		return this.acuerdoViviendaDao.find(acuerdoVivienda);
	}

	/**
	 * Finds a list of rows in the AcuerdoVivienda table.
	 * 
	 * @param acuerdoVivienda
	 *            AcuerdoVivienda
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @return List<AcuerdoVivienda>
	 */
	@Override
	public List<AcuerdoVivienda> findAll(AcuerdoVivienda acuerdoVivienda,
			JQGridRequestDto jqGridRequestDto) {
		return this.acuerdoViviendaDao.findAll(acuerdoVivienda,
				jqGridRequestDto);
	}

	/**
	 * Counts rows in the AcuerdoVivienda table.
	 * 
	 * @param acuerdoVivienda
	 *            AcuerdoVivienda
	 * @return Long
	 */
	@Override
	public Long findAllCount(AcuerdoVivienda acuerdoVivienda) {
		return this.acuerdoViviendaDao.findAllCount(acuerdoVivienda);
	}

	@Override
	public boolean hayVivSolicitadasSinVivReservadas(BigDecimal idM62R38T0){
		return this.acuerdoViviendaDao.hayVivSolicitadasSinVivReservadas(idM62R38T0)>0?true:false;
	}
	/**
	 * Recupera e informa todos los datos necesarios para generar el report
	 * 
	 * @param idM62r38t0
	 *            Integer
	 * @param modelMap
	 *            ModelMap
	 * @return List<AcuerdoVivienda>
	 */
	@Override
	public List<AcuerdoVivienda> fillReportData(Integer idM62r38t0,
			ModelMap modelMap) {
		// Obtener datos
		List<AcuerdoVivienda> datosReport = new ArrayList<AcuerdoVivienda>();

		AcuerdoVivienda acuerdoVivienda = this.acuerdoViviendaDao
				.findBySolicitud(new SolicitudReserva(idM62r38t0));

		ViviendaReservada vivReservada = new ViviendaReservada();
		vivReservada.setIdM62r41t0(acuerdoVivienda.getIdM62r41t0());
		acuerdoVivienda.setVivReservadas(this.viviendaReservadaDao.findAll(
				vivReservada, null));

		datosReport.add(acuerdoVivienda);

		// Datos (field)
		modelMap.put("datosReport", datosReport);

		return datosReport;
	}

	/**
	 * Recupera un acuerdo por el idM62r38t0 de la solicitud
	 * 
	 * @param solicitudReserva
	 *            SolicitudReserva
	 * @return SolicitudReserva
	 */
	@Override
	public AcuerdoVivienda findBySolicitud(SolicitudReserva solicitudReserva) {
		return this.acuerdoViviendaDao.findBySolicitud(solicitudReserva);
	}
}