package siprp.medicina.processo.logic;

import java.util.Date;
import java.util.List;

import javax.swing.tree.DefaultMutableTreeNode;

import leaf.ui.LeafLogic;
import leaf.ui.LeafWindow.LeafObject;
import siprp.MedicinaConstants;
import siprp.ProcessoConstants;
import siprp.database.cayenne.objects.BaseObject;
import siprp.database.cayenne.objects.Empresas;
import siprp.database.cayenne.objects.Estabelecimentos;
import siprp.database.cayenne.objects.Exames;
import siprp.database.cayenne.objects.Lembretes;
import siprp.database.cayenne.objects.Prestadores;
import siprp.database.cayenne.objects.Trabalhadores;
import siprp.database.cayenne.objects.TrabalhadoresConsultas;
import siprp.database.cayenne.objects.TrabalhadoresConsultasDatas;
import siprp.database.cayenne.objects.TrabalhadoresConsultasDatasEmails;
import siprp.database.cayenne.objects.TrabalhadoresConsultasDatasObservacoes;
import siprp.database.cayenne.objects.TrabalhadoresEcd;
import siprp.database.cayenne.objects.TrabalhadoresEcds;
import siprp.database.cayenne.objects.TrabalhadoresEcdsDatas;
import siprp.database.cayenne.objects.TrabalhadoresEcdsDatasEmails;
import siprp.database.cayenne.objects.TrabalhadoresEcdsDatasObservacoes;
import siprp.database.cayenne.objects.TrabalhadoresFichasAptidao;
import siprp.database.cayenne.objects.TrabalhadoresProcesso;
import siprp.database.cayenne.providers.MedicinaDAO;
import siprp.ficha.FichaWindow;
import siprp.ficha.SaveExameListener;
import siprp.lembretes.LembretesConstants;
import siprp.lembretes.LembretesDataProvider;
import siprp.medicina.processo.estrutura.FichaAptidaoMutableTreeNode;

public class MedicinaProcessoLogic extends LeafLogic
{
	@Action(isSave = false)
	public static final String SELECT_EMPRESA = "SELECT_EMPRESA";

	@Action(isSave = false)
	public static final String SELECT_ESTABELECIMENTO = "SELECT_ESTABLECIMENTO";

	@Action(isSave = false)
	public static final String LOAD_TRABALHADOR = "LOAD_TRABALHADOR";

	@Action(isSave = false)
	public static final String SELECT_TRABALHADOR = "SELECT_TRABALHADOR";

	@Action(isSave = false)
	public static final String SELECT_PROCESSO = "SELECT_PROCESSO";

	@Action(isSave = false)
	public static final String SELECT_CONSULTA = "SELECT_CONSULTA";

	@Action(isSave = false)
	public static final String SELECT_CONSULTA_MARCACAO = "SELECT_CONSULTA_MARCACAO";

	@Action(isSave = false)
	public static final String SELECT_CONSULTA_MARCACAO_EMAIL = "SELECT_CONSULTA_MARCACAO_EMAIL";

	@Action(isSave = false)
	public static final String SELECT_CONSULTA_MARCACAO_OBSERVACAO = "SELECT_CONSULTA_MARCACAO_OBSERVACAO";

	@Action(isSave = false)
	public static final String SELECT_EXAME = "SELECT_EXAME";

	@Action(isSave = false)
	public static final String SELECT_EXAME_MARCACAO = "SELECT_EXAME_MARCACAO";

	@Action(isSave = false)
	public static final String SELECT_EXAME_MARCACAO_EMAIL = "SELECT_EXAME_MARCACAO_EMAIL";

	@Action(isSave = false)
	public static final String SELECT_EXAME_MARCACAO_OBSERVACAO = "SELECT_EXAME_MARCACAO_OBSERVACAO";

	@Action(isSave = false)
	public static final String SELECT_FICHA = "SELECT_FICHA";

	@Action(isSave = false)
	public static final String SELECT_TREE_NODE = "SELECT_TREE_NODE";

	@Action(isSave = false)
	public static final String CREATE_PROCESSO = "CREATE_PROCESSO";

	@Action(isSave = false)
	public static final String CREATE_LEMBRETE = "CREATE_LEMBRETE";

	@Action(isSave = false)
	public static final String CREATE_FICHA = "CREATE_FICHA";

	@Action(isSave = false)
	public static final String CREATE_CONSULTA = "CREATE_CONSULTA";

	@Action(isSave = false)
	public static final String CREATE_CONSULTA_MARCACAO = "CREATE_CONSULTA_MARCACAO";

	@Action(isSave = false)
	public static final String CREATE_CONSULTA_MARCACAO_EMAIL = "CREATE_CONSULTA_MARCACAO_EMAIL";

