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

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

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.Comboitem;
import org.zkoss.zul.Datebox;
import org.zkoss.zul.Decimalbox;
import org.zkoss.zul.Label;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Radiogroup;
import org.zkoss.zul.Tab;
import org.zkoss.zul.Textbox;

import com.rjconsultores.ventaboletos.entidad.CaixaContrato;
import com.rjconsultores.ventaboletos.entidad.ClienteCorporativo;
import com.rjconsultores.ventaboletos.entidad.ContratoCorporativo;
import com.rjconsultores.ventaboletos.entidad.DescontoContrato;
import com.rjconsultores.ventaboletos.entidad.GrupoContrato;
import com.rjconsultores.ventaboletos.exception.BusinessException;
import com.rjconsultores.ventaboletos.service.CaixaContratoService;
import com.rjconsultores.ventaboletos.service.ClienteCorporativoService;
import com.rjconsultores.ventaboletos.service.ContratoService;
import com.rjconsultores.ventaboletos.service.GrupoContratoService;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxClienteCorporativo;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxEstandar;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxUsuario;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;
import com.rjconsultores.ventaboletos.web.utilerias.MyListbox;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderPadrao;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
@Controller("editarContratoController")
@Scope("prototype")
public class EditarContratoController extends MyGenericForwardComposer {

	private static final String TITULO = "editarContratoController.window.title";
	private static final long serialVersionUID = 1L;
	@Autowired
	private ContratoService contratoService;
	@Autowired	
	private ClienteCorporativoService clienteService;
	@Autowired
	private GrupoContratoService grupoService;
	@Autowired
	private CaixaContratoService caixaService;
	
	private List<GrupoContrato> lsGrupo;

	private ContratoCorporativo contrato;
	private MyListbox contratoList;
	private Tab tabAdicao;
	
	//Contrato	
	private Textbox txtNumContrato;
	private Datebox datInicial;
	private Datebox datFinal;
	private MyComboboxClienteCorporativo cmbCliente;
	private MyComboboxEstandar cmbGrupo;
	private MyComboboxUsuario cmbRepresentante;
	private Radiogroup rdgTipoCalculo;
	private Radiogroup rdgTipoTarifa;
	private Radiogroup rdgTipoContrato;
	private Radiogroup rdgStatus;
	
	//Config
	private Checkbox chkBilheteAberto;
	private Checkbox chkBilhetesConfirmados;
	private Checkbox chkReservaBilhete;
	private Checkbox chkManipulaBonus;
	private Checkbox chkExigeExcedente;
	
	//Cliente
	private Label lblClienteEmail;
	private Label lblClienteTelefone;
	private Label lblClienteLogradouro;
	private Label lblClienteNumero;
	private Label lblClienteCEP;
	private Label lblClienteComplemento;
	private Label lblClienteBairro;
	
	//Desconto	
	private MyListbox descontoList;
	private List<DescontoContrato> lsDesconto;
	private List<DescontoContrato> lsDescontoBanco = new ArrayList<>();
	
	private Datebox datInicialDesconto;
	private Datebox datFinalDesconto;
	private Decimalbox txtPorcDesconto;
	private Radiogroup rdgOperacao;
	
	//Adicao
	private MyListbox caixaList;
	private List<CaixaContrato> lsCaixa;
	
	private Decimalbox txtValorAdicao;
	private Textbox txtObservacaoAdicao;
	private Radiogroup rdgOperacaoAdicao;
	
	@Override
	public void doAfterCompose(Component comp) throws Exception {			
		lsGrupo = grupoService.obtenerTodos();
		
		super.doAfterCompose(comp);
		
		contrato = (ContratoCorporativo) Executions.getCurrent().getArg().get("contrato");
		contratoList = (MyListbox) Executions.getCurrent().getArg().get("contratoList");
		
		descontoList.setItemRenderer(new RenderPadrao<DescontoContrato>(DescontoContrato.class));
		caixaList.setItemRenderer(new RenderPadrao<CaixaContrato>(CaixaContrato.class));
		
		lsDesconto = new ArrayList<DescontoContrato>();
		lsCaixa = new ArrayList<CaixaContrato>();
		
		if (!isRegistroNovo(contrato.getContratoId())) {
			tabAdicao.setVisible( isExibeTabAdicao() );
			contrato = contratoService.obtenerID(contrato.getContratoId());
			
			lsDesconto = contrato.getDescontosContrato();
			descontoList.setData(lsDesconto);
			
			lsCaixa = caixaService.buscarExtratoContrato(contrato.getContratoId());
			caixaList.setData(lsCaixa);
		}
		
		preencheCombo();
		preencheRadios();
		preencheCheckBox();
		preencheDadosCliente();
	}

