package com.rjconsultores.ventaboletos.service.impl;

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

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.rjconsultores.ventaboletos.dao.OperadorEmbarcadaDAO;
import com.rjconsultores.ventaboletos.dao.OperadorEmbarcadaLinhaDAO;
import com.rjconsultores.ventaboletos.dao.OperadorEmbarcadaServicoDAO;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.OperadorEmbarcada;
import com.rjconsultores.ventaboletos.entidad.OperadorEmbarcadaLinha;
import com.rjconsultores.ventaboletos.entidad.OperadorEmbarcadaServico;
import com.rjconsultores.ventaboletos.entidad.PuntoVenta;
import com.rjconsultores.ventaboletos.entidad.PuntoVentaVO;
import com.rjconsultores.ventaboletos.exception.BusinessException;
import com.rjconsultores.ventaboletos.service.LogAuditoriaService;
import com.rjconsultores.ventaboletos.service.OperadorEmbarcadaService;
import com.rjconsultores.ventaboletos.vo.corrida.CorridaVO;

@Service("operadorEmbarcadaService")
public class OperadorEmbarcadaServiceImpl implements OperadorEmbarcadaService {

	@Autowired
	private OperadorEmbarcadaDAO operadorDAO;
	@Autowired
	private OperadorEmbarcadaServicoDAO opServicoDAO;
	@Autowired
	private OperadorEmbarcadaLinhaDAO opLinhaDAO;
	
	@Autowired
	private LogAuditoriaService logAuditoriaService;
	private static final Logger log = LogManager.getLogger(OperadorEmbarcadaServiceImpl.class);

	@Transactional(rollbackFor = BusinessException.class)
	@Override
	public OperadorEmbarcada suscribirActualizar(OperadorEmbarcada operador, List<OperadorEmbarcadaLinha> linhas, List<OperadorEmbarcadaServico> listaServicos) throws BusinessException {

		if (operador.getOperadorEmbarcadaId() != null) {
			List<OperadorEmbarcadaServico> listaOpServico = opServicoDAO.buscarPorOperador(operador);

			List<OperadorEmbarcadaLinha> listaOpLinha = opLinhaDAO.buscarPorOperador(operador);

			for (OperadorEmbarcadaServico serv : listaOpServico) {
				operador.getServicos().remove(serv);
				serv.setOperadorEmbarcada(null);
				opServicoDAO.borrar(serv);
			}

			for (OperadorEmbarcadaLinha linha : listaOpLinha) {
				operador.getLinhas().remove(linha);
				linha.setOperadorEmbarcada(null);
				opLinhaDAO.borrar(linha);
			}
		}

		operador.setLinhas(linhas);
		operador.setServicos(listaServicos);

		if (operador.getOperadorEmbarcadaId() == null) {
			operador = operadorDAO.suscribir(operador);
			logAuditoriaService.auditar(null, operador, null);
		} else {
			OperadorEmbarcada operadorClone = null;
			try {
				operadorClone = operador.getCloneObject();
			} catch (CloneNotSupportedException e) {
				log.error("Erro ao clonar oobjeto OperadorEmbarcada, erro: ",e);
			}
			
			operador = operadorDAO.actualizacion(operador);
			
			logAuditoriaService.auditar(operadorClone, operador, null);
		}
		return operador;
	}

	@Transactional
	@Override
	public void apagar(OperadorEmbarcada operador) throws BusinessException {
		logAuditoriaService.auditarExclusao(operador, null);
		operadorDAO.borrar(operador);

	}

	@Override
	public OperadorEmbarcada buscarOperadorEmbarcadaPorUsuario(Integer idUsuario) {
		OperadorEmbarcada operador = operadorDAO.buscarOperadorEmbarcadaPorUsuario(idUsuario);
		try {
			if(operador != null) {
				operador.clonar();
			}
		} catch (CloneNotSupportedException e) {
		}
		
		return operador;
	}

	@Override
	public PuntoVentaVO getPuntoVentaVO(Integer operador) {
		return operadorDAO.getPuntoVentaVO(operador);
	}

	@Override
	public List<CorridaVO> getListaCorridaVO(Integer operador, Empresa empresa, Date dtIni, Date dtFim, PuntoVenta puntoVenta) {
		return opServicoDAO.getListaCorridaVO(operador, empresa, dtIni, dtFim, puntoVenta);
	}

}