	@Action(isSave = false)
	public static final String CREATE_CONSULTA_MARCACAO_EMAIL_VACINAS = "CREATE_CONSULTA_MARCACAO_EMAIL_VACINAS";

	@Action(isSave = false)
	public static final String CREATE_CONSULTA_MARCACAO_OBSERVACOES = "CREATE_CONSULTA_MARCACAO_OBSERVACOES";

	@Action(isSave = false)
	public static final String CREATE_EXAME = "CREATE_EXAME";

	@Action(isSave = false)
	public static final String CREATE_EXAME_MARCACAO = "CREATE_EXAME_MARCACAO";

	@Action(isSave = false)
	public static final String CREATE_EXAME_MARCACAO_EMAIL = "CREATE_EXAME_MARCACAO_EMAIL";

	@Action(isSave = false)
	public static final String CREATE_EXAME_MARCACAO_OBSERVACOES = "CREATE_EXAME_MARCACAO_OBSERVACOES";

	@Action(isSave = true)
	public static final String SAVE_PROCESSO = "SAVE_PROCESSO";

	@Action(isSave = true)
	public static final String SAVE_LEMBRETE = "SAVE_LEMBRETE";

	@Action(isSave = true)
	public static final String SAVE_CONSULTA = "SAVE_CONSULTA";

	@Action(isSave = true)
	public static final String SAVE_CONSULTA_MARCACAO = "SAVE_CONSULTA_MARCACAO";

	@Action(isSave = true)
	public static final String SAVE_CONSULTA_MARCACAO_EMAIL = "SAVE_CONSULTA_MARCACAO_EMAIL";

	@Action(isSave = true)
	public static final String SAVE_CONSULTA_MARCACAO_OBSERVACOES = "SAVE_CONSULTA_MARCACAO_OBSERVACOES";

	@Action(isSave = true)
	public static final String SAVE_FICHA = "SAVE_FICHA";

	@Action(isSave = true)
	public static final String SAVE_EXAME = "SAVE_EXAME";

	@Action(isSave = true)
	public static final String SAVE_EXAME_MARCACAO = "SAVE_EXAME_MARCACAO";

	@Action(isSave = true)
	public static final String SAVE_EXAME_MARCACAO_EMAIL = "SAVE_EXAME_MARCACAO_EMAIL";

	@Action(isSave = true)
	public static final String SAVE_EXAME_MARCACAO_OBSERVACOES = "SAVE_EXAME_MARCACAO_OBSERVACOES";

	@Action(isSave = true)
	public static final String FECHAR_PROCESSO = "FECHAR_PROCESSO";

	@Action(isSave = false)
	public static final String APAGAR_PROCESSO = "APAGAR_PROCESSO";

	@Action(isSave = false)
	public static final String APAGAR_CONSULTA = "APAGAR_CONSULTA";
	
	@Action(isSave = false)
	public static final String APAGAR_CONSULTA_MARCACAO = "APAGAR_CONSULTA_MARCACAO";

	@Action(isSave = false)
	public static final String APAGAR_EXAME = "APAGAR_EXAME";
	
	@Action(isSave = false)
	public static final String APAGAR_EXAME_MARCACAO = "APAGAR_EXAME_MARCACAO";

	@Action(isSave = false)
	public static final String REFRESH = "REFRESH";

	@Action(isSave = false)
	public static final String CLOSE = "CLOSE";

	@Action(isSave = true)
	public static final String DESMARCAR_SIPRP_CONSULTA_MARCACAO = "DESMARCAR_SIPRP_CONSULTA_MARCACAO";

	@Action(isSave = true)
	public static final String DESMARCAR_TRABALHADOR_CONSULTA_MARCACAO = "DESMARCAR_TRABALHADOR_CONSULTA_MARCACAO";

	@Action(isSave = true)
	public static final String REALIZAR_CONSULTA_MARCACAO = "REALIZAR_CONSULTA_MARCACAO";

	@Action(isSave = true)
	public static final String FALTOU_CONSULTA_MARCACAO = "FALTOU_CONSULTA_MARCACAO";

	@Action(isSave = true)
	public static final String DESMARCAR_SIPRP_EXAME_MARCACAO = "DESMARCAR_SIPRP_EXAME_MARCACAO";

	@Action(isSave = true)
	public static final String DESMARCAR_TRABALHADOR_EXAME_MARCACAO = "DESMARCAR_TRABALHADOR_EXAME_MARCACAO";

	@Action(isSave = true)
	public static final String REALIZAR_EXAME_MARCACAO = "REALIZAR_EXAME_MARCACAO";

