package com.ejie.m62fb.service.registroVPP;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Service;

import com.ejie.m62fb.dao.registroVPP.SolicitudReservaDao;
import com.ejie.m62fb.dao.registroVPP.ViviendaSolicitadaDao;
import com.ejie.m62fb.model.SolicitudReserva;
import com.ejie.m62fb.model.ViviendaSolicitada;
import com.ejie.m62fb.utils.sql.Utilidades;
import com.ejie.x38.dto.JQGridRequestDto;
import com.ejie.x38.dto.JQGridResponseDto;

/**
 * SolicitudReservaServiceImpl.
 * 
XXXX
 */
@Service(value = "solicitudesReservaService")
public class SolicitudReservaServiceImpl implements SolicitudReservaService {

	@Autowired
	private SolicitudReservaDao solicitudesReservaDao;

	@Autowired
	private ViviendaSolicitadaDao viviendaSolicitadaDao;

	/**
	 * Guarda una nueva Solicitud Reserva y sus Viviendas Solicitadas
	 * 
	 * SIN SEGURIDAD, Se llama desde el MDB
	 * 
	 * @param solicitudReserva
	 *            SolicitudReserva
	 */
	@Override
	public void guardarSolicitudReserva(SolicitudReserva solicitudReserva) {

		// Guardar SolicitudReserva
		this.solicitudesReservaDao.add(solicitudReserva);

		// Si tiene viviendas solicitadas, las guardamos
		List<ViviendaSolicitada> listVivSol = solicitudReserva
				.getListViviendasSolicitadas();
		if (!Utilidades.isEmptyList(listVivSol)) {
			for (ViviendaSolicitada vivSolicitada : listVivSol) {
				// Informar relacion con la SolicitudReserva
				vivSolicitada.setIdM62r38t0(solicitudReserva.getIdM62r38t0());
				// Guardar ViviendaSolicitada
				this.viviendaSolicitadaDao.add(vivSolicitada);
			}
		}
	}

	/**
	 * Actualiza el estado de la solicitud a "APERTURADO(2)" e informa el
	 * numExpedientePlatea introducido en la apertura
	 * 
	 * SIN SEGURIDAD, Se llama desde el MDB
	 * 
	 * @param solicitudReserva
	 *            SolicitudReserva(idExpedientePlatea(folderId),
	 *            numExpedientePlatea(folderNumber))
	 */
	@Override
	public void updateEstadoApertura(SolicitudReserva solicitudReserva) {
		this.solicitudesReservaDao.updateEstadoApertura(solicitudReserva);
	}

	/**
	 * Actualiza el estado de la solicitud a "NOTIFICADO(3)"
	 * 
	 * SIN SEGURIDAD, Se llama desde el MDB
	 * 
	 * @param solicitudReserva
	 *            SolicitudReserva(idExpedientePlatea(folderId))
	 */
	@Override
	public void updateEstadoNotificacion(SolicitudReserva solicitudReserva) {
		this.solicitudesReservaDao.updateEstadoNotificacion(solicitudReserva);
	}

	/**
	 * Finds a single row in the SolicitudReserva table.
	 * 
	 * @param solicitudReserva
	 *            SolicitudReserva
	 * @return SolicitudReserva
	 */
	@Override
	@PreAuthorize("hasPermission('SOLICITUD_RESERVA_SERVICE','SecureService','read')")
	public SolicitudReserva find(SolicitudReserva solicitudReserva) {
		return this.solicitudesReservaDao.find(solicitudReserva);
	}

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

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

	/*
	 * OPERACIONES RUP_TABLE
	 */

	/**
	 * Filter method in the SolicitudReserva table.
	 * 
	 * @param filterSolicitudesReserva
	 *            SolicitudReserva
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @param startsWith
	 *            Boolean
	 * @return JQGridResponseDto<SolicitudReserva>
	 */
	@Override
	@PreAuthorize("hasPermission('SOLICITUD_RESERVA_SERVICE','SecureService','read')")
	public JQGridResponseDto<SolicitudReserva> filter(
			SolicitudReserva filterSolicitudesReserva,
			JQGridRequestDto jqGridRequestDto, Boolean startsWith) {
		List<SolicitudReserva> listaSolicitudesReserva = this.solicitudesReservaDao
				.findAllLike(filterSolicitudesReserva, jqGridRequestDto, false);
		Long recordNum = this.solicitudesReservaDao.findAllLikeCount(
				filterSolicitudesReserva != null ? filterSolicitudesReserva
						: new SolicitudReserva(), false);
		return new JQGridResponseDto<SolicitudReserva>(jqGridRequestDto,
				recordNum, listaSolicitudesReserva);
	}
}
