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

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

import org.apache.commons.lang.StringUtils;
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.Checkbox;
import org.zkoss.zul.Comboitem;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Radio;
import org.zkoss.zul.Row;
import org.zkoss.zul.Textbox;
import org.zkoss.zul.api.Datebox;

import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.FechamentoParamptovta;
import com.rjconsultores.ventaboletos.entidad.PuntoVenta;
import com.rjconsultores.ventaboletos.service.ConferenciaComissaoService;
import com.rjconsultores.ventaboletos.service.FechamentoParamptovtaService;
import com.rjconsultores.ventaboletos.utilerias.DateUtil;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import com.rjconsultores.ventaboletos.vo.comissao.ConferenciaComissaoVO;
import com.rjconsultores.ventaboletos.web.utilerias.MaskUtil;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxPuntoVenta;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;

@Scope("prototype")
@Controller("busquedaConferenciaComissaoController")
public class BusquedaConferenciaComissaoController extends MyGenericForwardComposer {

	private static final String TITULO = "conferenciaComissaoController.window.title";
	private static Logger log = LogManager.getLogger(BusquedaConferenciaComissaoController.class);
	private static final long serialVersionUID = 1L;
	private Textbox txtCompetencia;
	private Datebox datInicial;
	private Datebox datFinal;
	private MyComboboxPuntoVenta cmbPuntoVenta;
	private PuntoVenta puntoVenta;
	private Empresa empresa;
	private List<Empresa> lsEmpresas;
	private Row rowCompetencia;
	private Row rowDatas;
	private Radio rdTipoMesAno;
	private Radio rdTipoDataInicialFinal;
	private Integer intervalo = 0;
	private Checkbox chkDesconsideraPtVendaFechados;
	
	@Autowired
	private ConferenciaComissaoService conferenciaComissaoService;
	@Autowired
	private FechamentoParamptovtaService fechamentoParamptovtaService;


	@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$btnPesquisa(Event ev) {

		if (rdTipoMesAno.isChecked()) {
			txtCompetencia.getValue();
		} else {
			datInicial.getValue();
			datFinal.getValue();
		}

		if (cmbPuntoVenta.getSelectedItem() != null) {
			puntoVenta = (PuntoVenta) cmbPuntoVenta.getSelectedItem().getValue();
		} else {
			try {
				Messagebox.show(Labels.getLabel("busquedaConferenciaComissaoController.lbPuntoVentaInvalido.value"),
						Labels.getLabel(TITULO),
						Messagebox.OK, Messagebox.ERROR);
			} catch (InterruptedException e) {
				log.error("Erro: ", e);
			}
			return;
		}
		
        Comboitem cbiPuntoVenta = cmbPuntoVenta.getSelectedItem();
        puntoVenta = (PuntoVenta) cbiPuntoVenta.getValue();
		
		try {

			Date dataInicial = null;
			Date dataFinal = null;

			if (datInicial.getValue() != null) {
				Calendar cal = Calendar.getInstance();

				cal.setTime(datInicial.getValue());
				cal.set(Calendar.HOUR, 0);
				cal.set(Calendar.MINUTE, 0);
				cal.set(Calendar.SECOND, 0);

				dataInicial = cal.getTime();

				cal.setTime(datFinal.getValue());
				cal.set(Calendar.HOUR, 23);
				cal.set(Calendar.MINUTE, 59);
				cal.set(Calendar.SECOND, 59);
				dataFinal = cal.getTime();
			}

			if (verificarCampos()) {
				Map<String, Object> args = new HashMap<String, Object>();
				args.put("competencia", txtCompetencia.getValue());
				args.put("dataInicial", dataInicial);
				args.put("dataFinal", dataFinal);
				args.put("empresa", empresa);
				args.put("isPeriodo", rdTipoDataInicialFinal.isChecked());
				args.put("isDesconsideraPtVendaFechados", chkDesconsideraPtVendaFechados.isChecked());

				if (StringUtils.isNotBlank(cmbPuntoVenta.getValue()) && !((PuntoVenta)cmbPuntoVenta.getSelectedItem().getValue()).getNombpuntoventa().equals("TODOS")) {
					args.put("puntoVenta", puntoVenta);
				} else {
					args.put("puntoVenta", null);
				}

				if (rdTipoMesAno.isChecked()) {
					openWindow("/gui/comissao/conferenciaComissao.zul",
							Labels.getLabel(TITULO), args, MODAL);
				} else {
					if (validarEmpresaPuntoVentaPeriodo()) {
						List<ConferenciaComissaoVO> lsConferenciaComissao = conferenciaComissaoService.carregarConferenciaComissao(dataInicial, dataFinal, empresa, puntoVenta, null, chkDesconsideraPtVendaFechados.isChecked() );
						args.put("puntoventaId", puntoVenta.getPuntoventaId());
						args.put("nombpuntoventa", puntoVenta.getNombpuntoventa());
						args.put("numPuntoVenta", puntoVenta.getNumPuntoVenta());
						args.put("empresaId", empresa.getEmpresaId());
						args.put("nombempresa", empresa.getNombempresa());
						args.put("puntovendaFiltro", puntoVenta != null ? puntoVenta : null);
						args.put("conferenciaComissao", lsConferenciaComissao.get(0));

						openWindow("/gui/comissao/conferencia.zul",
								Labels.getLabel("conferenciaController.window.title"), args, MODAL);
					} else {
						if (intervalo != null && intervalo != 0) {
							Messagebox.show(Labels.getLabel("MSG.Error.invalida.intervaloInvalido") + " " + intervalo + " " + Labels.getLabel("MSG.Error.invalida.intervaloInvalidoDias"),
									Labels.getLabel(TITULO),
									Messagebox.OK, Messagebox.ERROR);
						} else {
							Messagebox.show(Labels.getLabel("MSG.Error.invalida.puntoVentaSemFechamentoParaEmpresa"),
									Labels.getLabel(TITULO),
									Messagebox.OK, Messagebox.ERROR);
						}
					}
				}
			}

		} catch (Exception e) {
			log.error(e.getMessage(), e);
		}
	}