	@Action(isSave = true)
	public static final String REALIZAR_PARCIAL_EXAME_MARCACAO = "REALIZAR_PARCIAL_EXAME_MARCACAO";

	@Action(isSave = true)
	public static final String FALTOU_EXAME_MARCACAO = "FALTOU_EXAME_MARCACAO";

	@Action(isSave = true)
	public static final String ANULAR_EXAME_MARCACAO = "ANULAR_EXAME_MARCACAO";

	private LembretesDataProvider lembretesDataProvider = null;

	private MedicinaDAO provider = null;

	public Empresas currentEmpresa = null;

	public Estabelecimentos currentEstabelecimento = null;

	@LeafObject(useWith = LOAD_TRABALHADOR)
	public Trabalhadores currentTrabalhador = null;

	@LeafObject(useWith = {
			SAVE_PROCESSO, APAGAR_PROCESSO
	})
	public TrabalhadoresProcesso currentProcesso = null;

	@LeafObject(useWith = {
			SAVE_CONSULTA, APAGAR_CONSULTA
	})
	public TrabalhadoresConsultas currentConsulta = null;

	@LeafObject(useWith = { SAVE_CONSULTA_MARCACAO, APAGAR_CONSULTA_MARCACAO } )
	public TrabalhadoresConsultasDatas currentConsultaMarcacao = null;

	@LeafObject(useWith = SAVE_CONSULTA_MARCACAO_EMAIL)
	public TrabalhadoresConsultasDatasEmails currentConsultaMarcacaoEmail = null;

	@LeafObject(useWith = SAVE_CONSULTA_MARCACAO_OBSERVACOES)
	public TrabalhadoresConsultasDatasObservacoes currentConsultaMarcacaoObservacao = null;

	@LeafObject(useWith = SAVE_FICHA)
	public TrabalhadoresFichasAptidao currentFicha = null;

	@LeafObject(useWith = SAVE_EXAME_MARCACAO_OBSERVACOES)
	public TrabalhadoresEcdsDatasObservacoes currentExameMarcacaoObservacao = null;

	@LeafObject(useWith = SAVE_EXAME_MARCACAO_EMAIL)
	public TrabalhadoresEcdsDatasEmails currentExameMarcacaoEmail = null;

	@LeafObject(useWith = {
			SAVE_EXAME_MARCACAO, REALIZAR_PARCIAL_EXAME_MARCACAO, APAGAR_EXAME_MARCACAO
	})
	public TrabalhadoresEcdsDatas currentExameMarcacao = null;

	@LeafObject(useWith = {
			SAVE_EXAME, APAGAR_EXAME
	})
	public TrabalhadoresEcds currentExame = null;

	public Integer currentFichaExameID = null;

	public MedicinaProcessoLogic()
	{
		try
		{
			provider = new MedicinaDAO();
			lembretesDataProvider = new LembretesDataProvider();
		} catch( Exception e )
		{
			e.printStackTrace( System.out );
		}
	}

	@LeafLogicActionBinding(actions = {
		ACTION_STARTUP
	})
	public List<Empresas> getAllEmpresas()
	{
		return provider.getAllEmpresas();
	}

	@LeafLogicActionBinding(actions = {
		SELECT_EMPRESA
	})
	public Empresas setEmpresa( Empresas empresa )
	{
		currentEmpresa = empresa;
		return currentEmpresa;
	}

	@LeafLogicActionBinding(actions = {
		SELECT_ESTABELECIMENTO
	})
	public Estabelecimentos setEstabelecimento( Estabelecimentos estabelecimento )
	{
		currentEstabelecimento = estabelecimento;
		return currentEstabelecimento;
	}

	@LeafLogicActionBinding(actions = {
		LOAD_TRABALHADOR
	})
	public Trabalhadores getDadosTrabalhador( Trabalhadores trabalhador )
	{
		// Trabalhadores result = null;
		// if( id != null )
		// {
		// result = provider.getTrabalhadorByID( id );
		// }
		currentTrabalhador = trabalhador;
		return currentTrabalhador;
	}

	@LeafLogicActionBinding(actions = FECHAR_PROCESSO)
	public void fecharProcesso()
	{
		if( currentProcesso != null )
		{
			currentProcesso.setDataFim( new Date() );
			currentProcesso.setEstado( ProcessoConstants.PROCESSO_FECHADO_CODE );
			runActionLater( SAVE_PROCESSO );
		}
	}

	@LeafLogicActionBinding(actions = APAGAR_PROCESSO)
	public void apagarProcesso()
	{
		if( currentProcesso != null && currentProcesso.isEmpty() )
		{
			currentProcesso.setActivo( "n" );
			runActionLater( SAVE_PROCESSO );
		}
	}

