package com.rjconsultores.ventaboletos.service.impl;

import java.util.Calendar;
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.CtrlFechamentoCaixaDAO;
import com.rjconsultores.ventaboletos.entidad.CtrlFechamentoCaixa;
import com.rjconsultores.ventaboletos.enums.CtrlFechamentoCaixaStatus;
import com.rjconsultores.ventaboletos.service.CtrlFechamentoCaixaService;
import com.rjconsultores.ventaboletos.utilerias.DateUtil;

@Service("ctrlFechamentoCaixaService")
public class CtrlFechamentoCaixaServiceImpl implements CtrlFechamentoCaixaService {
	
	private static final Logger log = LogManager.getLogger(CtrlFechamentoCaixaServiceImpl.class);
	
	@Autowired
	CtrlFechamentoCaixaDAO ctrlFechamentoCaixaDAO;

	@Override
	public List<CtrlFechamentoCaixa> obtenerTodos() {
		return ctrlFechamentoCaixaDAO.obtenerTodos();
	}

	@Override
	public CtrlFechamentoCaixa obtenerID(Long id) {
		return ctrlFechamentoCaixaDAO.obtenerID(id);
	}

	@Override
	@Transactional
	public CtrlFechamentoCaixa suscribir(CtrlFechamentoCaixa entidad) {
		entidad.setFecmodif(Calendar.getInstance().getTime());
		entidad = ctrlFechamentoCaixaDAO.suscribir(entidad);
		return entidad;
	}

	@Override
	@Transactional
	public CtrlFechamentoCaixa actualizacion(CtrlFechamentoCaixa entidad) {
		entidad.setFecmodif(Calendar.getInstance().getTime());
		entidad = ctrlFechamentoCaixaDAO.actualizacion(entidad);
		return entidad;
	}

	@Override
	@Transactional
	public void borrar(CtrlFechamentoCaixa entidad) {
		entidad.setFecmodif(Calendar.getInstance().getTime());
		entidad.setActivo(Boolean.FALSE);
		ctrlFechamentoCaixaDAO.borrar(entidad);
	}

	@Override
	@Transactional
	public boolean autorizarExecutarRotinaRetencao(Date feccorte) {
		try {
			String sFeccorte = DateUtil.getStringDate(feccorte, "dd/MM/yyyy");
			CtrlFechamentoCaixa ctrlFechamentoCaixa = ctrlFechamentoCaixaDAO.obtenerFeccorte(feccorte);
			if(ctrlFechamentoCaixa == null) {
				log.info("Nenhum controle de retencao foi localizado para data: " + sFeccorte);
			} else if(CtrlFechamentoCaixaStatus.RETENCAO_COMISSAO_EM_ANDAMENTO.equals(ctrlFechamentoCaixa.getStatus())) {
				log.info("Retencao de comissao em andamento para data: " + sFeccorte);
			} else if(CtrlFechamentoCaixaStatus.RETENCAO_COMISSAO_CONCLUIDA.equals(ctrlFechamentoCaixa.getStatus())) {
				log.info("Retencao de comissao concluida para data: " + sFeccorte);
			} else if(CtrlFechamentoCaixaStatus.LIBERADO_RETENCAO_COMISSAO.equals(ctrlFechamentoCaixa.getStatus())) {
				log.info("Retencao de comissao liberada para data: " + sFeccorte);
				ctrlFechamentoCaixa.setStatus(CtrlFechamentoCaixaStatus.RETENCAO_COMISSAO_EM_ANDAMENTO);
				actualizacion(ctrlFechamentoCaixa);
				return true;
			}
		} catch (Exception e) {
			log.error(e.getMessage(), e);
		}
		return false;
	}

	@Override
	@Transactional
	public void atualizarCtrlFechamentoCaixaStatus(CtrlFechamentoCaixaStatus status, Date dataRetencao) {
		try {
			CtrlFechamentoCaixa ctrlFechamentoCaixa = ctrlFechamentoCaixaDAO.obtenerFeccorte(dataRetencao);
			ctrlFechamentoCaixa.setStatus(status);
			actualizacion(ctrlFechamentoCaixa);
		} catch (Exception e) {
			log.error(e.getMessage(), e);
		}
	}

}
