package com.ejie.ab63.service.pagos;

import java.util.Date;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

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.Transactional;

import com.ejie.ab63.dao.pagos.PagosExpedienteDao;
import com.ejie.ab63.model.pagos.PagosExpediente;
import com.ejie.ab63.model.usuario.Usuario;
import com.ejie.ab63.util.UtilDate;
import com.ejie.x38.dto.JQGridRequestDto;
import com.ejie.x38.dto.JQGridResponseDto;
import com.ejie.x38.dto.JerarquiaDto;
import com.ejie.x38.dto.TableRowDto;

/**
 * PagosExpedienteServiceImpl  
 * 
 *  
 */

@Service(value = "pagosExpedienteService")
public class PagosExpedienteServiceImpl implements PagosExpedienteService {

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

	@Autowired
	private PagosExpedienteDao pagosExpedienteDao;

	/**
	 * Inserts a single row in the PagosExpediente table.
	 *
	 * @param pagosExpediente
	 *            PagosExpediente
	 * @return PagosExpediente
	 */
	@Transactional(rollbackFor = Throwable.class)
	public PagosExpediente add(PagosExpediente pagosExpediente) {
		return this.pagosExpedienteDao.add(pagosExpediente);
	}

	/**
	 * Inserts a single row in the PagosExpediente table.
	 *
	 * @param pagosExpediente
	 *            PagosExpediente
	 * @param idExpediente
	 *            Integer
	 * @param httpRequest
	 *            HttpServletRequest
	 * @param usuario
	 *            Usuario
	 * @return PagosExpediente
	 */
	@Transactional(rollbackFor = Throwable.class)
	public PagosExpediente add(PagosExpediente pagosExpediente, Integer idExpediente, HttpServletRequest httpRequest,
			Usuario usuario) {
		pagosExpediente.setIdExpediente(idExpediente);
		Date fechaRegistro = new Date();
		pagosExpediente.setFechaRegistro(fechaRegistro);
		// pagosExpediente.setUsuarioRegistro(PermisosXLNETS.fncLogin(httpRequest));
		pagosExpediente.setUsuarioRegistro(usuario.getNombreUsuario());
		pagosExpediente.setFechaPagoStr(UtilDate.convertirStringEnStringFormateado(pagosExpediente.getFechaPagoStr()));
		pagosExpediente
				.setFechaEnvSerStr(UtilDate.convertirStringEnStringFormateado(pagosExpediente.getFechaEnvSerStr()));
		pagosExpediente
				.setFechaDocPagStr(UtilDate.convertirStringEnStringFormateado(pagosExpediente.getFechaDocPagStr()));
		PagosExpediente pagosExpedienteAux = this.pagosExpedienteDao.add(pagosExpediente);
		PagosExpedienteServiceImpl.logger.info("[POST] : PagosExpediente insertado correctamente");
		return pagosExpedienteAux;

	}

	/**
	 * Updates a single row in the PagosExpediente table.
	 *
	 * @param pagosExpediente
	 *            PagosExpediente
	 * @return PagosExpediente
	 */
	@Transactional(rollbackFor = Throwable.class)
	public PagosExpediente update(PagosExpediente pagosExpediente) {
		return this.pagosExpedienteDao.update(pagosExpediente);
	}

	/**
	 * Updates a single row in the PagosExpediente table.
	 *
	 * @param pagosExpediente
	 *            PagosExpediente
	 * @param httpRequest
	 *            HttpServletRequest
	 * @param usuario
	 *            Usuario
	 * @return PagosExpediente
	 */
	@Transactional(rollbackFor = Throwable.class)
	public PagosExpediente editPagos(PagosExpediente pagosExpediente, HttpServletRequest httpRequest, Usuario usuario) {
		pagosExpediente.setFechaPagoStr(UtilDate.convertirStringEnStringFormateado(pagosExpediente.getFechaPagoStr()));
		pagosExpediente
				.setFechaEnvSerStr(UtilDate.convertirStringEnStringFormateado(pagosExpediente.getFechaEnvSerStr()));
		pagosExpediente
				.setFechaDocPagStr(UtilDate.convertirStringEnStringFormateado(pagosExpediente.getFechaDocPagStr()));
		Date fechaUltModificacion = new Date();
		pagosExpediente.setFechaUltmodificacion(fechaUltModificacion);
		// pagosExpediente.setUsuarioUltmodificacion(PermisosXLNETS.fncLogin(httpRequest));
		pagosExpediente.setUsuarioUltmodificacion(usuario.getNombreUsuario());
		PagosExpediente pagosExpedienteAux = this.pagosExpedienteDao.updatePagos(pagosExpediente);
		PagosExpedienteServiceImpl.logger.info("[PUT] : PagosExpediente actualizado correctamente");
		return pagosExpedienteAux;

	}

