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

import java.util.Calendar;

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.Executions;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zul.Checkbox;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Radio;

import com.rjconsultores.ventaboletos.entidad.ContaMD;
import com.rjconsultores.ventaboletos.enums.MDOrigem;
import com.rjconsultores.ventaboletos.service.ContaMDService;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;
import com.rjconsultores.ventaboletos.web.utilerias.MyListbox;
import com.rjconsultores.ventaboletos.web.utilerias.MyTextbox;
import com.rjconsultores.ventaboletos.web.utilerias.MyTextboxDecimal;
import com.rjconsultores.ventaboletos.web.utilerias.MyTextboxSimple;

@Controller("editarContaMDController")
@Scope("prototype")
public class EditarContaMDController extends MyGenericForwardComposer {
	private static final long serialVersionUID = 1L;

	private static Logger log = LogManager.getLogger(EditarContaMDController.class);

	@Autowired
	private ContaMDService contaMDService;

	private ContaMD conta;
	private MyListbox contaList;
	private MyTextboxDecimal txtCodigoContabil;
	private MyTextboxSimple txtNome;
	private Radio radioTipoC;
	private Radio radioTipoD;
	private Radio radioCancelamentoS;
	private Radio radioCancelamentoN;
	private Radio radioStatusA;
	private Radio radioStatusI;
	private Checkbox chkOrigemIN;
	private Checkbox chkOrigemEE;
	private Checkbox chkOrigemFP;
	private MyTextbox txtReferencia;
	