	public void onClick$btnSalvar(Event ev) throws InterruptedException {
		try {
			if( cmbCliente.getSelectedItem() != null ) {
				contrato.setClienteCorporativoId( cmbCliente.getSelectedCliente().getClienteCorporativoId());
				contrato.setNomeClienteCorp(cmbCliente.getSelectedCliente().getNomeClienteCorp());
			}
			
			Comboitem grupo = cmbGrupo.getSelectedItem();
			if( grupo != null ) {
				GrupoContrato item = (GrupoContrato)grupo.getValue();
				contrato.setGrupoContratoId( item.getGrupoContratoId() );
				contrato.setNomeGrupoContrato( item.getNomeGrupoContrato() );
			}
			
			if( cmbRepresentante.getSelectedItem() != null ) {
				contrato.setUsuarioRepId( cmbRepresentante.getSelectedUsuario().getUsuarioId());
			}
			
			if( rdgTipoCalculo.getSelectedItem() !=null ) {
				contrato.setTipoCalculo( Integer.valueOf(rdgTipoCalculo.getSelectedItem().getValue()));
			}
			
			if( rdgTipoTarifa.getSelectedItem() !=null ) {
				contrato.setTipoTarifa( Integer.valueOf(rdgTipoTarifa.getSelectedItem().getValue()));
			}
			
			if( rdgTipoContrato.getSelectedItem() !=null ) {
				contrato.setTipoContrato( Integer.valueOf(rdgTipoContrato.getSelectedItem().getValue()));
			}
			
			if( rdgStatus.getSelectedItem() !=null ) {
				contrato.setStatusContrato( Integer.valueOf(rdgStatus.getSelectedItem().getValue()));
			}
			
			contrato.setIndBilhetesAbertos(chkBilheteAberto.isChecked());
			contrato.setIndBilhetesConfirmados(chkBilhetesConfirmados.isChecked());
			contrato.setIndExigeExcedente(chkExigeExcedente.isChecked());
			contrato.setIndManipulaBonus(chkManipulaBonus.isChecked());
			contrato.setIndReservaBilhete(chkReservaBilhete.isChecked());
			
			validarCampos();			
			
			contratoService.suscribirActualizar(contrato);
			contratoList.updateItem(contrato);

			Messagebox.show(
					Labels.getLabel("MSG.suscribirOK"),
					Labels.getLabel(TITULO),
					Messagebox.OK, Messagebox.INFORMATION);

			closeWindow();
		} catch (BusinessException ex) {
			Messagebox.show(
					ex.getMessage(),
					Labels.getLabel(TITULO),
					Messagebox.OK, Messagebox.ERROR);
		} catch (Exception ex) {
			Messagebox.show(
						Labels.getLabel("MSG.Error"),
						Labels.getLabel(TITULO),
						Messagebox.OK, Messagebox.ERROR);
		}
	}
	
	public void onClick$btnAdicionarDesconto(Event ev) throws InterruptedException {
		Date inicio = datInicialDesconto.getValue();
		Date fim = datFinalDesconto.getValue();
		BigDecimal porcentagem = txtPorcDesconto.getValue();
		boolean operacao = Boolean.parseBoolean(rdgOperacao.getSelectedItem().getValue());
		
		DescontoContrato desconto = new DescontoContrato();
		desconto.setContratoId(contrato.getContratoId());
		desconto.setDataInicial(inicio);
		desconto.setDataFinal(fim);
		desconto.setIndDesconto(operacao);
		desconto.setPorcentagem(porcentagem);
		desconto.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
		desconto.setFecModif(Calendar.getInstance().getTime());
		desconto.setActivo(true);
		
		if( validaExisteDesconto(desconto)) {
			Messagebox.show(
	                Labels.getLabel("editarContratoController.MSG.descontoExiste"),
	                Labels.getLabel(TITULO),
	                Messagebox.OK, Messagebox.INFORMATION);
			return;
		}
		
		lsDescontoBanco.add(desconto);
		lsDesconto.add(desconto);
		descontoList.setData(lsDesconto);
		
	}
	
	public void onClick$btnRemoverDesconto(Event ev) {
		DescontoContrato desconto = (DescontoContrato) descontoList.getSelected();
		if(desconto != null) {
			lsDesconto.remove(desconto);
			descontoList.setData(lsDesconto);
			
			if( desconto.getDescontoContratoId() != null ) {
				desconto.setActivo(false);
				desconto.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
				desconto.setFecModif(Calendar.getInstance().getTime());
				lsDescontoBanco.add(desconto);
			}else {				
				lsDescontoBanco.remove(lsDescontoBanco.indexOf(desconto));
			}
		}
	}

	public void onClick$btnAdicao(Event ev) throws InterruptedException {
		if( validaAdicao() ) {
			BigDecimal valor = txtValorAdicao.getValue();
			String obs = txtObservacaoAdicao.getValue();
			String oper = rdgOperacaoAdicao.getSelectedItem().getValue();	
			
			if( oper.equals("1")) {
				valor = valor.negate();
			}
			
			CaixaContrato caixa = new CaixaContrato();
			caixa.setContratoId(contrato.getContratoId());
			caixa.setValor(valor);
			caixa.setObservacao(obs);
			caixa.setTipoLancamentoId(Integer.valueOf(oper));
			caixa.setDataLancamento(Calendar.getInstance().getTime());
			caixa.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
			caixa.setFecModif(Calendar.getInstance().getTime());
			caixa.setActivo(true);
			
			caixaService.gravarMovimento(caixa);
			
			lsCaixa.add(caixa);
			caixaList.setData(lsCaixa);
			
			txtValorAdicao.setRawValue(null);
			txtObservacaoAdicao.setValue("");
			rdgOperacaoAdicao.setSelectedItem(null);	
		}
		
	}
	