	private void novoLembreteRemarcacao( String mensagem, boolean isConsulta )
	{
		Integer tipoID = lembretesDataProvider.getTipoLembreteIDByCodigo( LembretesConstants.CODE_REMARCACOES );
		try
		{
			if( isConsulta )
			{
				lembretesDataProvider.criarLembreteConsulta( tipoID, new Date(), mensagem, null, currentEmpresa.getId(), currentEstabelecimento.getId(), currentTrabalhador.getId(), currentConsultaMarcacao.getId() );
			}
			else
			{
				lembretesDataProvider.criarLembreteExame( tipoID, new Date(), mensagem, null, currentEmpresa.getId(), currentEstabelecimento.getId(), currentTrabalhador.getId(), currentExameMarcacao.getId() );
			}
		} catch( Exception e )
		{
			e.printStackTrace();
		}
	}

	@LeafLogicActionBinding(actions = DESMARCAR_SIPRP_CONSULTA_MARCACAO)
	public void desmarcarConsultaSiprp()
	{
		if( currentConsultaMarcacao != null )
		{
			currentConsultaMarcacao.setEstado( MedicinaConstants.ESTADO_DESMARCADO_EMPRESA );
			novoLembreteRemarcacao( MedicinaConstants.LEMBRETE_DESMARCOU_SIPRP_STRING, true );
			runActionLater( SAVE_CONSULTA_MARCACAO );
		}
	}

	@LeafLogicActionBinding(actions = DESMARCAR_TRABALHADOR_CONSULTA_MARCACAO)
	public void desmarcarConsultaTrabalhador()
	{
		if( currentConsultaMarcacao != null )
		{
			currentConsultaMarcacao.setEstado( MedicinaConstants.ESTADO_DESMARCADO_TRABALHADOR );
			novoLembreteRemarcacao( MedicinaConstants.LEMBRETE_DESMARCOU_TRABALHADOR_STRING, true );
			runActionLater( SAVE_CONSULTA_MARCACAO );
		}
	}

	@LeafLogicActionBinding(actions = FALTOU_CONSULTA_MARCACAO)
	public void faltouConsulta()
	{
		if( currentConsultaMarcacao != null )
		{
			currentConsultaMarcacao.setEstado( MedicinaConstants.ESTADO_FALTOU );
			novoLembreteRemarcacao( MedicinaConstants.LEMBRETE_FALTOU_TRABALHADOR_STRING, true );
			runActionLater( SAVE_CONSULTA_MARCACAO );
		}
	}

	@LeafLogicActionBinding(actions = REALIZAR_CONSULTA_MARCACAO)
	public void realizarConsulta()
	{
		if( currentConsultaMarcacao != null )
		{
			currentConsultaMarcacao.setEstado( MedicinaConstants.ESTADO_REALIZADO );
			runActionLater( SAVE_CONSULTA_MARCACAO );
		}
	}

	@LeafLogicActionBinding(actions = DESMARCAR_SIPRP_EXAME_MARCACAO)
	public void desmarcarExameSiprp()
	{
		if( currentExameMarcacao != null )
		{
			currentExameMarcacao.desmarcarSIPRP();
			novoLembreteRemarcacao( MedicinaConstants.LEMBRETE_DESMARCOU_SIPRP_STRING, false );
			runActionLater( SAVE_EXAME_MARCACAO );
		}
	}

	@LeafLogicActionBinding(actions = DESMARCAR_TRABALHADOR_EXAME_MARCACAO)
	public void desmarcarExameTrabalhador()
	{
		if( currentExameMarcacao != null )
		{
			currentExameMarcacao.desmarcarTrabalhador();
			novoLembreteRemarcacao( MedicinaConstants.LEMBRETE_DESMARCOU_TRABALHADOR_STRING, false );
			runActionLater( SAVE_EXAME_MARCACAO );
		}
	}

	@LeafLogicActionBinding(actions = FALTOU_EXAME_MARCACAO)
	public void faltouExame()
	{
		if( currentExameMarcacao != null )
		{
			currentExameMarcacao.faltou();
			novoLembreteRemarcacao( MedicinaConstants.LEMBRETE_FALTOU_TRABALHADOR_STRING, false );
			runActionLater( SAVE_EXAME_MARCACAO );
		}
	}

	@LeafLogicActionBinding(actions = ANULAR_EXAME_MARCACAO)
	public void anularExame()
	{
		if( currentExameMarcacao != null )
		{
			currentExameMarcacao.anular();
			runActionLater( SAVE_EXAME_MARCACAO );
		}
	}

	@LeafLogicActionBinding(actions = REALIZAR_EXAME_MARCACAO)
	public void realizarExame()
	{
		if( currentExameMarcacao != null )
		{
			currentExameMarcacao.realizar();
			runActionLater( SAVE_EXAME_MARCACAO );
		}
	}

