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

import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.apache.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.Executions;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.event.ForwardEvent;
import org.zkoss.zul.Messagebox;

import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.PuntoVenta;
import com.rjconsultores.ventaboletos.enums.comissao.CoresConferencia;
import com.rjconsultores.ventaboletos.exception.BusinessException;
import com.rjconsultores.ventaboletos.service.ConferenciaComissaoService;
import com.rjconsultores.ventaboletos.utilerias.LocaleUtil;
import com.rjconsultores.ventaboletos.vo.comissao.ConferenciaComissaoVO;
import com.rjconsultores.ventaboletos.vo.comissao.DiaConferenciaComissaoVO;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;
import com.rjconsultores.ventaboletos.web.utilerias.MyListbox;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderConferenciaComissao;

@Scope("prototype")
@Controller("conferenciaComissaoController")
public class ConferenciaComissaoController extends MyGenericForwardComposer {

	private static final long serialVersionUID = 1L;

	private static Logger log = Logger.getLogger(ConferenciaComissaoController.class);
	
	@Autowired
	private ConferenciaComissaoService conferenciaComissaoService;

	private String competencia;
	private Empresa empresa;
	private PuntoVenta puntoVenta;

	private List<ConferenciaComissaoVO> lsConferenciaComissao;
	private MyListbox conferenciaList;

	private List<String> columns;

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		competencia = (String) Executions.getCurrent().getArg().get("competencia");
		empresa = (Empresa) Executions.getCurrent().getArg().get("empresa");
		puntoVenta = (PuntoVenta) Executions.getCurrent().getArg().get("puntoVenta");
		carregarColunas();
		
		super.doAfterCompose(comp);
		conferenciaList.setItemRenderer(new RenderConferenciaComissao());
		conferenciaList.addEventListener("onDoubleClick", new EventListener() {
			@Override
			public void onEvent(Event event) throws Exception {
				if(event instanceof ForwardEvent) {
					ForwardEvent forwardEvent = (ForwardEvent) event;
					String vet[] = forwardEvent.getOrigin().getTarget().getId().split("-");
					Integer puntoventaId = Integer.valueOf(vet[0]);
					Integer dia = Integer.valueOf(vet[1]);
					verDiaConferencia(puntoventaId, dia);
				}
			}

		});
		carregarDados();
	}

	private void carregarColunas() {
		try {
			String[] vetCompetencia = ((String) Executions.getCurrent().getArg().get("competencia")).split("/");
			Calendar cal = Calendar.getInstance(LocaleUtil.getLocale());
			cal.set(Calendar.MONTH, Integer.valueOf(vetCompetencia[0]) - 1);
			cal.set(Calendar.YEAR, Integer.valueOf(vetCompetencia[1]));

			columns = new ArrayList<String>();
			for (int i = 1; i <= cal.getActualMaximum(Calendar.DAY_OF_MONTH); i++) {
				columns.add(i + "");
			}
		} catch (Exception e) {
			log.error(e.getMessage(), e);
		}
	}
	
	public void onDoubleClick(Event event){
		if (event instanceof ForwardEvent) {
			try {
				ForwardEvent ev = (ForwardEvent) event;	
				Messagebox.show(ev.getOrigin().getTarget().getId());
			} catch(Exception e) {
				log.error(e.getMessage(), e);
			}
		}
	}
	
	public List<String> getColumns() {
		if (columns == null) {
			carregarColunas();
		}
		return columns;
	}

	public String getCompetencia() {
		return competencia;
	}

	public void setCompetencia(String competencia) {
		this.competencia = competencia;
	}

	public Empresa getEmpresa() {
		return empresa;
	}

	public void setEmpresa(Empresa empresa) {
		this.empresa = empresa;
	}

	public PuntoVenta getPuntoVenta() {
		return puntoVenta;
	}

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

	private void carregarDados() {
		try {
			lsConferenciaComissao = conferenciaComissaoService.carregarConferenciaComissao(competencia, empresa, puntoVenta);
			conferenciaList.setData(lsConferenciaComissao);
		} catch (BusinessException e) {
			log.error(e.getMessage(), e);
		}
	}
	
	private void verDiaConferencia(Integer puntoventaId, Integer dia) {
		ConferenciaComissaoVO conferenciaComissao = lsConferenciaComissao.get(lsConferenciaComissao.indexOf(new ConferenciaComissaoVO(puntoventaId, competencia)));
		DiaConferenciaComissaoVO diaConferenciaComissao = conferenciaComissao.getDias().get(conferenciaComissao.getDias().indexOf(new DiaConferenciaComissaoVO(dia)));

		Map<String, Object> args = new HashMap<String, Object>();
		args.put("conferenciaId", diaConferenciaComissao.getConferenciaId());
        args.put("puntoventaId", puntoventaId);
        args.put("nombpuntoventa", conferenciaComissao.getNombpuntoventa());
        args.put("numPuntoVenta", conferenciaComissao.getNumPuntoVenta());
        args.put("empresaId", empresa.getEmpresaId());
        args.put("nombempresa", empresa.getNombempresa());
        args.put("puntovendaFiltro", puntoVenta != null ? puntoVenta : null);
		args.put("datamovimento", StringUtils.leftPad(String.valueOf(dia), 2, "0") + "/" + competencia);
		args.put("conferenciaList", conferenciaList);

		openWindow("/gui/comissao/conferencia.zul",
				Labels.getLabel("conferenciaController.window.title"), args, MODAL);
	}

	public String getAmarelo() {
		return CoresConferencia.AMARELO.getUrl();
	}

	public String getAzul() {
		return CoresConferencia.AZUL.getUrl();
	}

	public String getPreto() {
		return CoresConferencia.PRETO.getUrl();
	}

	public String getBranco() {
		return CoresConferencia.BRANCO.getUrl();
	}

	public String getLaranja() {
		return CoresConferencia.LARANJA.getUrl();
	}

	public String getVermelho() {
		return CoresConferencia.VERMELHO.getUrl();
	}

}
