/*
* MarcacaoSaveAndDeleteHandler.java
 *
 * Created on 13 de Outubro de 2004, 18:31
 */

package siprp.data;

import java.util.*;

import com.evolute.utils.*;
import com.evolute.utils.jdo.*;

import siprp.medicina.*;

/**
 *
 * @author  fpalma
 */
public class MarcacaoSaveAndDeleteHandler
	implements JDOOperationHandlerInterface
{
	public static final MarcacaoSaveAndDeleteHandler INSTANCE = new MarcacaoSaveAndDeleteHandler();
	
	public JDOProvider JDO;
	protected MedicinaDataProvider medicinaProvider;
	
	/** Creates a new instance of MarcacaoSaveAndDeleteHandler */
	public MarcacaoSaveAndDeleteHandler()
	{
		JDO = ( JDOProvider ) Singleton.getInstance( Singleton.DEFAULT_JDO_PROVIDER );
	}
	
	public boolean handle( JDOObject object, int operation, int moment )
		throws Exception
	{
		if( JDO == null )
		{
			JDO = ( JDOProvider ) Singleton.getInstance( Singleton.DEFAULT_JDO_PROVIDER );
		}
		switch( operation )
		{
			case JDOOperationHandlerInterface.OP_SAVE:
				switch( moment )
				{
					case JDOOperationHandlerInterface.MOMENT_BEFORE:
						return preSave( (Marcacao) object );
						
					case JDOOperationHandlerInterface.MOMENT_AFTER:
						return postSave( (Marcacao) object );
				}
				return false;
				
			case JDOOperationHandlerInterface.OP_DELETE:
				switch( moment )
				{
					case JDOOperationHandlerInterface.MOMENT_BEFORE:
						return preDelete( (Marcacao) object );
						
					case JDOOperationHandlerInterface.MOMENT_AFTER:
						return postDelete( (Marcacao) object );
				}
				return false;
		}
		return false;
	}
	
	protected boolean preSave( Marcacao object )
		throws Exception
	{
		return false;
	}
	
	protected boolean postSave( Marcacao object )
		throws Exception
	{
		if( object instanceof MarcacaoEmpresaData )
		{
			AvisoData aviso = (AvisoData) JDO.load( AvisoData.class, 
				new Object[]{ object.get( MarcacaoEmpresaData.ID ), new Integer( AvisoData.TIPO_EMPRESA ) }, 
				new String[]{ AvisoData.EVENTO_ID, AvisoData.TIPO } );
			if( aviso == null )
			{
				aviso = new AvisoData();
			}
			aviso.set( AvisoData.TIPO, new Integer( AvisoData.TIPO_EMPRESA ) );
			EmpresaData empresa = ( EmpresaData ) object.get( MarcacaoEmpresaData.EMPRESA );
			aviso.set( AvisoData.EMPRESA, empresa );
			aviso.set( AvisoData.EVENTO_ID, object.get( MarcacaoEmpresaData.ID ) );
			Date dataEvento = (Date) object.get( Marcacao.DATA );
			aviso.set( AvisoData.DATA_EVENTO, dataEvento );
			aviso.set( AvisoData.DATA_AVISO, dataEvento );
			String descricao = "Tarefa ";
			aviso.set( AvisoData.DESCRICAO, descricao );
			aviso.save();
			
			empresa.save();
		}
		else if( object instanceof MarcacaoEstabelecimentoData )
		{
			AvisoData aviso = (AvisoData) JDO.load( AvisoData.class, 
				new Object[]{ object.get( MarcacaoEstabelecimentoData.ID ), new Integer( AvisoData.TIPO_ESTABELECIMENTO ) }, 
				new String[]{ AvisoData.EVENTO_ID, AvisoData.TIPO } );
			if( aviso == null )
			{
				aviso = new AvisoData();
			}
			aviso.set( AvisoData.TIPO, new Integer( AvisoData.TIPO_ESTABELECIMENTO ) );
			EstabelecimentoData estabelecimento = ( EstabelecimentoData ) object.get( MarcacaoEstabelecimentoData.ESTABELECIMENTO );
			aviso.set( AvisoData.ESTABELECIMENTO, estabelecimento );
			EmpresaData empresa = ( EmpresaData )estabelecimento.get( EstabelecimentoData.EMPRESA );
			aviso.set( AvisoData.EMPRESA, empresa );
			aviso.set( AvisoData.EVENTO_ID, object.get( MarcacaoEstabelecimentoData.ID ) );
			Date dataEvento = (Date) object.get( Marcacao.DATA );
			Date dataAviso = new Date( dataEvento.getTime() );
			Calendar cal = Calendar.getInstance();
			cal.setTime( dataAviso );
			cal.add( Calendar.DAY_OF_MONTH, -14 );
			dataAviso = cal.getTime();
			aviso.set( AvisoData.DATA_AVISO, dataAviso );
			aviso.set( AvisoData.DATA_EVENTO, dataEvento );
			String descricao = "Visita ";
			aviso.set( AvisoData.DESCRICAO, descricao );
			cal = Calendar.getInstance();
			cal.setTime( dataEvento );
			cal.set( cal.get( Calendar.YEAR ), cal.get( Calendar.MONTH ), cal.get( Calendar.DAY_OF_MONTH ), 0, 0, 0 );
			cal.set( Calendar.MILLISECOND, 0 );
			dataEvento = cal.getTime();

			cal = Calendar.getInstance();
			cal.set( cal.get( Calendar.YEAR ), cal.get( Calendar.MONTH ), cal.get( Calendar.DAY_OF_MONTH ), 10, 0, 0 );
			cal.set( Calendar.MILLISECOND, 0 );
			Date hoje = cal.getTime();
			if( hoje.before( dataEvento ) )
			{
				aviso.save();
			}
			
			estabelecimento.save();
		}
		if( object instanceof MarcacaoTrabalhadorData )
		{
			AvisoData aviso = (AvisoData) JDO.load( AvisoData.class, 
				new Object[]{ object.get( MarcacaoTrabalhadorData.ID ), new Integer( AvisoData.TIPO_TRABALHADOR ) }, 
				new String[]{ AvisoData.EVENTO_ID, AvisoData.TIPO } );
	System.out.println( "AVISO LOADED: " + aviso + " id: " + ( aviso != null ? aviso.get( AvisoData.ID ) : "n/a" )
						+ " MT.ID: " + object.get( MarcacaoTrabalhadorData.ID )
						+ " AD.TIPO: " + new Integer( AvisoData.TIPO_TRABALHADOR ) );
			if( aviso == null )
			{
	System.out.println( "novo aviso" );
				aviso = new AvisoData();
			}
			aviso.set( AvisoData.TIPO, new Integer( AvisoData.TIPO_TRABALHADOR ) );
			TrabalhadorData trab = ( TrabalhadorData ) object.get( MarcacaoTrabalhadorData.TRABALHADOR );
			aviso.set( AvisoData.TRABALHADOR, trab );
			EstabelecimentoData estabelecimento = ( EstabelecimentoData ) trab.get( TrabalhadorData.ESTABELECIMENTO );
			aviso.set( AvisoData.ESTABELECIMENTO, estabelecimento );
			EmpresaData empresa = ( EmpresaData ) estabelecimento.get( EstabelecimentoData.EMPRESA );
			aviso.set( AvisoData.EMPRESA, empresa );
			aviso.set( AvisoData.EVENTO_ID, object.get( MarcacaoTrabalhadorData.ID ) );
			Date dataEvento = (Date) object.get( Marcacao.DATA );
			Date dataAviso = new Date( dataEvento.getTime() );
			Calendar cal = Calendar.getInstance();
			cal.setTime( dataAviso );
			cal.add( Calendar.DAY_OF_MONTH, -14 );
			dataAviso = cal.getTime();
			aviso.set( AvisoData.DATA_AVISO, dataAviso );
			aviso.set( AvisoData.DATA_EVENTO, dataEvento.clone() );
			String descricao = "";
			switch( ( ( Integer ) object.get( MarcacaoTrabalhadorData.TIPO ) ).intValue() )
			{
				case MarcacaoTrabalhadorData.TIPO_EXAMES:
					descricao = "Exames";
					break;

				case MarcacaoTrabalhadorData.TIPO_CONSULTA:
					Integer motivo = ( ( Integer ) object.get( MarcacaoTrabalhadorData.MOTIVO ) );
					descricao = "Consulta " + ( motivo == null ? "" : ("(" + MedicinaDataProvider.TIPOS_CONSULTAS[ motivo.intValue() ] + ")" ) );
					break;
			}
			aviso.set( AvisoData.DESCRICAO, descricao );
			cal = Calendar.getInstance();
			cal.setTime( dataEvento );
			cal.set( cal.get( Calendar.YEAR ), cal.get( Calendar.MONTH ), cal.get( Calendar.DAY_OF_MONTH ), 0, 0, 0 );
			cal.set( Calendar.MILLISECOND, 0 );
			dataEvento = cal.getTime();

			cal = Calendar.getInstance();
			cal.set( cal.get( Calendar.YEAR ), cal.get( Calendar.MONTH ), cal.get( Calendar.DAY_OF_MONTH ), 10, 0, 0 );
			cal.set( Calendar.MILLISECOND, 0 );
			Date hoje = cal.getTime();
			if( hoje.before( dataEvento ) )
			{
				if( !hoje.before( dataAviso ) )
				{
					aviso.set( AvisoData.DATA_AVISO, dataEvento.clone() );
				}
				aviso.save();
			}
			
			trab.save();
		}
		else
		{
			return false;
		}
		return true;
	}
	
	protected boolean preDelete( Marcacao object )
		throws Exception
	{
		if( object instanceof MarcacaoTrabalhadorData &&
			( ( Integer ) object.get( MarcacaoTrabalhadorData.TIPO ) ).intValue() == MarcacaoTrabalhadorData.TIPO_EXAMES ) 
		{
			if( medicinaProvider == null )
			{
				medicinaProvider = (MedicinaDataProvider)MedicinaDataProvider.getProvider();
			}
			medicinaProvider.deleteDetalhesRealizadosForMarcacao( ( Integer ) object.get( MarcacaoTrabalhadorData.ID ) );
			return true;
		}
		return false;
	}
	
	protected boolean postDelete( Marcacao object )
		throws Exception
	{
System.out.println( "!delete!" );
		Integer tipo;
		if( object instanceof MarcacaoEmpresaData )
		{
			tipo = new Integer( AvisoData.TIPO_EMPRESA );
		}
		else if( object instanceof MarcacaoEstabelecimentoData )
		{
			tipo = new Integer( AvisoData.TIPO_ESTABELECIMENTO );
		}
		if( object instanceof MarcacaoTrabalhadorData )
		{
			tipo = new Integer( AvisoData.TIPO_TRABALHADOR );
		}
		else
		{
			return false;
		}
		AvisoData aviso = (AvisoData) JDO.load( AvisoData.class, 
			new Object[]{ object.get( "id" ), tipo }, 
			new String[]{ AvisoData.EVENTO_ID, AvisoData.TIPO } );
		if( aviso != null )
		{
			aviso.delete();
		}
		
		return true;
	}
}