	/**
	 * Updates a single row in the PagosExpediente table.
	 *
	 * @param pagosExpediente
	 *            PagosExpediente
	 * @return PagosExpediente
	 */
	@Transactional(rollbackFor = Throwable.class)
	public PagosExpediente updatePagos(PagosExpediente pagosExpediente) {
		return this.pagosExpedienteDao.updatePagos(pagosExpediente);
	}

	/**
	 * Finds a single row in the PagosExpediente table.
	 *
	 * @param pagosExpediente
	 *            PagosExpediente
	 * @return PagosExpediente
	 */
	public PagosExpediente find(PagosExpediente pagosExpediente) {
		return (PagosExpediente) this.pagosExpedienteDao.find(pagosExpediente);
	}

	/**
	 * Finds a single row in the PagosExpediente table.
	 *
	 * @param pagosExpediente
	 *            PagosExpediente
	 * @return PagosExpediente
	 */
	public PagosExpediente findPagos(PagosExpediente pagosExpediente) {
		return (PagosExpediente) this.pagosExpedienteDao.findPagos(pagosExpediente);
	}

	/**
	 * Deletes a single row in the PagosExpediente table.
	 *
	 * @param pagosExpediente
	 *            PagosExpediente
	 */
	@Transactional(rollbackFor = Throwable.class)
	public void remove(PagosExpediente pagosExpediente) {
		this.pagosExpedienteDao.remove(pagosExpediente);
	}

	/**
	 * Deletes a single row in the PagosExpediente table.
	 *
	 * @param idPagoExpediente
	 *            Integer
	 * @return PagosExpediente
	 */
	@Transactional(rollbackFor = Throwable.class)
	public PagosExpediente remove(Integer idPagoExpediente) {
		PagosExpediente pagosExpediente = new PagosExpediente();
		pagosExpediente.setIdPagoExpediente(idPagoExpediente);
		this.pagosExpedienteDao.remove(pagosExpediente);
		PagosExpedienteServiceImpl.logger.info("[DELETE] : PagosExpediente borrado correctamente");
		return pagosExpediente;
	}

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

	/**
	 * Finds rows in the PagosExpediente table using like.
	 *
	 * @param pagosExpediente
	 *            PagosExpediente
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @param startsWith
	 *            Boolean
	 * @return List<PagosExpediente>
	 */
	public List<PagosExpediente> findAllLike(PagosExpediente pagosExpediente, JQGridRequestDto jqGridRequestDto,
			Boolean startsWith) {
		return (List<PagosExpediente>) this.pagosExpedienteDao.findAllLike(pagosExpediente, jqGridRequestDto,
				startsWith);
	}

	/**
	 * Finds rows in the PagosExpediente table using like.
	 *
	 * @param pagosExpediente
	 *            PagosExpediente
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @param startsWith
	 *            Boolean
	 * @return List<PagosExpediente>
	 */
	public List<PagosExpediente> findAllLikeExportExcel(PagosExpediente pagosExpediente,
			JQGridRequestDto jqGridRequestDto, Boolean startsWith) {
		return (List<PagosExpediente>) this.pagosExpedienteDao.findAllLikeExportExcel(pagosExpediente, jqGridRequestDto,
				startsWith);
	}

	/*
	 * OPERACIONES RUP_TABLE
	 */

	/**
	 * Removes rows from the PagosExpediente table.
	 *
	 * @param filterPagosExpediente
	 *            PagosExpediente
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @param startsWith
	 *            Boolean
	 */
	public void removeMultiple(PagosExpediente filterPagosExpediente, JQGridRequestDto jqGridRequestDto,
			Boolean startsWith) {
		this.pagosExpedienteDao.removeMultiple(filterPagosExpediente, jqGridRequestDto, startsWith);
	}