	@LeafLogicActionBinding(actions = REALIZAR_PARCIAL_EXAME_MARCACAO)
	public void realizarParcialExame()
	{
		if( currentExameMarcacao != null )
		{
			runActionLater( SAVE_EXAME_MARCACAO );
		}
	}

	@LeafLogicActionBinding(actions = SELECT_TRABALHADOR)
	public Trabalhadores selectTrabalhador( Trabalhadores trabalhador )
	{
		this.currentTrabalhador = trabalhador;
		return this.currentTrabalhador;
	}

	@LeafLogicActionBinding(actions = SELECT_PROCESSO)
	public TrabalhadoresProcesso selectProcesso( TrabalhadoresProcesso processo )
	{
		this.currentProcesso = processo;
		return this.currentProcesso;
	}

	@LeafLogicActionBinding(actions = SELECT_CONSULTA)
	public TrabalhadoresConsultas selectConsulta( TrabalhadoresConsultas consulta )
	{
		this.currentConsulta = consulta;
		return this.currentConsulta;
	}

	@LeafLogicActionBinding(actions = SELECT_CONSULTA_MARCACAO)
	public TrabalhadoresConsultasDatas selectConsultaMarcacao( TrabalhadoresConsultasDatas consultaMarcacao )
	{
		this.currentConsultaMarcacao = consultaMarcacao;
		return this.currentConsultaMarcacao;
	}

	@LeafLogicActionBinding(actions = SELECT_CONSULTA_MARCACAO_EMAIL)
	public TrabalhadoresConsultasDatasEmails selectConsultaMarcacaoEmail( TrabalhadoresConsultasDatasEmails consultaMarcacaoEmail )
	{
		this.currentConsultaMarcacaoEmail = consultaMarcacaoEmail;
		return this.currentConsultaMarcacaoEmail;
	}

	@LeafLogicActionBinding(actions = SELECT_CONSULTA_MARCACAO_OBSERVACAO)
	public TrabalhadoresConsultasDatasObservacoes selectConsultaMarcacaoObservacoes( TrabalhadoresConsultasDatasObservacoes consultaMarcacaoObservacoes )
	{
		this.currentConsultaMarcacaoObservacao = consultaMarcacaoObservacoes;
		return this.currentConsultaMarcacaoObservacao;
	}

	@LeafLogicActionBinding(actions = SELECT_EXAME)
	public TrabalhadoresEcds selectExame( TrabalhadoresEcds exame )
	{
		this.currentExame = exame;
		return this.currentExame;
	}

	@LeafLogicActionBinding(actions = SELECT_EXAME_MARCACAO)
	public TrabalhadoresEcdsDatas selectExameMarcacao( TrabalhadoresEcdsDatas exameMarcacao )
	{
		this.currentExameMarcacao = exameMarcacao;
		return this.currentExameMarcacao;
	}

	@LeafLogicActionBinding(actions = SELECT_EXAME_MARCACAO_EMAIL)
	public TrabalhadoresEcdsDatasEmails selectExameMarcacaoEmail( TrabalhadoresEcdsDatasEmails exameMarcacaoEmail )
	{
		this.currentExameMarcacaoEmail = exameMarcacaoEmail;
		return this.currentExameMarcacaoEmail;
	}

	@LeafLogicActionBinding(actions = SELECT_EXAME_MARCACAO_OBSERVACAO)
	public TrabalhadoresEcdsDatasObservacoes selectExameMarcacaoObservacoes( TrabalhadoresEcdsDatasObservacoes exameMarcacaoObservacoes )
	{
		this.currentExameMarcacaoObservacao = exameMarcacaoObservacoes;
		return this.currentExameMarcacaoObservacao;
	}

	@LeafLogicActionBinding(actions = SELECT_FICHA)
	public TrabalhadoresFichasAptidao selectFichaAptidao( TrabalhadoresFichasAptidao ficha )
	{
		this.currentFicha = ficha;
		return this.currentFicha;
	}

