/*
 * Marcacao.java
 *
 * Created on 21 de Maio de 2004, 16:59
 */

package siprp.data;

import java.text.*;
import java.util.*;

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

import siprp.*;
/**
 *
 * @author  fpalma
 */
public abstract class Marcacao extends JDOObject
	implements ColumnizedObject
	//, JDOOperationHandlerInterface
{
	public static final int TIPO_MARCACAO_TRABALHADOR_EXAMES = 0;
	public static final int TIPO_MARCACAO_TRABALHADOR_CONSULTA = 1;
	public static final int TIPO_MARCACAO_ESTABELECIMENTO = 2;
	public static final int TIPO_MARCACAO_EMPRESA = 3;
	
	public static final int ESTADO_POR_REALIZAR = 0;
	public static final int ESTADO_PARCIALMENTE_REALIZADA = 1;
	public static final int ESTADO_REALIZADA = 2;
	public static final int ESTADO_DESMARCADA_TRABALHADOR = 3;
	public static final int ESTADO_DESMARCADA_SHST = 4;
	public static final int ESTADO_FALTOU = 5;
	
	public static final String DATA = "data";
	public static final String REALIZADA = "realizada";
	public static final String DATA_EMAIL = "data_email";
	public static final String DATA_RELATORIO = "data_relatorio";
	public static final String ANTECEDENCIA_AVISO = "antecedencia_aviso";
	
	protected static final DateFormat DATE_FORMAT = DateFormat.getDateInstance( DateFormat.SHORT );
	protected static JDOProvider JDO;
	
	
	public static Marcacao getMarcacao( int tipo )
	{
		switch( tipo )
		{
			case TIPO_MARCACAO_TRABALHADOR_EXAMES: case TIPO_MARCACAO_TRABALHADOR_CONSULTA:
				return new MarcacaoTrabalhadorData();
				
			case TIPO_MARCACAO_ESTABELECIMENTO:
				return new MarcacaoEstabelecimentoData();
				
			case TIPO_MARCACAO_EMPRESA:
				return new MarcacaoEmpresaData();
		}
		return null;
	}
	
	public Object getValue( int col )
	{
		switch( col )
		{
			case 0:
				Date data = (Date) get( DATA );
				String dataStr = DATE_FORMAT.format( data );
				return dataStr;
				
			case 1:
				String realizada = (String) get( REALIZADA );
//				if( this instanceof MarcacaoEmpresaData )
//				{
//					return new Boolean( "y".equals( realizada ) );
//				}
//				else
//				{
					
				realizada = "y".equals( realizada ) ? "Sim" : "N\u00e3o";
				return realizada;
//				}
				
			case 2:
				if( this instanceof MarcacaoEmpresaData )
				{
					String textoStr = (String ) get( MarcacaoEmpresaData.TEXTO );
					if( textoStr == null )
					{
						textoStr = "";
					}
					textoStr = textoStr.trim();
					int index = textoStr.indexOf( "\n" );
					if( index != -1 )
					{
						textoStr = textoStr.substring( 0, index );
					}
					return textoStr;
				}
				else
				{
					Date dataRelatorio = (Date) get( DATA_RELATORIO );
					String dataRelatorioStr = ( dataRelatorio != null ? DATE_FORMAT.format( dataRelatorio ) : "" );
					return dataRelatorioStr;
				}
				
			default:
				return null;
		}
	}
	
	public static void saveMarcacaoConsultaForTrabalhadorID( Integer trabalhadorID, Date date )
		throws Exception
	{
		if( date != null )
		{
			date = (Date)date.clone();
		}
		FichaDataProvider provider = (FichaDataProvider) FichaDataProvider.getProvider();
		if( trabalhadorID == null )
		{
			return;
		}
		Integer marcacaoID = provider.getMarcacaoIDByTrabalhador( trabalhadorID );
		MarcacaoTrabalhadorData marcacao;
		if( marcacaoID == null )
		{
			marcacao = null;
		}
		else
		{
			if( JDO == null )
			{
				JDO = ( JDOProvider ) Singleton.getInstance( Singleton.DEFAULT_JDO_PROVIDER );
			}
			marcacao = ( MarcacaoTrabalhadorData ) JDO.load( MarcacaoTrabalhadorData.class, marcacaoID );
		}
		if( date == null && marcacao != null )
		{
			marcacao.delete();
		}
		else if( date != null && marcacao != null )
		{
			marcacao.set( Marcacao.DATA, date );
			marcacao.save();
		}
		else if( date != null && marcacao == null )
		{
			marcacao = new MarcacaoTrabalhadorData();
			if( JDO == null )
			{
				JDO = ( JDOProvider ) Singleton.getInstance( Singleton.DEFAULT_JDO_PROVIDER );
			}
			TrabalhadorData trab = (TrabalhadorData)JDO.load( TrabalhadorData.class, trabalhadorID );
			marcacao.set( MarcacaoTrabalhadorData.TRABALHADOR, trab );
			marcacao.set( MarcacaoTrabalhadorData.TIPO, new Integer( MarcacaoTrabalhadorData.TIPO_CONSULTA ) );
			marcacao.set( Marcacao.DATA, date );
			marcacao.set( Marcacao.REALIZADA, "n" );
			marcacao.set( MarcacaoTrabalhadorData.ESTADO, new Integer( siprp.medicina.MedicinaDataProvider.ESTADO_POR_REALIZAR ) );
			marcacao.set( MarcacaoTrabalhadorData.MOTIVO, new Integer( 2 ) );
			marcacao.save();
		}
	}
//	
//	public boolean handle( JDOObject object, int operation, int moment )
//		throws Exception
//	{
//		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) load( AvisoData.class, new 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( DATA );
//			aviso.set( AvisoData.DATA_EVENTO, dataEvento );
//			aviso.set( AvisoData.DATA_AVISO, dataEvento );
//			String descricao = "Tarefa ";
//			aviso.set( AvisoData.DESCRICAO, descricao );
//			aviso.save();
//		}
//		else if( object instanceof MarcacaoEstabelecimentoData )
//		{
//			AvisoData aviso = (AvisoData) load( AvisoData.class, new 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( 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();
//			}
//		}
//		if( object instanceof MarcacaoTrabalhadorData )
//		{
//			AvisoData aviso = (AvisoData) load( AvisoData.class, new Object[]{ object.get( MarcacaoTrabalhadorData.ID ), new Integer( AvisoData.TIPO_TRABALHADOR ) }, new String[]{ AvisoData.EVENTO_ID, AvisoData.TIPO } );
//			if( aviso == null )
//			{
//				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( 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 = "";
//			switch( ( ( Integer ) object.get( MarcacaoTrabalhadorData.TIPO ) ).intValue() )
//			{
//				case MarcacaoTrabalhadorData.TIPO_EXAMES:
//					descricao = "Exames ";
//					break;
//
//				case MarcacaoTrabalhadorData.TIPO_CONSULTA:
//					descricao = "Consulta ";
//					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 ) )
//			{
//				aviso.save();
//			}
//		}
//		else
//		{
//			return false;
//		}
//		return true;
//	}
//	
//	protected boolean preDelete( Marcacao object )
//		throws Exception
//	{
//		return false;
//	}
//	
//	protected boolean postDelete( Marcacao object )
//		throws Exception
//	{
//		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) load( AvisoData.class, new Object[]{ object.get( "id" ), tipo }, new String[]{ AvisoData.EVENTO_ID, AvisoData.TIPO } );
//		if( aviso != null )
//		{
//			aviso.delete();
//		}
//		
//		return true;
//	}
}
