package com.ejie.ab79.service.propuestaSancion;

import java.util.List;

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

import com.ejie.ab79.dao.propuestaSancion.PropuestaSancionDerechosDao;
import com.ejie.ab79.dao.propuestaSancion.PropuestaSancionInfraccionesDao;
import com.ejie.ab79.model.propuestaSancion.DerechosPropuesta;
import com.ejie.ab79.model.propuestaSancion.InfraccionesPropuesta;
import com.ejie.x38.dto.TableRequestDto;
import com.ejie.x38.dto.TableResponseDto;
import com.ejie.x38.dto.TableRowDto;

@Service(value = "propuestaSancionInfraccionesService")
public class PropuestaSancionInfraccionesServiceImpl implements PropuestaSancionInfraccionesService {

	@Autowired
	private PropuestaSancionInfraccionesDao propuestaSancionInfraccionesDao;
	@Autowired
	private PropuestaSancionDerechosDao propuestaSancionDerechosDao;

	@Override
	public TableResponseDto<InfraccionesPropuesta> filter(InfraccionesPropuesta filterInfracciones,
			TableRequestDto tableRequestDto, boolean startsWith) {

		List<InfraccionesPropuesta> listaInfraccionesDerechos = this.propuestaSancionInfraccionesDao
				.findInfraccionesDerechos(filterInfracciones, tableRequestDto);
		Long recordNum = this.propuestaSancionInfraccionesDao.findInfraccionesDerechosCount(
				filterInfracciones != null ? filterInfracciones : new InfraccionesPropuesta());

		return new TableResponseDto<InfraccionesPropuesta>(tableRequestDto, recordNum, listaInfraccionesDerechos);
	}

	@Transactional(rollbackFor = Throwable.class)
	public InfraccionesPropuesta add(InfraccionesPropuesta infraccionesPropuesta) {

		/* Insertar infracciones */
		InfraccionesPropuesta infraccionesAux = propuestaSancionInfraccionesDao.add(infraccionesPropuesta);

		/* Agregar registro en REL_ART_INF_SAN_DER */
		DerechosPropuesta derechosPropuesta = new DerechosPropuesta();
		derechosPropuesta.setIdInfraccionPropuesta(infraccionesAux.getIdRelArtInfProSan());
		derechosPropuesta.setFechaRegistro(infraccionesAux.getFechaRegistro());
		derechosPropuesta.setUsuarioRegistro(infraccionesAux.getUsuarioRegistro());
		String[] listaDerechosInf = infraccionesPropuesta.getIdDerechosInf().split("\\#");
		for (int i = 0; i < listaDerechosInf.length; i++) {
			derechosPropuesta.setIdDerecho(Integer.parseInt(listaDerechosInf[i]));

			this.propuestaSancionDerechosDao.add(derechosPropuesta);
		}

		return infraccionesAux;
	}

	@Override
	public InfraccionesPropuesta update(InfraccionesPropuesta infraccionesPropuesta) {
		/* Actualizar infracciones */
		InfraccionesPropuesta infraccionesAux = propuestaSancionInfraccionesDao.update(infraccionesPropuesta);

		this.propuestaSancionDerechosDao.removeByInfraccion(infraccionesAux.getIdRelArtInfProSan());

		/* Agregar registro en REL_ART_INF_SAN_DER */
		DerechosPropuesta derechosPropuesta = new DerechosPropuesta();
		derechosPropuesta.setIdInfraccionPropuesta(infraccionesAux.getIdRelArtInfProSan());
		derechosPropuesta.setFechaRegistro(infraccionesAux.getFechaUltmodificacion());
		derechosPropuesta.setUsuarioRegistro(infraccionesAux.getUsuarioUltmodificacion());
		String[] listaDerechosInf = infraccionesPropuesta.getIdDerechosInf().split("\\#");
		for (int i = 0; i < listaDerechosInf.length; i++) {
			derechosPropuesta.setIdDerecho(Integer.parseInt(listaDerechosInf[i]));

			this.propuestaSancionDerechosDao.add(derechosPropuesta);
		}

		return infraccionesAux;
	}

	@Override
	public List<InfraccionesPropuesta> findAllInfraccionesPropuesta(InfraccionesPropuesta infraccionesPropuesta,
			TableRequestDto tableRequestDto) {
		return propuestaSancionInfraccionesDao.findAll(infraccionesPropuesta, tableRequestDto);
	}

	@Override
	public List<TableRowDto<InfraccionesPropuesta>> search(InfraccionesPropuesta filterInfracciones,
			InfraccionesPropuesta searchInfracciones, TableRequestDto tableRequestDto, boolean startsWith) {
		return this.propuestaSancionInfraccionesDao.search(filterInfracciones, searchInfracciones, tableRequestDto,
				startsWith);
	}

	@Override
	public void remove(InfraccionesPropuesta filterInfraccion) {
		this.propuestaSancionInfraccionesDao.remove(filterInfraccion);
	}

	@Override
	public Long findInfraccionesDerechosCount(InfraccionesPropuesta filterInfracciones) {
		return this.propuestaSancionInfraccionesDao.findInfraccionesDerechosCount(
				filterInfracciones != null ? filterInfracciones : new InfraccionesPropuesta());
	}

	@Override
	public InfraccionesPropuesta find(InfraccionesPropuesta infraccionPropuesta) {
		return (InfraccionesPropuesta) this.propuestaSancionInfraccionesDao.find(infraccionPropuesta);
	}

}
