package siprp.medicina.processo.logic;

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

import javax.swing.tree.DefaultMutableTreeNode;

import leaf.LeafLogic;
import leaf.LeafWindow.LeafObject;
import siprp.database.cayenne.objects.BaseObject;
import siprp.database.cayenne.objects.Empresas;
import siprp.database.cayenne.objects.Estabelecimentos;
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.TrabalhadoresEcds;
import siprp.database.cayenne.objects.TrabalhadoresEcdsDatas;
import siprp.database.cayenne.objects.TrabalhadoresEcdsDatasEmails;
import siprp.database.cayenne.objects.TrabalhadoresEcdsDatasObservacoes;
import siprp.database.cayenne.objects.TrabalhadoresProcesso;
import siprp.database.cayenne.providers.MedicinaDAO;
import siprp.medicina.MedicinaConstants;
import siprp.medicina.processo.ProcessoConstants;
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_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_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_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 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 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)
	public TrabalhadoresConsultas currentConsulta = null;

	@LeafObject(useWith = SAVE_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 FichaAptidaoMutableTreeNode 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 })
	public TrabalhadoresEcdsDatas currentExameMarcacao = null;

	@LeafObject(useWith = SAVE_EXAME)
	public TrabalhadoresEcds currentExame = null;

	public MedicinaProcessoLogic()
	{
		try
		{
			provider = new MedicinaDAO();
		} 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 );
		}
	}

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

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

	@LeafLogicActionBinding(actions = FALTOU_CONSULTA_MARCACAO)
	public void faltouConsulta()
	{
		if( currentConsultaMarcacao != null )
		{
			currentConsultaMarcacao.setEstado( MedicinaConstants.ESTADO_FALTOU );
			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();
			runActionLater( SAVE_EXAME_MARCACAO );
		}
	}

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

	@LeafLogicActionBinding(actions = FALTOU_EXAME_MARCACAO)
	public void faltouExame()
	{
		if( currentExameMarcacao != null )
		{
			currentExameMarcacao.faltou();
			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_TREE_NODE
	})
	public DefaultMutableTreeNode nodeSelected( DefaultMutableTreeNode node )
	{
		String action = null;
		if( node.getUserObject() == null )
		{
		}
		else if( node.getUserObject() instanceof Trabalhadores )
		{
			action = SELECT_TRABALHADOR;
			currentTrabalhador = (Trabalhadores) node.getUserObject();
		}
		else if( node.getUserObject() instanceof TrabalhadoresProcesso )
		{
			action = SELECT_PROCESSO;
			currentProcesso = (TrabalhadoresProcesso) node.getUserObject();
		}
		else if( node.getUserObject() instanceof TrabalhadoresConsultas )
		{
			action = SELECT_CONSULTA;
			currentConsulta = (TrabalhadoresConsultas) node.getUserObject();
		}
		else if( node.getUserObject() instanceof TrabalhadoresConsultasDatas )
		{
			action = SELECT_CONSULTA_MARCACAO;
			currentConsultaMarcacao = (TrabalhadoresConsultasDatas) node.getUserObject();
		}
		else if( node.getUserObject() instanceof TrabalhadoresConsultasDatasObservacoes )
		{
			action = SELECT_CONSULTA_MARCACAO_OBSERVACAO;
			currentConsultaMarcacaoObservacao = (TrabalhadoresConsultasDatasObservacoes) node.getUserObject();
		}
		else if( node.getUserObject() instanceof TrabalhadoresConsultasDatasEmails )
		{
			action = SELECT_CONSULTA_MARCACAO_EMAIL;
			currentConsultaMarcacaoEmail = (TrabalhadoresConsultasDatasEmails) node.getUserObject();
		}
		else if( node.getUserObject() instanceof TrabalhadoresEcds )
		{
			action = SELECT_EXAME;
			currentExame = (TrabalhadoresEcds) node.getUserObject();
		}
		else if( node.getUserObject() instanceof TrabalhadoresEcdsDatas )
		{
			action = SELECT_EXAME_MARCACAO;
			currentExameMarcacao = (TrabalhadoresEcdsDatas) node.getUserObject();
		}
		else if( node.getUserObject() instanceof TrabalhadoresEcdsDatasEmails )
		{
			action = SELECT_EXAME_MARCACAO_EMAIL;
			currentExameMarcacaoEmail = (TrabalhadoresEcdsDatasEmails) node.getUserObject();
		}
		else if( node.getUserObject() instanceof TrabalhadoresEcdsDatasObservacoes )
		{
			action = SELECT_EXAME_MARCACAO_OBSERVACAO;
			currentExameMarcacaoObservacao = (TrabalhadoresEcdsDatasObservacoes) node.getUserObject();
		}
		else if( node instanceof FichaAptidaoMutableTreeNode )
		{
			action = SELECT_FICHA;
			currentFicha = (FichaAptidaoMutableTreeNode) node.getUserObject();
		}
		runAction( action, node.getUserObject() );
		return node;
	}

	@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_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 );
		runActionLater( SAVE_PROCESSO );
		return currentProcesso;
	}

	@LeafLogicActionBinding(actions = {
			SAVE_PROCESSO, 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=ACTION_CANCEL)
	public void abortAction()
	{
		provider.rollback();
		runAction( LOAD_TRABALHADOR );
		runAction( SELECT_TRABALHADOR );
	}
	
	private Prestadores getPrestador(boolean consulta)
	{
		if(currentTrabalhador != null && currentTrabalhador.getToEstabelecimentos() != null)
		{
			return consulta ? currentTrabalhador.getToEstabelecimentos().getToPrestadores() : currentTrabalhador.getToEstabelecimentos().getToPrestadores1();
		}
		return null;
	}
	
	private Prestadores getAnalisador()
	{
		return getPrestador( false );
	}

}
