/*
 * TratarMarcacaoTrabalhadorAction.java
 *
 * Created on January 31, 2007, 6:21 PM
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package siprp.lembretes.remarcacoes.actions;

import com.evolute.utils.Singleton;
import com.evolute.utils.data.IDObject;
import com.evolute.utils.jdo.JDOProvider;
import com.evolute.utils.ui.DialogException;

import java.awt.Component;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.JOptionPane;
import siprp.SIPRPTracker;
import siprp.SingletonConstants;
import siprp.data.EmpresaData;
import siprp.data.EstabelecimentoData;
import siprp.data.MarcacaoTrabalhadorData;
import siprp.data.TrabalhadorData;
import siprp.database.cayenne.objects.Empresas;
import siprp.database.cayenne.objects.Estabelecimentos;
import siprp.database.cayenne.objects.Trabalhadores;
import siprp.database.cayenne.objects.TrabalhadoresConsultas;
import siprp.database.cayenne.objects.TrabalhadoresConsultasDatas;
import siprp.database.cayenne.objects.TrabalhadoresEcds;
import siprp.database.cayenne.objects.TrabalhadoresEcdsDatas;
import siprp.database.cayenne.objects.TrabalhadoresProcesso;
import siprp.database.cayenne.providers.MedicinaDAO;
import siprp.lembretes.Lembrete;
import siprp.lembretes.LembretesDataProvider;
import siprp.medicina.processo.data.TrabalhadoresConsultasData;
import siprp.medicina.processo.logic.MedicinaProcessoLogic;
import siprp.medicina.processo.ui.MedicinaProcessoWindow;

/**
 *
 * @author fpalma
 */
public class TratarMarcacaoTrabalhadorAction extends AbstractAction
{
	private LembretesDataProvider lembretesProvider;
	private JDOProvider JDO;
	private SIPRPTracker tracker;
	
	private Integer lembreteID;
	
	private MedicinaDAO medicinaDAO = new MedicinaDAO();
	
	/**
	 * Creates a new instance of TratarMarcacaoTrabalhadorAction
	 */
	public TratarMarcacaoTrabalhadorAction( IDObject lembrete )
	{
		super( "Tratar" );
		try
		{
			lembreteID = lembrete.getID();
			lembretesProvider = LembretesDataProvider.getProvider();
			JDO = (JDOProvider) Singleton.getInstance( Singleton.DEFAULT_JDO_PROVIDER );
		}
		catch( Exception ex )
		{
			ex.printStackTrace();
		}
	}

	public void actionPerformed(ActionEvent e)
	{
		try
		{
			tracker = ( SIPRPTracker ) Singleton.getInstance( SingletonConstants.SIPRP_TRACKER );
			Lembrete lembrete = lembretesProvider.getLembreteByID( lembreteID );
			if( lembrete == null )
			{
				JOptionPane.showMessageDialog( null, "Este lembrete j\u00e1 foi tratado.", "J\u00e1 tratado",
					JOptionPane.WARNING_MESSAGE );
			}
			else
			{
				if( lembrete.getMarcacaoTrabalhadorID() != null )
				{
					// old model
					MarcacaoTrabalhadorData marcacao = ( MarcacaoTrabalhadorData ) JDO.load( MarcacaoTrabalhadorData.class, lembrete.getMarcacaoTrabalhadorID() );
					TrabalhadorData trabalhador = ( TrabalhadorData ) marcacao.get( MarcacaoTrabalhadorData.TRABALHADOR );
					EstabelecimentoData estabelecimento = ( EstabelecimentoData ) trabalhador.get( TrabalhadorData.ESTABELECIMENTO );
					EmpresaData empresa = ( EmpresaData ) estabelecimento.get( EstabelecimentoData.EMPRESA );
					
					lembretesProvider.apagarLembreteByID( lembreteID );
					setEnabled( false );
					tracker.getMedicinaWindow().setVisible( true );
					tracker.getMedicinaWindow().setEmpresaAndEstabelecimentoAndTrabalhador( (Integer) empresa.get( EmpresaData.ID ),
															( Integer ) estabelecimento.get( EstabelecimentoData.ID ),
															( Integer ) trabalhador.get( TrabalhadorData.ID ) );
				}
				else
				{
					// new model
					Integer consultaID = lembrete.getConsultaDataID();
					Integer exameID = lembrete.getExameDataID();
					TrabalhadoresConsultasDatas consultaMarcacao = null;
					TrabalhadoresConsultas consulta = null;
					TrabalhadoresEcdsDatas exameMarcacao = null;
					TrabalhadoresEcds exame = null;
					TrabalhadoresProcesso processo = null;
					Trabalhadores trabalhador = null;
					Estabelecimentos estabelecimento = null;
					Empresas empresa = null;
					if( consultaID != null )
					{
						consultaMarcacao = medicinaDAO.getConsultaMarcacaoByID( consultaID );
						consulta = consultaMarcacao.getToTrabalhadoresConsultas();
						processo = consulta.getToTrabalhadoresProcesso();
					}
					else if( exameID != null )
					{
						exameMarcacao = medicinaDAO.getExameMarcacaoByID( exameID );
						exame = exameMarcacao.getToTrabalhadoresEcds();
						processo = exame.getToTrabalhadoresProcesso();
					}
					trabalhador = processo.getToTrabalhadores();
					estabelecimento = trabalhador.getToEstabelecimentos();
					empresa = estabelecimento.getToEmpresas();
					MedicinaProcessoWindow window = tracker.getMedicinaProcessoWindow();
					
					window.runActionLater( MedicinaProcessoLogic.SELECT_EMPRESA, empresa );
					window.runActionLater( MedicinaProcessoLogic.SELECT_ESTABELECIMENTO, estabelecimento );
					window.runActionLater( MedicinaProcessoLogic.LOAD_TRABALHADOR, trabalhador );
					window.runActionLater( MedicinaProcessoLogic.SELECT_TRABALHADOR, trabalhador );
					window.runActionLater( MedicinaProcessoLogic.SELECT_PROCESSO, processo );
					window.runActionLater( consulta == null ? MedicinaProcessoLogic.SELECT_EXAME : MedicinaProcessoLogic.SELECT_CONSULTA, consulta == null ? exame : consulta );
					window.runActionLater( consulta == null ? MedicinaProcessoLogic.CREATE_EXAME_MARCACAO : MedicinaProcessoLogic.CREATE_CONSULTA_MARCACAO, null );
					window.runPendingActions();
					window.setVisible( true );
					lembretesProvider.apagarLembreteByID( lembreteID );
				}
			}
			Object source = e.getSource();
			if( source instanceof Component )
			{
				((Component) source).setEnabled( false );
			}
		}
		catch( Exception ex )
		{
			DialogException.showExceptionMessage( ex, "Erro a tratar", true );
		}
	}
	
}