	@LeafLogicActionBinding(actions = {
		SELECT_TREE_NODE
	})
	public DefaultMutableTreeNode nodeSelected( DefaultMutableTreeNode node )
	{
		String action = null;
		if( node.getUserObject() == null )
		{
		}
		else if( node.getUserObject() instanceof Trabalhadores )
		{
			action = SELECT_TRABALHADOR;
		}
		else if( node.getUserObject() instanceof TrabalhadoresProcesso )
		{
			action = SELECT_PROCESSO;
		}
		else if( node.getUserObject() instanceof TrabalhadoresConsultas )
		{
			action = SELECT_CONSULTA;
		}
		else if( node.getUserObject() instanceof TrabalhadoresConsultasDatas )
		{
			action = SELECT_CONSULTA_MARCACAO;
		}
		else if( node.getUserObject() instanceof TrabalhadoresConsultasDatasObservacoes )
		{
			action = SELECT_CONSULTA_MARCACAO_OBSERVACAO;
		}
		else if( node.getUserObject() instanceof TrabalhadoresConsultasDatasEmails )
		{
			action = SELECT_CONSULTA_MARCACAO_EMAIL;
		}
		else if( node.getUserObject() instanceof TrabalhadoresEcds )
		{
			action = SELECT_EXAME;
		}
		else if( node.getUserObject() instanceof TrabalhadoresEcdsDatas )
		{
			action = SELECT_EXAME_MARCACAO;
		}
		else if( node.getUserObject() instanceof TrabalhadoresEcdsDatasEmails )
		{
			action = SELECT_EXAME_MARCACAO_EMAIL;
		}
		else if( node.getUserObject() instanceof TrabalhadoresEcdsDatasObservacoes )
		{
			action = SELECT_EXAME_MARCACAO_OBSERVACAO;
		}
		else if( node instanceof FichaAptidaoMutableTreeNode )
		{
			action = SELECT_FICHA;
		}
		runAction( action, node.getUserObject() );
		return node;
	}

	@LeafLogicActionBinding(actions = {
		CREATE_FICHA
	})
	public void createFicha()
	{
		try
		{
			FichaWindow fichaWindow = FichaWindow.getWindow();
			if( fichaWindow != null )
			{
				currentFicha = new TrabalhadoresFichasAptidao();
				currentFicha.setToTrabalhadoresProcesso( currentProcesso );
				Date data = getUltimaConsultaMarcacaoDateForProcesso();
				fichaWindow.editTrabalhador( currentTrabalhador.getId(), data, currentProcesso.getMotivo(), new SaveExameListener()
				{
					@Override
					public void exameSaved( Integer trabalhadorID, Integer exameID )
					{
						if( trabalhadorID != null && exameID != null )
						{
							if( trabalhadorID.equals( currentTrabalhador.getId() ) )
							{
								currentFichaExameID = exameID;
								Exames exame = provider.getExameForExameID( currentFichaExameID );
								if( exame != null )
								{
									currentFicha.setToExames( exame );
									provider.saveObject( currentFicha );
									runAction( REFRESH );
								}
							}
						}
					}
				} );
			}
		} catch( Exception e )
		{
			e.printStackTrace();
		}
	}
	
	private Date getUltimaConsultaMarcacaoDateForProcesso()
	{
		Date result = null;
		if( currentProcesso != null )
		{
			List<TrabalhadoresConsultas> consultas = currentProcesso.getTrabalhadoresConsultasArray();
			for( TrabalhadoresConsultas consulta : consultas )
			{
				if( new Integer(MedicinaConstants.ESTADO_REALIZADO).equals( consulta.getEstado() ))
				{
					List<TrabalhadoresConsultasDatas> marcacoes = consulta.getTrabalhadoresConsultasDatasArray();
					for( TrabalhadoresConsultasDatas marcacao : marcacoes )
					{
						if( new Integer(MedicinaConstants.ESTADO_REALIZADO).equals( marcacao.getEstado() ))
						{
							Date marcacaoDate = marcacao.getData();
							if( marcacaoDate != null && (result == null || result.before( marcacaoDate ) ) )
							{
								result = marcacaoDate;
							}
						}
					}
				}
			}
		}
		return result;
	}

	@LeafLogicActionBinding(actions = {
		CREATE_CONSULTA
	})
	public TrabalhadoresConsultas createConsulta()
	{
		currentConsulta = new TrabalhadoresConsultas();
		currentConsulta.setToTrabalhadores( currentTrabalhador );
		currentConsulta.setToTrabalhadoresProcesso( currentProcesso );
		currentConsulta.setToPrestadores( getPrestador( true ) );
		currentConsulta.setEstado( MedicinaConstants.ESTADO_POR_REALIZAR );
		return currentConsulta;
	}

	@LeafLogicActionBinding(actions = {
		CREATE_CONSULTA_MARCACAO
	})
	public TrabalhadoresConsultasDatas createConsultaMarcacao()
	{
		currentConsultaMarcacao = new TrabalhadoresConsultasDatas();
		currentConsultaMarcacao.setToTrabalhadoresConsultas( currentConsulta );
		currentConsultaMarcacao.setToPrestadores( getPrestador( true ) );
		currentConsultaMarcacao.setEstado( MedicinaConstants.ESTADO_POR_REALIZAR );
		runActionLater( SAVE_CONSULTA_MARCACAO );
		return currentConsultaMarcacao;
	}

