package com.ejie.ab63.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.ejie.ab63.comun.Constantes;
import com.ejie.ab63.dao.HabitacionDao;
import com.ejie.ab63.model.EstablecimientoData;
import com.ejie.ab63.model.Habitacion;
import com.ejie.ab63.model.TipoAseo;
import com.ejie.ab63.model.TipoHabitacion;
import com.ejie.x38.dto.JerarquiaDto;
import com.ejie.x38.dto.TableRequestDto;
import com.ejie.x38.dto.TableResponseDto;
import com.ejie.x38.dto.TableRowDto;

/**
 * Ab6322s00ServiceImpl  
 * 
 *  
 */

@Service(value = "habitacionService")
public class HabitacionServiceImpl implements HabitacionService {

	@Autowired
	private HabitacionDao ab6322s00Dao;

	@Autowired
	private EstablecimientoDataService establecimientoDataService;

	@Autowired
	TipoAseoService tipoAseoService;

	@Autowired
	TipoHabitacionService tipoHabitacionService;

	/**
	 * Inserts a single row in the Ab6322s00 table.
	 *
	 * @param ab6322s00
	 *            Ab6322s00
	 * @return Ab6322s00
	 */
	@Transactional(rollbackFor = Throwable.class)
	public Habitacion add(Habitacion ab6322s00) {
		return this.ab6322s00Dao.add(ab6322s00);
	}

	/**
	 * Updates a single row in the Ab6322s00 table.
	 *
	 * @param ab6322s00
	 *            Ab6322s00
	 * @return Ab6322s00
	 */
	@Transactional(rollbackFor = Throwable.class)
	public Habitacion update(Habitacion ab6322s00) {
		return this.ab6322s00Dao.update(ab6322s00);
	}

	/**
	 * Finds a single row in the Ab6322s00 table.
	 *
	 * @param ab6322s00
	 *            Ab6322s00
	 * @return Ab6322s00
	 */
	public Habitacion find(Habitacion ab6322s00) {
		return (Habitacion) this.ab6322s00Dao.find(ab6322s00);
	}

	/**
	 * Deletes a single row in the Ab6322s00 table.
	 *
	 * @param ab6322s00
	 *            Ab6322s00
	 */
	@Transactional(rollbackFor = Throwable.class)
	public void remove(Habitacion ab6322s00, Integer idEstablecimiento) {

		this.ab6322s00Dao.remove(ab6322s00);

		EstablecimientoData establecimientoData = new EstablecimientoData(idEstablecimiento);

		this.establecimientoDataService.updateTotalesHoteles(establecimientoData);

	}

	/**
	 * Finds a list of rows in the Ab6322s00 table.
	 *
	 * @param ab6322s00
	 *            Ab6322s00
	 * @param tableRequestDto
	 *            TableRequestDto
	 * @return List<Ab6322s00>
	 */
	public List<Habitacion> findAll(Habitacion ab6322s00, TableRequestDto tableRequestDto) {
		return (List<Habitacion>) this.ab6322s00Dao.findAll(ab6322s00, tableRequestDto);
	}

	/**
	 * Finds rows in the Ab6322s00 table using like.
	 *
	 * @param ab6322s00
	 *            Ab6322s00
	 * @param tableRequestDto
	 *            TableRequestDto
	 * @param startsWith
	 *            Boolean
	 * @return List<Ab6322s00>
	 */
	public List<Habitacion> findAllLike(Habitacion ab6322s00, TableRequestDto tableRequestDto, Boolean startsWith) {
		return (List<Habitacion>) this.ab6322s00Dao.findAllLike(ab6322s00, tableRequestDto, startsWith);
	}

	/*
	 * OPERACIONES RUP_TABLE
	 */

	/**
	 * Removes rows from the Ab6322s00 table.
	 *
	 * @param filterAb6322s00
	 *            Ab6322s00
	 * @param tableRequestDto
	 *            TableRequestDto
	 * @param startsWith
	 *            Boolean
	 */
	public void removeMultiple(Habitacion filterAb6322s00, TableRequestDto tableRequestDto, Boolean startsWith) {
		this.ab6322s00Dao.removeMultiple(filterAb6322s00, tableRequestDto, startsWith);
	}