	@Override
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);

		conta = (ContaMD) Executions.getCurrent().getArg().get("conta");
		contaList = (MyListbox) Executions.getCurrent().getArg().get("contaList");

		if (conta != null) {
			if (conta.getCodigoContabil() != null) {
				txtCodigoContabil.setValue(conta.getCodigoContabil().toString());
			}
			
			if (conta.getNome() != null) {
				txtNome.setText(conta.getNome());
			}

			if(conta.getContaId() == null) {
				radioTipoC.setChecked(Boolean.TRUE);
				radioStatusI.setChecked(Boolean.TRUE);
			}
			
			if (conta.getTipo() != null) {
				if (conta.getTipo().equals("C")) {
					radioTipoC.setChecked(Boolean.TRUE);
					radioTipoD.setChecked(Boolean.FALSE);
				} else {
					radioTipoC.setChecked(Boolean.FALSE);
					radioTipoD.setChecked(Boolean.TRUE);
				}
			}

			if (conta.getCancelamento() == null || !conta.getCancelamento()) {
				radioCancelamentoS.setChecked(Boolean.FALSE);
				radioCancelamentoN.setChecked(Boolean.TRUE);
			} else {
				radioCancelamentoS.setChecked(Boolean.TRUE);
				radioCancelamentoN.setChecked(Boolean.FALSE);
			}

			if (conta.getStatus() != null) {
				if (conta.getStatus()) {
					radioStatusA.setChecked(Boolean.TRUE);
					radioStatusI.setChecked(Boolean.FALSE);
				} else {
					radioStatusA.setChecked(Boolean.FALSE);
					radioStatusI.setChecked(Boolean.TRUE);
				}
			}
			
			String origem = conta.getOrigem();
			chkOrigemIN.setChecked(Boolean.FALSE);
			chkOrigemEE.setChecked(Boolean.FALSE);
			chkOrigemFP.setChecked(Boolean.FALSE);
			if (origem == null || origem.contains(MDOrigem.INTERNO.getValue())) {
				chkOrigemIN.setChecked(Boolean.TRUE);
			}
			if (origem != null && origem.contains(MDOrigem.EVENTO_EXTRA.getValue())) {
				chkOrigemEE.setChecked(Boolean.TRUE);
			}
			if (origem != null && origem.contains(MDOrigem.FORMA_PAGAMENTO.getValue())) {
				chkOrigemFP.setChecked(Boolean.TRUE);
			}
			
			if (conta.getReferencia() != null) {
				txtReferencia.setText(conta.getReferencia());
			}
		}

		txtNome.focus();
		if(conta.getContaId() == null) {
			txtCodigoContabil.focus();
		}
	}

	public void onClick$btnSalvar(Event ev) throws InterruptedException {
		txtCodigoContabil.getValue();
		txtNome.getValue();

		Integer codigoContabil = null;
		
		try {
			codigoContabil = txtCodigoContabil.getValueDecimal().intValue();
		} catch (Exception e) {
			Messagebox.show(
					Labels.getLabel("editarContaMDController.MSG.CodContabil.Invalido"),
					Labels.getLabel("editarContaMDController.window.title"),
					Messagebox.OK, Messagebox.ERROR);
			
			return;
		}
		
		if(!validarCamposOrigem()) {
			return;
		}
		
		try {
			conta.setCodigoContabil(codigoContabil);
			conta.setNome(txtNome.getText());

			if (radioTipoC.isChecked()) {
				conta.setTipo("C");
			} else if (radioTipoD.isChecked()) {
				conta.setTipo("D");
			}

			conta.setCancelamento(radioCancelamentoS.isChecked());
			conta.setStatus(radioStatusA.isChecked());
			
			StringBuilder origem = new StringBuilder();
			if (chkOrigemIN.isChecked()) {
				origem.append(MDOrigem.INTERNO.getValue());
				conta.setReferencia(null);
			} else {
				if (chkOrigemEE.isChecked()) {
					origem.append(MDOrigem.EVENTO_EXTRA.getValue());
				}
				if (chkOrigemFP.isChecked()) {
					if(origem.length() > 0) {
						origem.append(";");
					}
					origem.append(MDOrigem.FORMA_PAGAMENTO.getValue());
				}
				conta.setReferencia(txtReferencia.getText());
			}
			
			conta.setOrigem(origem.toString());
			conta.setActivo(Boolean.TRUE);
			conta.setFecmodif(Calendar.getInstance().getTime());
			conta.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());

			if (!contaMDService.existeConta(conta)) {
				Messagebox.show(
						Labels.getLabel("editarContaMDController.MSG.DescricaoDuplicada"),
						Labels.getLabel("editarContaMDController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);
				return;
			}

			if (conta.getContaId() == null) {
				contaMDService.suscribir(conta);
				contaList.addItemNovo(conta);

				Messagebox.show(
						Labels.getLabel("editarContaMDController.MSG.suscribirOK"),
						Labels.getLabel("editarContaMDController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);
				
			} else {
				contaMDService.actualizacion(conta);
				contaList.updateItem(conta);

				Messagebox.show(
						Labels.getLabel("editarContaMDController.MSG.actualizarOK"),
						Labels.getLabel("editarContaMDController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);
			}

			closeWindow();
			
		} catch (Exception ex) {
			log.error(ex.getMessage(), ex);
			
			Messagebox.show(
					Labels.getLabel("MSG.Error"),
					Labels.getLabel("editarContaMDController.window.title"),
					Messagebox.OK, Messagebox.ERROR);
		}
	}

	private boolean validarCamposOrigem() throws InterruptedException {
		
		if(!chkOrigemIN.isChecked() && !chkOrigemEE.isChecked() && !chkOrigemFP.isChecked()) {
			Messagebox.show(
					Labels.getLabel("editarContaMDController.MSG.erroOrigemNaoInformada.value"),
					Labels.getLabel("editarContaMDController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);
			return false;
		}
		
		if (chkOrigemIN.isChecked() && (chkOrigemEE.isChecked() || chkOrigemFP.isChecked())) {
			Messagebox.show(
					Labels.getLabel("editarContaMDController.MSG.erroOrigem.value"),
					Labels.getLabel("editarContaMDController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);
			return false;
		}
		
		txtReferencia.getValue();
		if((chkOrigemEE.isChecked() || chkOrigemFP.isChecked()) && StringUtils.isBlank(txtReferencia.getValue())) {
			Messagebox.show(
					Labels.getLabel("editarContaMDController.MSG.erroReferenciaOrigemNaoInformada.value"),
					Labels.getLabel("editarContaMDController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);
			return false;
		}
		
		return true;
	}
	
	public void onCheck$chkOrigemIN(Event ev) throws InterruptedException {
		if(!chkOrigemIN.isChecked()) {
			int resp = Messagebox.show(
					Labels.getLabel("editarContaMDController.MSG.origemInternoPergunta.value"),
					Labels.getLabel("editarContaMDController.window.title"),
					Messagebox.YES | Messagebox.NO, Messagebox.QUESTION);

			if (resp == Messagebox.NO) {
				chkOrigemIN.setChecked(true);
			}
		}
	}
	
	public void onClick$btnApagar(Event ev) throws InterruptedException {
		if(chkOrigemIN.isChecked()) {
			Messagebox.show(
					Labels.getLabel("editarContaMDController.MSG.origemInternoExclusao.value"),
					Labels.getLabel("editarContaMDController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);
			return;
		}
		int resp = Messagebox.show(
				Labels.getLabel("editarContaMDController.MSG.exclusao.value"),
				Labels.getLabel("editarContaMDController.window.title"),
				Messagebox.YES | Messagebox.NO, Messagebox.QUESTION);

		if (resp == Messagebox.YES) {
			StringBuilder origem = new StringBuilder();
			if (chkOrigemIN.isChecked()) {
				origem.append(MDOrigem.INTERNO.getValue());
				conta.setReferencia(null);
			} else {
				if (chkOrigemEE.isChecked()) {
					origem.append(MDOrigem.EVENTO_EXTRA.getValue());
				}
				if (chkOrigemFP.isChecked()) {
					if(origem.length() > 0) {
						origem.append(";");
					}
					origem.append(MDOrigem.FORMA_PAGAMENTO.getValue());
				}
				conta.setReferencia(txtReferencia.getText());
			}
					
			contaMDService.borrar(conta);
			contaList.removeItem(conta);
			Messagebox.show(
					Labels.getLabel("editarContaMDController.MSG.BorrarOK"),
					Labels.getLabel("editarContaMDController.window.title"),
					Messagebox.OK, Messagebox.INFORMATION);
			
			closeWindow();
		}
	}

	public ContaMD getConta() {
		return conta;
	}

	public void setConta(ContaMD conta) {
		this.conta = conta;
	}

	public MyListbox getContaList() {
		return contaList;
	}

	public void setContaList(MyListbox contaList) {
		this.contaList = contaList;
	}

	public MyTextboxSimple getTxtNome() {
		return txtNome;
	}

	public void setTxtNome(MyTextboxSimple txtNome) {
		this.txtNome = txtNome;
	}

	public MyTextboxDecimal getTxtCodigoContabil() {
		return txtCodigoContabil;
	}

	public void setTxtCodigoContabil(MyTextboxDecimal txtCodigoContabil) {
		this.txtCodigoContabil = txtCodigoContabil;
	}

	public Radio getRadioTipoC() {
		return radioTipoC;
	}

	public void setRadioTipoC(Radio radioTipoC) {
		this.radioTipoC = radioTipoC;
	}

	public Radio getRadioTipoD() {
		return radioTipoD;
	}

	public void setRadioTipoD(Radio radioTipoD) {
		this.radioTipoD = radioTipoD;
	}

	public Radio getRadioStatusA() {
		return radioStatusA;
	}

	public void setRadioStatusA(Radio radioStatusA) {
		this.radioStatusA = radioStatusA;
	}

	public Radio getRadioStatusI() {
		return radioStatusI;
	}

	public void setRadioStatusI(Radio radioStatusI) {
		this.radioStatusI = radioStatusI;
	}

	public MyTextbox getTxtReferencia() {
		return txtReferencia;
	}

	public void setTxtReferencia(MyTextbox txtReferencia) {
		this.txtReferencia = txtReferencia;
	}
}
