package com.rjconsultores.ventaboletos.web.gui.controladores.relatorios;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.zkoss.util.resource.Labels;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zul.Radio;
import org.zkoss.zul.Textbox;

import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.PuntoVenta;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioMovimentosAtraso;
import com.rjconsultores.ventaboletos.service.ConferenciaComissaoService;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import com.rjconsultores.ventaboletos.vo.comissao.ConferenciaComissaoVO;
import com.rjconsultores.ventaboletos.vo.comissao.DiaConferenciaComissaoVO;
import com.rjconsultores.ventaboletos.vo.comissao.MovimentosAtrasoVO;
import com.rjconsultores.ventaboletos.vo.comissao.MovimentosAtrasoVO.SituacaoDiaMovimento;
import com.rjconsultores.ventaboletos.web.utilerias.MaskUtil;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;

@Scope("prototype")
@Controller("relatorioMovimentosAtrasoController")
public class RelatorioMovimentosAtrasoController extends MyGenericForwardComposer {

	private static final long serialVersionUID = 1L;
	
	private static Logger log = LogManager.getLogger(RelatorioMovimentosAtrasoController.class);
	
	@Autowired
	private DataSource dataSourceRead;
	
	@Autowired
	private ConferenciaComissaoService conferenciaComissaoService;

    private Textbox txtCompetencia;
    private PuntoVenta puntoVenta;
    private Empresa empresa;
    private List<Empresa> lsEmpresas;
    
    private Radio rdbTipoConferencia;
    
    @Override
    public void doAfterCompose(Component comp) throws Exception {
        super.doAfterCompose(comp);
        aplicarMascara();
        lsEmpresas = UsuarioLogado.getUsuarioLogado().getEmpresa();
		initCompetencia();
	}

	private void initCompetencia() {
		DateFormat format =new SimpleDateFormat("MM/yyyy");
		txtCompetencia.setText(format.format(new Date()));
		txtCompetencia.focus();
	}
    
    public void onClick$btnRelatorio(Event ev) {
    	try {
    		Map<String, Object> parametros = new HashMap<String, Object>();
    		
    		
        	parametros.put("competencia", txtCompetencia.getValue());
        	parametros.put("empresaId", empresa.getEmpresaId());
        	parametros.put("empresa", empresa.getNombempresa());
        	parametros.put("usuario", UsuarioLogado.getUsuarioLogado().getNombusuario());
        	parametros.put("status", SituacaoDiaMovimento.ATRASADO);
        	parametros.put("eTipoConferencia", rdbTipoConferencia.isChecked());

        	if(puntoVenta != null) {
        		parametros.put("puntoventaId", puntoVenta.getPuntoventaId());
        		parametros.put("puntoventa", puntoVenta.getNombpuntoventa());
        	} else {
        		parametros.put("puntoventa", "Todos");
        	}
        	
        	RelatorioMovimentosAtraso relatorio =  new RelatorioMovimentosAtraso(parametros, dataSourceRead.getConnection());
    		removerDiasSemMovimento(relatorio);
        	
        	Map<String, Object> args = new HashMap<String, Object>();
    		args.put("relatorio", relatorio);
    		
    		puntoVenta = new PuntoVenta();
    		
    		openWindow("/component/reportView.zul",
    				   Labels.getLabel("relatorioMovimentosAtrasoController.window.title"), args, MODAL);			
		} catch (Exception e) {
			log.error(e.getMessage(), e);
		}
    }
    
    /**
     * Remove os dias sem movimento
     * Mantis #10515
     * @param relatorio
     */
	private void removerDiasSemMovimento(RelatorioMovimentosAtraso relatorio) {
		try {
			for (MovimentosAtrasoVO movimentosAtraso : relatorio.getLsDadosRelatorio()) {
				List<ConferenciaComissaoVO> lsConferenciaComissao = conferenciaComissaoService.carregarConferenciaComissao(txtCompetencia.getValue(), empresa, new PuntoVenta(movimentosAtraso.getPuntoventaId()), null, false);
				for (ConferenciaComissaoVO conferenciaComissao : lsConferenciaComissao) {
					for (DiaConferenciaComissaoVO diaConferenciaComissao : conferenciaComissao.getDiasOrdenado()) {
						if(diaConferenciaComissao.getIndsemmovimento()) {
							movimentosAtraso.getDiasEmAtraso().remove(diaConferenciaComissao.getDia());
						}
					}
				}
				
			}
		} catch (Exception e) {
			log.error(e.getMessage(), e);
		}
	}

	public PuntoVenta getPuntoVenta() {
		return puntoVenta;
	}

	public void setPuntoVenta(PuntoVenta puntoVenta) {
		this.puntoVenta = puntoVenta;
	}

	public Empresa getEmpresa() {
		return empresa;
	}

	public void setEmpresa(Empresa empresa) {
		this.empresa = empresa;
	}
	
	public void aplicarMascara() {
		MaskUtil.aplicarMascara(txtCompetencia.getUuid(), "99/9999");
	}

	public List<Empresa> getLsEmpresas() {
		return lsEmpresas;
	}

}