	/**
	 * Filter method in the Ab6322s00 table.
	 *
	 * @param filterAb6322s00
	 *            Ab6322s00
	 * @param tableRequestDto
	 *            TableRequestDto
	 * @param startsWith
	 *            Boolean
	 * @return TableResponseDto<Ab6322s00>
	 */
	public TableResponseDto<Habitacion> filter(Habitacion filterAb6322s00, TableRequestDto tableRequestDto,
			Boolean startsWith) {
		List<Habitacion> listaAb6322s00 = this.ab6322s00Dao.findAllLike(filterAb6322s00, tableRequestDto, false);

		for (Habitacion hab : listaAb6322s00) {

			hab.setTotalPlazas(hab.getNumPlazas() * hab.getNumUnidades());

			if (null != hab.getTipoHabitacion() && !"".equals(hab.getTipoHabitacion().getIdTipoHabitacion())) {

				if (LocaleContextHolder.getLocale().getLanguage().equalsIgnoreCase(Constantes.CASTELLANO)) {
					hab.setDescTipoHab(hab.getTipoHabitacion().getDescTipoEs());
				} else {
					hab.setDescTipoHab(hab.getTipoHabitacion().getDescTipoEu());
				}
			}

			if (null != hab.getTipoAseo() && !"".equals(hab.getTipoAseo().getIdTipoAseo())) {

				if (LocaleContextHolder.getLocale().getLanguage().equalsIgnoreCase(Constantes.CASTELLANO)) {
					hab.setDescTipoAseo(hab.getTipoAseo().getDescTipoEs());
				} else {
					hab.setDescTipoAseo(hab.getTipoAseo().getDescTipoEu());
				}
			}

		}

		Long recordNum = this.ab6322s00Dao
				.findAllLikeCount(filterAb6322s00 != null ? filterAb6322s00 : new Habitacion(), false);
		if (tableRequestDto.getMultiselection().getSelectedIds() != null) {
			List<TableRowDto<Habitacion>> reorderSelection = this.ab6322s00Dao.reorderSelection(filterAb6322s00,
					tableRequestDto, startsWith);
			return new TableResponseDto<Habitacion>(tableRequestDto, recordNum, listaAb6322s00, reorderSelection);
		}
		return new TableResponseDto<Habitacion>(tableRequestDto, recordNum, listaAb6322s00);
	}

	/**
	 * Searches rows in the Ab6322s00 table.
	 *
	 * @param filterAb6322s00
	 *            Ab6322s00
	 * @param searchAb6322s00
	 *            Ab6322s00
	 * @param tableRequestDto
	 *            TableRequestDto
	 * @param startsWith
	 *            Boolean
	 * @return List<TableRowDto<Ab6322s00>>
	 */
	public List<TableRowDto<Habitacion>> search(Habitacion filterAb6322s00, Habitacion searchAb6322s00,
			TableRequestDto tableRequestDto, Boolean startsWith) {
		return this.ab6322s00Dao.search(filterAb6322s00, searchAb6322s00, tableRequestDto, startsWith);
	}

	/**
	 * Reorder the selection made in Ab6322s00 table.
	 *
	 * @param filterAb6322s00
	 *            Ab6322s00
	 * @param tableRequestDto
	 *            TableRequestDto
	 * @param startsWith
	 *            Boolean
	 * @return Object
	 */
	public Object reorderSelection(Habitacion filterAb6322s00, TableRequestDto tableRequestDto, Boolean startsWith) {
		return this.ab6322s00Dao.reorderSelection(filterAb6322s00, tableRequestDto, startsWith);
	}

	/*
	 * OPERACIONES RUP_TABLE JERARQUIA
	 */

	/**
	 * Finder method in the hierarchical the Ab6322s00 table.
	 *
	 * @param filterAb6322s00
	 *            Ab6322s00
	 * @param tableRequestDto
	 *            TableRequestDto
	 * @param startsWith
	 *            Boolean
	 * @return TableResponseDto<JerarquiaDto<Ab6322s00>>
	 */
	public TableResponseDto<JerarquiaDto<Habitacion>> jerarquia(Habitacion filterAb6322s00,
			TableRequestDto tableRequestDto, Boolean startsWith) {
		List<JerarquiaDto<Habitacion>> listaAb6322s00 = this.ab6322s00Dao.findAllLikeJerarquia(filterAb6322s00,
				tableRequestDto);
		Long recordNum = this.ab6322s00Dao.findAllLikeCountJerarquia(filterAb6322s00, tableRequestDto);
		return new TableResponseDto<JerarquiaDto<Habitacion>>(tableRequestDto, recordNum, listaAb6322s00);
	}