	@LeafLogicActionBinding(actions = {
		CREATE_CONSULTA_MARCACAO_EMAIL
	})
	public TrabalhadoresConsultasDatasEmails createConsultaMarcacaoEmails()
	{
		currentConsultaMarcacaoEmail = new TrabalhadoresConsultasDatasEmails();
		currentConsultaMarcacaoEmail.setToTrabalhadoresConsultasDatas( currentConsultaMarcacao );
		runActionLater( SAVE_CONSULTA_MARCACAO_EMAIL );
		return currentConsultaMarcacaoEmail;
	}

	@LeafLogicActionBinding(actions = {
		CREATE_CONSULTA_MARCACAO_EMAIL_VACINAS
	})
	public TrabalhadoresConsultasDatasEmails createConsultaMarcacaoEmailsVacinas()
	{
		currentConsultaMarcacaoEmail = new TrabalhadoresConsultasDatasEmails();
		currentConsultaMarcacaoEmail.setToTrabalhadoresConsultasDatas( currentConsultaMarcacao );
		runActionLater( SAVE_CONSULTA_MARCACAO_EMAIL );
		return currentConsultaMarcacaoEmail;
	}

	@LeafLogicActionBinding(actions = {
		CREATE_CONSULTA_MARCACAO_OBSERVACOES
	})
	public TrabalhadoresConsultasDatasObservacoes createConsultaMarcacaoObservacoes()
	{
		currentConsultaMarcacaoObservacao = new TrabalhadoresConsultasDatasObservacoes();
		currentConsultaMarcacaoObservacao.setToTrabalhadoresConsultasDatas( currentConsultaMarcacao );
		runActionLater( SAVE_CONSULTA_MARCACAO_OBSERVACOES );
		return currentConsultaMarcacaoObservacao;
	}

	@LeafLogicActionBinding(actions = CREATE_EXAME)
	public TrabalhadoresEcds createExame()
	{
		currentExame = new TrabalhadoresEcds();
		currentExame.setToTrabalhadores( currentTrabalhador );
		currentExame.setToTrabalhadoresProcesso( currentProcesso );
		currentExame.setEstado( MedicinaConstants.ESTADO_POR_REALIZAR );
		runActionLater( SAVE_EXAME );
		return currentExame;
	}

	@LeafLogicActionBinding(actions = CREATE_EXAME_MARCACAO)
	public TrabalhadoresEcdsDatas createExameMarcacao()
	{
		currentExameMarcacao = new TrabalhadoresEcdsDatas();
		currentExameMarcacao.setToTrabalhadoresEcds( currentExame );
		currentExameMarcacao.setToPrestadores( getPrestador( false ) );
		currentExameMarcacao.setToAnalisador( getAnalisador() );
		currentExameMarcacao.porRealizar();
		runActionLater( SAVE_EXAME_MARCACAO );
		return currentExameMarcacao;
	}

	@LeafLogicActionBinding(actions = CREATE_EXAME_MARCACAO_OBSERVACOES)
	public TrabalhadoresEcdsDatasObservacoes createExameMarcacaoObservacao()
	{
		currentExameMarcacaoObservacao = new TrabalhadoresEcdsDatasObservacoes();
		currentExameMarcacaoObservacao.setToTrabalhadoresEcdsDatas( currentExameMarcacao );
		runActionLater( SAVE_EXAME_MARCACAO_OBSERVACOES );
		return currentExameMarcacaoObservacao;
	}

	@LeafLogicActionBinding(actions = CREATE_EXAME_MARCACAO_EMAIL)
	public TrabalhadoresEcdsDatasEmails createExameMarcacaoEmail()
	{
		currentExameMarcacaoEmail = new TrabalhadoresEcdsDatasEmails();
		currentExameMarcacaoEmail.setToTrabalhadoresEcdsDatas( currentExameMarcacao );
		runActionLater( SAVE_EXAME_MARCACAO_EMAIL );
		return currentExameMarcacaoEmail;
	}

	@LeafLogicActionBinding(actions = CREATE_PROCESSO)
	public TrabalhadoresProcesso createProcesso()
	{
		currentProcesso = new TrabalhadoresProcesso();
		currentProcesso.setDataInicio( new Date() );
		currentProcesso.setEstado( ProcessoConstants.PROCESSO_ABERTO_CODE );
		currentProcesso.setToTrabalhadores( currentTrabalhador );
		currentProcesso.setActivo( "y" );
		runActionLater( SAVE_PROCESSO );
		return currentProcesso;
	}