	private boolean validaAdicao() throws InterruptedException {
		if ( txtValorAdicao.getValue() == null || 
				txtObservacaoAdicao.getValue().isEmpty() ||
				rdgOperacaoAdicao.getSelectedItem() == null	){
			Messagebox.show(
	                Labels.getLabel("editarContratoController.MSG.camposObrigatoriosAdicao"),
	                Labels.getLabel(TITULO),
	                Messagebox.OK, Messagebox.INFORMATION);
			return false;
		}
		
		int resp = Messagebox.show(
				Labels.getLabel("editarContratoController.MSG.confirmacaoAdicao"),
                Labels.getLabel(TITULO),
				Messagebox.YES | Messagebox.NO, Messagebox.QUESTION);

		return resp == Messagebox.YES;
	}

	private boolean validaExisteDesconto(DescontoContrato desconto) {
		for (DescontoContrato item : lsDesconto) {
			if( item.getDataInicial().equals(desconto.getDataInicial()) 
					&& item.getDataFinal().equals(desconto.getDataFinal()) ) {
				return true;
			}
		}
		return false;		
	}

	private void validarCampos() throws BusinessException {
		if ( contrato.getClienteCorporativoId() == null || 
				contrato.getGrupoContratoId() == null || 
				contrato.getNumContrato() == null ||
				contrato.getDataFinal() == null ||
				contrato.getDataInicial() == null ){
			throw new BusinessException("editarContratoController.MSG.camposObrigatorios");
		}
		
		if (isRegistroNovo(contrato.getContratoId()) 
				&& contratoService.existe(contrato)) {
           	throw new BusinessException("editarContratoController.MSG.contratoExiste");                
        }		
		
	}

	public void onClick$btnApagar(Event ev) throws InterruptedException {
		Integer resp = Messagebox.show(
					Labels.getLabel("MSG.borrarPergunta"),
					Labels.getLabel(TITULO),
					Messagebox.YES | Messagebox.NO, Messagebox.QUESTION);

		if (resp == Messagebox.YES) {

			contratoService.borrar(contrato);

			Messagebox.show(
						Labels.getLabel("MSG.borrarOK"),
						Labels.getLabel(TITULO),
						Messagebox.OK, Messagebox.INFORMATION);

			contratoList.removeItem(contrato);

			closeWindow();
		}
	}
	
	public void onChange$cmbCliente(Event ev) {
		preencheDadosCliente();
	}

	private void preencheDadosCliente() {
		if( cmbCliente.getSelectedItem() != null ) {
			ClienteCorporativo cliente = cmbCliente.getSelectedCliente();
			lblClienteEmail.setValue(cliente.getEmail());			
			lblClienteTelefone.setValue(cliente.getTelefone());
			lblClienteLogradouro.setValue(cliente.getLogradouro());
			lblClienteNumero.setValue(cliente.getNumero());
			lblClienteCEP.setValue(cliente.getCep());
			lblClienteComplemento.setValue(cliente.getComplemento());
			lblClienteBairro.setValue(cliente.getBairro());
		}
	}
	
	private void preencheCombo() {
		cmbCliente.setSelectedCliente(contrato.getClienteCorporativoId());
		
		if(UsuarioLogado.isUsuarioAdmContrato()) {
			cmbRepresentante.setSelectedUsuario(UsuarioLogado.getUsuarioLogado());
			cmbRepresentante.setDisabled(true);
		}else {
			cmbRepresentante.setSelectedUsuario(contrato.getUsuarioRepId());
		}
		
		if(contrato.getGrupoContratoId() != null ) {
			GrupoContrato grupo = grupoService.obtenerID(contrato.getGrupoContratoId());
			selecionaCombo(grupo, cmbGrupo);			
		}
	}

	private void preencheCheckBox() {
		chkBilheteAberto.setChecked(contrato.isIndBilhetesAbertos());
		chkBilhetesConfirmados.setChecked(contrato.isIndBilhetesConfirmados());
		chkExigeExcedente.setChecked(contrato.isIndExigeExcedente());
		chkManipulaBonus.setChecked(contrato.isIndManipulaBonus());
		chkReservaBilhete.setChecked(contrato.isIndReservaBilhete());
	}
	
	private void preencheRadios() {
		selecionaRadio(contrato.getTipoCalculo(), rdgTipoCalculo);
		selecionaRadio(contrato.getTipoContrato(), rdgTipoContrato);
		selecionaRadio(contrato.getTipoTarifa(), rdgTipoTarifa);
		selecionaRadio(contrato.getStatusContrato(), rdgStatus);				
	}
	
	private boolean isExibeTabAdicao() {		
		return contrato.isActivo();
	}

}
