package com.ejie.ab39a.service;

import com.ejie.ab39a.dao.EntidadesDao;
import com.ejie.ab39a.exceptions.ErrorField;
import com.ejie.ab39a.exceptions.ErrorGenericoException;
import com.ejie.x38.dto.JQGridRequestDto;
import com.ejie.x38.dto.JQGridResponseDto;
import com.ejie.x38.dto.TableRowDto;

import java.util.ArrayList;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.ejie.ab39a.model.Entidades;

/**
 * Entidades.
 * 
 *  
 */
@Service(value = "entidadesService")
public class EntidadesServiceImpl implements EntidadesService {

	private static final Logger logger = LoggerFactory.getLogger(EntidadesServiceImpl.class);

	@Autowired
	private EntidadesDao entidadesDao;

	/**
	 * Inserts a single row in the Entidades table.
	 *
	 * @param entidades
	 *            Entidades
	 * @return Entidades
	 */
	@Override
	@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED, rollbackFor = Throwable.class)
	public Entidades add(Entidades entidades) {

		Entidades aux = new Entidades();
		aux.setCifnif(entidades.getCifnif());
		List<Entidades> lista = this.entidadesDao.findAll(aux, null);
		if (lista != null && !lista.isEmpty()) {

			List<ErrorField> errores = new ArrayList<ErrorField>();
			errores.add(new ErrorField("validacion.existeCIFEmpresa"));
			throw new ErrorGenericoException(errores);
		}

		return this.entidadesDao.add(entidades);
	}

	/**
	 * Updates a single row in the Entidades table.
	 *
	 * @param entidades
	 *            Entidades
	 * @return Entidades
	 */
	@Override
	@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED, rollbackFor = Throwable.class)
	public Entidades update(Entidades entidades) {

		Entidades aux = new Entidades();
		aux.setCifnif(entidades.getCifnif());
		List<Entidades> lista = this.entidadesDao.findAll(aux, null);
		List<ErrorField> errores = new ArrayList<ErrorField>();
		if (lista != null && lista.size() > 1) {
			EntidadesServiceImpl.logger.debug("EntidadesServiceImpl - edit - Existe 0 mas de 1 empresa con ese cif");
			errores.add(new ErrorField("error.aplicacion"));
			throw new ErrorGenericoException(errores);
		} else if (lista != null && lista.size() == 1) {
			aux = lista.get(0);
			if (aux != null && aux.getCodentidad() != null && entidades != null && entidades.getCodentidad() != null
					&& aux.getCodentidad().intValue() != entidades.getCodentidad().intValue()) {
				errores.add(new ErrorField("validacion.existeCIFEmpresa"));
				throw new ErrorGenericoException(errores);
			}
		}

		return this.entidadesDao.update(entidades);
	}

	/**
	 * Updates a single row in the Entidades table.
	 *
	 * @param entidades
	 *            Entidades
	 * @return Entidades
	 */
	@Override
	@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED, rollbackFor = Throwable.class)
	public Entidades updateEntidad(Entidades entidades) {
		return this.entidadesDao.updateEntidad(entidades);
	}

	/**
	 * Finds a single row in the Entidades table.
	 *
	 * @param entidades
	 *            Entidades
	 * @return Entidades
	 */
	@Override
	@Transactional(propagation = Propagation.SUPPORTS, isolation = Isolation.READ_COMMITTED)
	public Entidades find(Entidades entidades) {
		return this.entidadesDao.find(entidades);
	}

	/**
	 * Deletes a single row in the Entidades table.
	 *
	 * @param entidades
	 *            Entidades
	 */
	@Override
	@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED, rollbackFor = Throwable.class)
	public void remove(Entidades entidades) {
		this.entidadesDao.remove(entidades);
	}

	/**
	 * Finds a list of rows in the Entidades table.
	 *
	 * @param entidades
	 *            Entidades
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @return List<Entidades>
	 */
	@Override
	@Transactional(propagation = Propagation.SUPPORTS, isolation = Isolation.READ_COMMITTED)
	public List<Entidades> findAll(Entidades entidades, JQGridRequestDto jqGridRequestDto) {
		return this.entidadesDao.findAll(entidades, jqGridRequestDto);
	}

	/**
	 * Finds rows in the Entidades table using like.
	 *
	 * @param entidades
	 *            Entidades
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @param startsWith
	 *            Boolean
	 * @return List<Entidades>
	 */
	@Override
	@Transactional(propagation = Propagation.SUPPORTS, isolation = Isolation.READ_COMMITTED)
	public List<Entidades> findAllLike(Entidades entidades, JQGridRequestDto jqGridRequestDto, Boolean startsWith) {
		return this.entidadesDao.findAllLike(entidades, jqGridRequestDto, startsWith);
	}

	/*
	 * OPERACIONES RUP_TABLE
	 */

	/**
	 * Removes rows from the Entidades table.
	 *
	 * @param filterEntidades
	 *            Entidades
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @param startsWith
	 *            Boolean
	 */
	@Override
	@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED, rollbackFor = Throwable.class)
	public void removeMultiple(Entidades filterEntidades, JQGridRequestDto jqGridRequestDto, Boolean startsWith) {
		this.entidadesDao.removeMultiple(filterEntidades, jqGridRequestDto, startsWith);
	}

	/**
	 * Filter method in the Entidades table.
	 *
	 * @param filterEntidades
	 *            Entidades
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @param startsWith
	 *            Boolean
	 * @return JQGridResponseDto<Entidades>
	 */
	@Override
	@Transactional(propagation = Propagation.SUPPORTS, isolation = Isolation.READ_COMMITTED)
	public JQGridResponseDto<Entidades> filter(Entidades filterEntidades, JQGridRequestDto jqGridRequestDto,
			Boolean startsWith) {
		List<Entidades> listaEntidades = this.entidadesDao.findAllLike(filterEntidades, jqGridRequestDto, false);
		Long recordNum = this.entidadesDao.findAllLikeCount(filterEntidades != null ? filterEntidades : new Entidades(),
				false);
		if (jqGridRequestDto.getMultiselection().getSelectedIds() != null) {
			List<TableRowDto<Entidades>> reorderSelection = this.entidadesDao.reorderSelection(filterEntidades,
					jqGridRequestDto, startsWith);
			return new JQGridResponseDto<Entidades>(jqGridRequestDto, recordNum, listaEntidades, reorderSelection);
		}
		return new JQGridResponseDto<Entidades>(jqGridRequestDto, recordNum, listaEntidades);
	}

	/**
	 * Reorder the selection made in Entidades table.
	 *
	 * @param filterEntidades
	 *            Entidades
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @param startsWith
	 *            Boolean
	 * @return Object
	 */
	@Override
	@Transactional(propagation = Propagation.SUPPORTS, isolation = Isolation.READ_COMMITTED)
	public Object reorderSelection(Entidades filterEntidades, JQGridRequestDto jqGridRequestDto, Boolean startsWith) {
		return this.entidadesDao.reorderSelection(filterEntidades, jqGridRequestDto, startsWith);
	}

}