	/**
	 * Filter method in the PagosExpediente table.
	 *
	 * @param filterPagosExpediente
	 *            PagosExpediente
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @param startsWith
	 *            Boolean
	 * @return JQGridResponseDto<PagosExpediente>
	 */
	public JQGridResponseDto<PagosExpediente> filter(PagosExpediente filterPagosExpediente,
			JQGridRequestDto jqGridRequestDto, Boolean startsWith) {
		List<PagosExpediente> listaPagosExpediente = this.pagosExpedienteDao.findAllLike(filterPagosExpediente,
				jqGridRequestDto, false);

		Long recordNum = this.pagosExpedienteDao
				.findAllLikeCount(filterPagosExpediente != null ? filterPagosExpediente : new PagosExpediente(), false);
		if (jqGridRequestDto.getMultiselection().getSelectedIds() != null) {
			List<TableRowDto<PagosExpediente>> reorderSelection = this.pagosExpedienteDao
					.reorderSelection(filterPagosExpediente, jqGridRequestDto, startsWith);
			return new JQGridResponseDto<PagosExpediente>(jqGridRequestDto, recordNum, listaPagosExpediente,
					reorderSelection);
		}
		return new JQGridResponseDto<PagosExpediente>(jqGridRequestDto, recordNum, listaPagosExpediente);
	}

	/**
	 * Searches rows in the PagosExpediente table.
	 *
	 * @param filterPagosExpediente
	 *            PagosExpediente
	 * @param searchPagosExpediente
	 *            PagosExpediente
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @param startsWith
	 *            Boolean
	 * @return List<TableRowDto<PagosExpediente>>
	 */
	public List<TableRowDto<PagosExpediente>> search(PagosExpediente filterPagosExpediente,
			PagosExpediente searchPagosExpediente, JQGridRequestDto jqGridRequestDto, Boolean startsWith) {
		return this.pagosExpedienteDao.search(filterPagosExpediente, searchPagosExpediente, jqGridRequestDto,
				startsWith);
	}

	/**
	 * Reorder the selection made in PagosExpediente table.
	 *
	 * @param filterPagosExpediente
	 *            PagosExpediente
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @param startsWith
	 *            Boolean
	 * @return Object
	 */
	public Object reorderSelection(PagosExpediente filterPagosExpediente, JQGridRequestDto jqGridRequestDto,
			Boolean startsWith) {
		return this.pagosExpedienteDao.reorderSelection(filterPagosExpediente, jqGridRequestDto, startsWith);
	}

	/*
	 * OPERACIONES RUP_TABLE JERARQUIA
	 */

	/**
	 * Finder method in the hierarchical the PagosExpediente table.
	 *
	 * @param filterPagosExpediente
	 *            PagosExpediente
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @param startsWith
	 *            Boolean
	 * @return JQGridResponseDto<JerarquiaDto<PagosExpediente>>
	 */
	public JQGridResponseDto<JerarquiaDto<PagosExpediente>> jerarquia(PagosExpediente filterPagosExpediente,
			JQGridRequestDto jqGridRequestDto, Boolean startsWith) {
		List<JerarquiaDto<PagosExpediente>> listaPagosExpediente = this.pagosExpedienteDao
				.findAllLikeJerarquia(filterPagosExpediente, jqGridRequestDto);
		Long recordNum = this.pagosExpedienteDao.findAllLikeCountJerarquia(filterPagosExpediente, jqGridRequestDto);
		return new JQGridResponseDto<JerarquiaDto<PagosExpediente>>(jqGridRequestDto, recordNum, listaPagosExpediente);
	}

	/**
	 * Finder method for siblings rows in the hierarchical the PagosExpediente
	 * table.
	 *
	 * @param filterPagosExpediente
	 *            PagosExpediente
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @return JQGridResponseDto<JerarquiaDto<PagosExpediente>>
	 */
	public JQGridResponseDto<JerarquiaDto<PagosExpediente>> jerarquiaChildren(PagosExpediente filterPagosExpediente,
			JQGridRequestDto jqGridRequestDto) {
		JQGridResponseDto<JerarquiaDto<PagosExpediente>> jqGridResponseDto = new JQGridResponseDto<JerarquiaDto<PagosExpediente>>();
		jqGridResponseDto.addAdditionalParam(JQGridResponseDto.CHILDREN,
				this.pagosExpedienteDao.findAllChild(filterPagosExpediente, jqGridRequestDto));
		return jqGridResponseDto;
	}

}
