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

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import javax.sql.DataSource;

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.zhtml.Messagebox;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.WrongValueException;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zkplus.databind.BindingListModelList;
import org.zkoss.zul.Button;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Comboitem;
import org.zkoss.zul.Constraint;
import org.zkoss.zul.Datebox;
import org.zkoss.zul.Textbox;

import com.rjconsultores.ventaboletos.entidad.Aidf;
import com.rjconsultores.ventaboletos.entidad.AidfEspecie;
import com.rjconsultores.ventaboletos.entidad.AidfTipo;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.Estado;
import com.rjconsultores.ventaboletos.entidad.InscricaoEstadual;
import com.rjconsultores.ventaboletos.service.AbastoCentralService;
import com.rjconsultores.ventaboletos.service.AbastoHistoService;
import com.rjconsultores.ventaboletos.service.AidfService;
import com.rjconsultores.ventaboletos.service.DetAbastoBoletoService;
import com.rjconsultores.ventaboletos.service.EmpresaService;
import com.rjconsultores.ventaboletos.service.EstadoService;
import com.rjconsultores.ventaboletos.service.MovimentacionBilhetesService;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;
import com.rjconsultores.ventaboletos.web.utilerias.MyListbox;

@Controller("editarAidfController")
@Scope("prototype")
public class EditarAidfController extends MyGenericForwardComposer {

	private static final long serialVersionUID = 1L;

	@Autowired
	private AidfService aidfService;
	
	@Autowired
	private AbastoHistoService abastoHistoService;
	
	@Autowired
	private AbastoCentralService abastoCentralService;
	
	@Autowired
	private DetAbastoBoletoService detAbastoBoletoService;
	
	@Autowired
	private EstadoService estadoService;
	
	@Autowired
	private MovimentacionBilhetesService movimentacionBilhetesService; 

	@Autowired
	private EmpresaService empresaService;
	
	private Aidf aidf;
	private MyListbox aidfList;
	
	private List<AidfEspecie> lsAidfEspecie;
	private Combobox cmbAidfEspecie;
	
	private List<Estado> lsEstado;
	private Combobox cmbEstado;
	
	private List<AidfTipo> lsAidfTipo;
	private Combobox cmbAidfTipo;
	
	private Combobox cmbEmpresa;
	private List<Empresa> lsEmpresas;
	
//	private Textbox txtInscestadual;
	private Combobox cmbInscestadual;
	private List<InscricaoEstadual> lsInscestadual;
	
	private Textbox txtDocFiscal;
	private Textbox txtAcFiscal;
	private Textbox txtSerie;
	private Textbox txtSubSerie;
	private Textbox txtFormInicial;
	private Textbox txtFormFinal;
	private Textbox txtFecAquisicao;
	private Textbox txtFecVencimento;
	private Textbox txtCnpj;
	
	private Textbox txtForminicial;
	private Textbox txtFormfinal;
	
	private Button btnApagar;
	private Button btnSalvar;
	
	private Datebox dtbFecadquisicion;
	private Datebox dtbFecvencimiento;
	private Combobox cmbTipoValidaVenta;
	
	private static Logger log = Logger.getLogger(EditarAidfController.class);
	
	
	@Autowired
	private DataSource dataSourceRead;
	