	/**
	 * Finder method for siblings rows in the hierarchical the Ab6322s00 table.
	 *
	 * @param filterAb6322s00
	 *            Ab6322s00
	 * @param tableRequestDto
	 *            TableRequestDto
	 * @return TableResponseDto<JerarquiaDto<Ab6322s00>>
	 */
	public TableResponseDto<JerarquiaDto<Habitacion>> jerarquiaChildren(Habitacion filterAb6322s00,
			TableRequestDto tableRequestDto) {
		TableResponseDto<JerarquiaDto<Habitacion>> tableResponseDto = new TableResponseDto<JerarquiaDto<Habitacion>>();
		tableResponseDto.addAdditionalParam(TableResponseDto.CHILDREN,
				this.ab6322s00Dao.findAllChild(filterAb6322s00, tableRequestDto));
		return tableResponseDto;
	}

	@Override
	@Transactional(rollbackFor = Throwable.class)
	public Habitacion save(Habitacion ab6322s00) {
		if (null != ab6322s00.getIdHabitacion() && ab6322s00.getIdHabitacion() > 0) {
			ab6322s00 = this.update(ab6322s00);
		} else {
			ab6322s00 = this.add(ab6322s00);
		}

		EstablecimientoData establecimientoData = new EstablecimientoData(
				ab6322s00.getEstablecimientoData().getIdEstablecimiento());

		this.establecimientoDataService.updateTotalesHoteles(establecimientoData);

		return ab6322s00;
	}

	@Override
	public Long getTotalHabDblByIdEst(Integer idEstablecimiento) {
		return this.ab6322s00Dao.getTotalHabDblByIdEst(idEstablecimiento);
	}

	@Override
	public Long getTotalHabDblCsByIdEst(Integer idEstablecimiento) {
		return this.ab6322s00Dao.getTotalHabDblCsByIdEst(idEstablecimiento);
	}

	@Override
	public Long getTotalHabIndByIdEst(Integer idEstablecimiento) {
		return this.ab6322s00Dao.getTotalHabIndByIdEst(idEstablecimiento);
	}

	@Override
	public Long getTotalHabMultiplesByIdEst(Integer idEstablecimiento) {
		return this.ab6322s00Dao.getTotalHabMultiplesByIdEst(idEstablecimiento);
	}

	@Override
	public void addMasivo(List<Habitacion> listaHabitaciones) {
		for (Habitacion habitacion : listaHabitaciones) {
			TipoHabitacion tipoHabitacion = new TipoHabitacion();
			TipoAseo tipoAseo = new TipoAseo();

			tipoHabitacion.setDescTipoEs(habitacion.getDescTipoHab());
			if (null != tipoHabitacion.getDescTipoEs() && !tipoHabitacion.getDescTipoEs().equals("")) {
				List<TipoHabitacion> listaTipoHabitacion = tipoHabitacionService.findAllLike(tipoHabitacion, null,
						false);
				if (!listaTipoHabitacion.isEmpty()) {
					habitacion.setTipoHabitacion(listaTipoHabitacion.get(0));
				}
			}

			tipoAseo.setDescTipoEs(habitacion.getDescTipoAseo());
			List<TipoAseo> listaTipoAseo = tipoAseoService.findAllLike(tipoAseo, null, false);
			if (!listaTipoAseo.isEmpty()) {
				habitacion.setTipoAseo(listaTipoAseo.get(0));
			}
			if (null != habitacion.getIdHabitacion()) {
				this.ab6322s00Dao.update(habitacion);
			} else {
				this.ab6322s00Dao.add(habitacion);
			}
		}
	}

	@Override
	public Long getTotalUnidadesResumen(Integer idEstablecimiento) {
		return this.ab6322s00Dao.getTotalUnidadesResumen(idEstablecimiento);
	}

	@Override
	public Long getTotalUnidadesDetalle(Integer idEstablecimiento) {
		return this.ab6322s00Dao.getTotalUnidadesDetalle(idEstablecimiento);
	}

	@Override
	public Long getTotalPlazasResumen(Integer idEstablecimiento) {
		return this.ab6322s00Dao.getTotalPlazasResumen(idEstablecimiento);
	}

	@Override
	public Long getTotalPlazasDetalle(Integer idEstablecimiento) {
		return this.ab6322s00Dao.getTotalPlazasDetalle(idEstablecimiento);
	}
}