	@LeafLogicActionBinding(actions = CREATE_LEMBRETE)
	public Lembretes createLembrete()
	{
		Lembretes result = new Lembretes();
		result.setToTrabalhadores( currentTrabalhador );
		result.setToEmpresas( currentEmpresa );
		result.setToEstabelecimentos( currentEstabelecimento );
		result.setToLembretesTipos( provider.getTipoLembretesCustomizavel() );
		runActionLater( SAVE_LEMBRETE, result );
		return result;
	}

	@LeafLogicActionBinding(actions = {
			SAVE_PROCESSO, SAVE_LEMBRETE, SAVE_CONSULTA, SAVE_CONSULTA_MARCACAO, SAVE_CONSULTA_MARCACAO_EMAIL, SAVE_CONSULTA_MARCACAO_OBSERVACOES, SAVE_EXAME, SAVE_EXAME_MARCACAO, SAVE_EXAME_MARCACAO_EMAIL, SAVE_EXAME_MARCACAO_OBSERVACOES
	})
	public void saveObject( BaseObject object )
	{
		provider.saveObject( object );
		runActionLater( REFRESH );
	}

	@LeafLogicActionBinding(actions = {
			APAGAR_CONSULTA, APAGAR_EXAME
	})
	public void deleteObject( BaseObject object )
	{
		if( object instanceof TrabalhadoresConsultas )
		{
			apagarConsulta( (TrabalhadoresConsultas) object );
		}
		if( object instanceof TrabalhadoresEcds )
		{
			apagarExame( (TrabalhadoresEcds) object );
		}
		runActionLater( SELECT_PROCESSO );
	}

	private void apagarConsulta( TrabalhadoresConsultas consulta )
	{
		List<TrabalhadoresConsultasDatas> marcacoes = consulta.getTrabalhadoresConsultasDatasArray();
		if( marcacoes != null )
		{
			for( TrabalhadoresConsultasDatas marcacao : marcacoes )
			{
				List<TrabalhadoresConsultasDatasEmails> emails = marcacao.getTrabalhadoresConsultasDatasEmailsArray();
				if( emails != null )
				{
					for( TrabalhadoresConsultasDatasEmails email : emails )
					{
						provider.deleteObject( email );
					}
				}
				List<TrabalhadoresConsultasDatasObservacoes> observacoes = marcacao.getTrabalhadoresConsultasDatasObservacoesArray();
				if( observacoes != null )
				{
					for( TrabalhadoresConsultasDatasObservacoes observacao : observacoes )
					{
						provider.deleteObject( observacao );
					}
				}
				provider.deleteObject( marcacao );
			}
			provider.deleteObject( consulta );
		}
	}

	private void apagarExame( TrabalhadoresEcds exame )
	{
		List<TrabalhadoresEcdsDatas> marcacoes = exame.getTrabalhadoresEcdsDatasArray();
		if( marcacoes != null )
		{
			for( TrabalhadoresEcdsDatas marcacao : marcacoes )
			{
				List<TrabalhadoresEcd> ecds = marcacao.getTrabalhadoresEcdArray();
				if( ecds != null )
				{
					for( TrabalhadoresEcd ecd : ecds )
					{
						provider.deleteObject( ecd );
					}
				}
				List<TrabalhadoresEcdsDatasEmails> emails = marcacao.getTrabalhadoresEcdsDatasEmailsArray();
				if( emails != null )
				{
					for( TrabalhadoresEcdsDatasEmails email : emails )
					{
						provider.deleteObject( email );
					}
				}
				List<TrabalhadoresEcdsDatasObservacoes> observacoes = marcacao.getTrabalhadoresEcdsDatasObservacoesArray();
				if( observacoes != null )
				{
					for( TrabalhadoresEcdsDatasObservacoes observacao : observacoes )
					{
						provider.deleteObject( observacao );
					}
				}
				provider.deleteObject( marcacao );
			}
			provider.deleteObject( exame );
		}
	}

	@LeafLogicActionBinding(actions = ACTION_CANCEL)
	public void abortAction()
	{
		provider.rollback();
		runAction( LOAD_TRABALHADOR );
		runAction( SELECT_TRABALHADOR );
	}

	private Prestadores getPrestador( boolean consulta )
	{
		Prestadores result = null;
		if( currentTrabalhador != null && currentTrabalhador.getToEstabelecimentos() != null )
		{
			result = consulta ? currentTrabalhador.getToEstabelecimentos().getToPrestadores() : currentTrabalhador.getToEstabelecimentos().getToPrestadores1();
			if( Prestadores.prestadorNulo.equals( result ) )
			{
				result = null;
			}
		}
		return result;
	}

	private Prestadores getAnalisador()
	{
		return getPrestador( false );
	}

}