	@Override
	public void doAfterCompose(Component comp) throws Exception {	
		
		super.doAfterCompose(comp);
		
		txtDocFiscal.setConstraint(new OnlyNumber());
		
		aidf = (Aidf) Executions.getCurrent().getArg().get("aidf");
		aidfList = (MyListbox) Executions.getCurrent().getArg().get("aidfList");
		
		lsAidfTipo = aidfService.obtenerTodosAdifTipo();
		lsAidfEspecie = aidfService.obtenerTodosAdifEspecie();
		lsEstado = estadoService.obtenerTodos();
		lsEmpresas = UsuarioLogado.getUsuarioLogado().getEmpresa();
		lsInscestadual = new ArrayList<InscricaoEstadual>();
			
		if (aidf.getAidfId() == null) {
			btnApagar.setVisible(Boolean.FALSE);
		}
		
		if(aidf.getAidfId()!= null){
			if(detAbastoBoletoService.buscabDetAbastoBoletoToVerifyIfAidfCanBeEditable(aidf).size() >0){
				Messagebox.show(
						Labels.getLabel("editarAidfController.MSG.noWrite"),
						Labels.getLabel("editarAidfController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);
				btnSalvar.setVisible(Boolean.FALSE);
				btnApagar.setVisible(Boolean.FALSE);
			}
		}
	}

	public void onClick$btnApagar(Event ev) throws InterruptedException {
		 int opcao = Messagebox.show(
	                Labels.getLabel("editarAidfController.btnApagar.MSG.Deseja.Borrar"),
	                Labels.getLabel("editarAidfController.window.title"),
	                Messagebox.YES | Messagebox.NO, Messagebox.QUESTION);
		 
		 if (opcao == Messagebox.YES) {
			aidf.setFecmodif(Calendar.getInstance().getTime());
			aidf.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
			aidf.setActivo(Boolean.FALSE);
			
			abastoHistoService.borrarLosQueTienenAIDF(aidf);
			abastoCentralService.borrarLosQueTienenAIDF(aidf);
			
			aidfService.borrar(aidf);
			aidfList.removeItem(aidf);
           
            Messagebox.show(
                    Labels.getLabel("editarAidfController.btnApagar.MSG.borrarOK"),
                    Labels.getLabel("editarAidfController.window.title"),
                    Messagebox.OK, Messagebox.INFORMATION);
            closeWindow();
		 }
	}
	
	public void onClick$btnSalvar(Event ev) throws InterruptedException {
		
		cmbAidfEspecie.getValue();
		cmbAidfTipo.getValue();
		cmbEmpresa.getValue();
		cmbEstado.getValue();
		cmbInscestadual.getValue();
		txtSerie.getValue();
		txtForminicial.getValue();
		txtFormfinal.getValue();
		txtDocFiscal.getValue();
			
		Comboitem inscEstadualSeleccionada = cmbInscestadual.getSelectedItem();
		String _inscestadual = inscEstadualSeleccionada != null ? inscEstadualSeleccionada.getValue().toString() : "";
		aidf.setInscestadual(_inscestadual);
		
		Long x ;
		try {
			x = aidfService.validarDocFiscalSerieFormInicialFinal(aidf, dataSourceRead.getConnection());
			if(x != -1){
				Messagebox.show(
	                    Labels.getLabel("editarAidfController.btnSalvar.MSG.conflitoFormIniFin", new Object[] { x }),
	                    Labels.getLabel("editarAidfController.window.title"),
	                    Messagebox.OK, Messagebox.EXCLAMATION);
	            return;
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		if(!validarDocFiscalEstado(aidf.getAidfId(), txtDocFiscal.getValue(), aidf.getEstado())){
			Messagebox.show(
                    Labels.getLabel("editarAidfController.btnSalvar.MSG.conflitoDocFiscalEstado"),
                    Labels.getLabel("editarAidfController.window.title"),
                    Messagebox.OK, Messagebox.EXCLAMATION);
            return;
		}
		
		if (!validarTipoVenda(aidf.getTipoValidaVenta(), aidf.getSerie(), aidf.getAidfTipo().getAidftipoId())) {
			Messagebox.show(
                    Labels.getLabel("editarAidfController.btnSalvar.MSG.serieUNICTipoFormularioContinuoVendaMotoristaNaoPermitido"),
                    Labels.getLabel("editarAidfController.window.title"),
                    Messagebox.OK, Messagebox.EXCLAMATION);
            return;
		}
		
		if(!validarVendaManual(aidf.getAidfTipo().getAidftipoId(), aidf.getSerie())){
			Messagebox.show(
                    Labels.getLabel("editarAidfController.btnSalvar.MSG.serieUNICTipoVendaManualNaoPermitido"),
                    Labels.getLabel("editarAidfController.window.title"),
                    Messagebox.OK, Messagebox.EXCLAMATION);
            return;
		}
		
		aidf.setActivo(true);
		aidf.setFecmodif(Calendar.getInstance().getTime());
		aidf.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
		
		if(aidf.getAidfId() == null){
			aidfService.suscribir(aidf);
			aidfList.addItemNovo(aidf);
		} else {
			aidfService.actualizacion(aidf);
			aidfList.updateItem(aidf);
		}
			
		Messagebox.show(
				Labels.getLabel("editarAidfController.MSG.suscribirOK"),
				Labels.getLabel("editarAidfController.window.title"),
				Messagebox.OK, Messagebox.INFORMATION);

		closeWindow();		
	}
	
	
	private Boolean validarDocFiscalEstado(Long idAidf, String docFiscal, Estado estado){
		return aidfService.validarDocFiscalPorEstado(idAidf, docFiscal, estado);
	}
	
	private Boolean validarTipoVenda(String tipoVenda, String serie, Integer tipo){
		return aidfService.validarTipoVenda(tipoVenda, serie, tipo);		
	}
	
	private Boolean validarVendaManual(Integer tipo, String serie){
		return aidfService.validarVendaManual(tipo, serie);	
	}
	
	public void onChange$cmbEmpresa(Event ev) {
		Comboitem cbiEmpresa = cmbEmpresa.getSelectedItem();
		if (cbiEmpresa != null) {
			Empresa empresa = (Empresa) cbiEmpresa.getValue();
			
			lsInscestadual =  new ArrayList<InscricaoEstadual>();
			lsInscestadual.addAll(empresaService.buscaInscricoesEstaduais(empresa));			
			cmbInscestadual.setModel(new BindingListModelList(lsInscestadual, true));
		}
	}
	
	public void onBlur$txtSerie(Event ev){
		try{
			txtSerie.getValue();
		}catch(WrongValueException e){
			aidf.setSerie("");
			txtSerie.setValue("");
		}
	}

	public Combobox getCmbInscestadual() {				
		return cmbInscestadual;
	}

	public void setCmbInscestadual(Combobox cmbInscestadual) {
		this.cmbInscestadual = cmbInscestadual;
	}

	public List<InscricaoEstadual> getLsInscestadual() {
		return lsInscestadual;
	}

	public void setLsInscestadual(List<InscricaoEstadual> lsInscestadual) {
		this.lsInscestadual = lsInscestadual;
	}

	public Combobox getCmbTipoValidaVenta() {
		return cmbTipoValidaVenta;
	}

	public void setCmbTipoValidaVenta(Combobox cmbTipoValidaVenta) {
		this.cmbTipoValidaVenta = cmbTipoValidaVenta;
	}		
	
	public Button getBtnApagar() {
		return btnApagar;
	}

	public void setBtnApagar(Button btnApagar) {
		this.btnApagar = btnApagar;
	}

	public EstadoService getEstadoService() {
		return estadoService;
	}

	public void setEstadoService(EstadoService estadoService) {
		this.estadoService = estadoService;
	}

	public List<AidfEspecie> getLsAidfEspecie() {
		return lsAidfEspecie;
	}

	public void setLsAidfEspecie(List<AidfEspecie> lsAidfEspecie) {
		this.lsAidfEspecie = lsAidfEspecie;
	}

	public List<Estado> getLsEstado() {
		return lsEstado;
	}

	public void setLsEstado(List<Estado> lsEstado) {
		this.lsEstado = lsEstado;
	}

	public List<AidfTipo> getLsAidfTipo() {
		return lsAidfTipo;
	}

	public void setLsAidfTipo(List<AidfTipo> lsAidfTipo) {
		this.lsAidfTipo = lsAidfTipo;
	}

	public Combobox getCmbEmpresa() {
		return cmbEmpresa;
	}

	public void setCmbEmpresa(Combobox cmbEmpresa) {
		this.cmbEmpresa = cmbEmpresa;
	}

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

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

	public Textbox getTxtDocFiscal() {
		return txtDocFiscal;
	}

	public void setTxtDocFiscal(Textbox txtDocFiscal) {
		this.txtDocFiscal = txtDocFiscal;
	}

	public Textbox getTxtAcFiscal() {
		return txtAcFiscal;
	}

	public void setTxtAcFiscal(Textbox txtAcFiscal) {
		this.txtAcFiscal = txtAcFiscal;
	}

	public Textbox getTxtSerie() {
		return txtSerie;
	}

	public void setTxtSerie(Textbox txtSerie) {
		this.txtSerie = txtSerie;
	}

	public Textbox getTxtSubSerie() {
		return txtSubSerie;
	}

	public void setTxtSubSerie(Textbox txtSubSerie) {
		this.txtSubSerie = txtSubSerie;
	}

	public Textbox getTxtFormInicial() {
		return txtFormInicial;
	}

	public void setTxtFormInicial(Textbox txtFormInicial) {
		this.txtFormInicial = txtFormInicial;
	}

	public Textbox getTxtFormFinal() {
		return txtFormFinal;
	}

	public void setTxtFormFinal(Textbox txtFormFinal) {
		this.txtFormFinal = txtFormFinal;
	}

	public Textbox getTxtFecAquisicao() {
		return txtFecAquisicao;
	}

	public void setTxtFecAquisicao(Textbox txtFecAquisicao) {
		this.txtFecAquisicao = txtFecAquisicao;
	}

	public Textbox getTxtFecVencimento() {
		return txtFecVencimento;
	}

	public void setTxtFecVencimento(Textbox txtFecVencimento) {
		this.txtFecVencimento = txtFecVencimento;
	}

	public Combobox getCmbAidfTipo() {
		return cmbAidfTipo;
	}
	
	public void setCmbAidfTipo(Combobox _cmbAidfTipo) {
		cmbAidfTipo = _cmbAidfTipo;
	}
	
	public Combobox getCmbAidfEspecie() {
		return cmbAidfEspecie;
	}
	
	public void setCmbAidfEspecie(Combobox _cmbAidfEspecie) {
		cmbAidfEspecie = _cmbAidfEspecie;
	}
	
	public Combobox getCmbEstado() {
		return cmbEstado;
	}

	public void setCmbEstado(Combobox _cmbEstado) {
		cmbEstado = _cmbEstado;
	}

	public Aidf getAidf() {
		return aidf;
	}

	public void setAidf(Aidf aidf) {
		this.aidf = aidf;
	}
	
	public Datebox getDtbFecadquisicion() {
		return dtbFecadquisicion;
	}

	public void setDtbFecadquisicion(Datebox dtbFecadquisicion) {
		this.dtbFecadquisicion = dtbFecadquisicion;
	}

	public Datebox getDtbFecvencimiento() {
		return dtbFecvencimiento;
	}

	public void setDtbFecvencimiento(Datebox dtbFecvencimiento) {
		this.dtbFecvencimiento = dtbFecvencimiento;
	}

	public Textbox getTxtForminicial() {
		return txtForminicial;
	}

	public void setTxtForminicial(Textbox txtForminicial) {
		this.txtForminicial = txtForminicial;
	}

	public Textbox getTxtFormfinal() {
		return txtFormfinal;
	}

	public void setTxtFormfinal(Textbox txtFormfinal) {
		this.txtFormfinal = txtFormfinal;
	}

	public Button getBtnSalvar() {
		return btnSalvar;
	}

	public void setBtnSalvar(Button btnSalvar) {
		this.btnSalvar = btnSalvar;
	}
	
	public class OnlyNumber implements Constraint {
	    public void validate(Component comp, Object value) throws WrongValueException {
	        if (!value.toString().matches("[0-9]+")){
	        	aidf.setDocfiscal(value.toString());
	            throw new WrongValueException(comp, Labels.getLabel("editarAidfController.btnSalvar.MSG.apenasValoresNumericosPermitidos"));
	        }
	    }
	}
}