	private boolean validarEmpresaPuntoVentaPeriodo() {
		FechamentoParamptovta f = fechamentoParamptovtaService.buscaParametrosPorPuntoventaEmpresa(puntoVenta, empresa);
		int intervalo = DateUtil.getElapsedDias(datInicial.getValue(), datFinal.getValue());

		if(f != null && f.getIntervalofechamento().equals(intervalo+1)){
			return true;
		}else if(f == null){
			this.intervalo = null;
			return false;
		}else{
			this.intervalo = f.getIntervalofechamento();
			return false;	
		}
	}
	
	private boolean verificarCampos() throws Exception {
		if (rdTipoMesAno.isChecked() 
				&& !DateUtil.isCompetenciaValida(txtCompetencia.getValue())) {
			Messagebox.show(Labels.getLabel("MSG.Error.invalida.competencia"),
					Labels.getLabel(TITULO),
					Messagebox.OK, Messagebox.ERROR);
			return false;
		}
		
		if(rdTipoDataInicialFinal.isChecked()){
		
			if(datInicial.getValue().after(datFinal.getValue())){
				Messagebox.show(Labels.getLabel("MSG.Error.invalida.dataInicialDepoisDataFinal"),
						Labels.getLabel(TITULO),
						Messagebox.OK, Messagebox.ERROR);
				return false;
			}
			
			Calendar cal = Calendar.getInstance();
			cal.setTime(datInicial.getValue());
			int monthInicial = cal.get(Calendar.MONTH);
			int yearInicial = cal.get(Calendar.YEAR);
			
			cal.setTime(datFinal.getValue());
			int monthFinal = cal.get(Calendar.MONTH);
			int yearFinal = cal.get(Calendar.YEAR);
			
			if(monthInicial != monthFinal
					|| yearFinal != yearInicial){
				Messagebox.show(Labels.getLabel("MSG.Error.invalida.dataInicialFinalMesDiferente"),
						Labels.getLabel(TITULO),
						Messagebox.OK, Messagebox.ERROR);
				return false;
			}
			
			if(puntoVenta.getPuntoventaId().equals(new Integer(-1))){
				Messagebox.show(Labels.getLabel("MSG.Error.invalida.puntoVendaTodosNaoPermitido"),
						Labels.getLabel(TITULO),
						Messagebox.OK, Messagebox.ERROR);
				return false;
			}
			
		}
		
		return true;
	}

	public void aplicarMascara() {
		MaskUtil.aplicarMascara(txtCompetencia.getUuid(), "99/9999");
	}

	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 List<Empresa> getLsEmpresas() {
		return lsEmpresas;
	}

	public void setLsEmpresas(List<Empresa> lsEmpresas) {
		this.lsEmpresas = lsEmpresas;
	}

	public Textbox getTxtCompetencia() {
		return txtCompetencia;
	}

	public void setTxtCompetencia(Textbox txtCompetencia) {
		this.txtCompetencia = txtCompetencia;
	}
	
	public Datebox getDatInicial() {
		return datInicial;
	}

	public void setDatInicial(Datebox datInicial) {
		this.datInicial = datInicial;
	}

	public Datebox getDatFinal() {
		return datFinal;
	}

	public void setDatFinal(Datebox datFinal) {
		this.datFinal = datFinal;
	}

	public void onCheck$rdTipoMesAno() {
		if (rdTipoMesAno.isChecked()) {
			controlRowVisibility(false, true);
		}
	}

	public void onCheck$rdTipoDataInicialFinal() {
		if (rdTipoDataInicialFinal.isChecked()) {
			controlRowVisibility(true, false);
		}
	}

	private void controlRowVisibility(Boolean dataInicialFinal, Boolean mesAno) {
		rowDatas.setVisible(dataInicialFinal);
		rowCompetencia.setVisible(mesAno);

		if (mesAno) {
			txtCompetencia.setConstraint("no empty");
			datInicial.setConstraint("");
			datFinal.setConstraint("");
			datInicial.setValue(null);
			datFinal.setValue(null);
		} else {
			txtCompetencia.setConstraint("");
			datInicial.setConstraint("no empty");
			datFinal.setConstraint("no empty");
			txtCompetencia.setValue(null);
		}
	}
	
}
