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

package siprp.data;

import java.text.DateFormat;
import java.util.Calendar;
import java.util.Date;

import siprp.FichaDataProvider;
import siprp.data.outer.AvisosData;
import siprp.data.outer.EmpresasData;
import siprp.data.outer.EstabelecimentosData;
import siprp.data.outer.MarcacoesEmpresaData;
import siprp.data.outer.MarcacoesEstabelecimentoData;
import siprp.data.outer.MarcacoesTrabalhadorData;
import siprp.data.outer.TrabalhadoresData;
import siprp.medicina.MedicinaDataProvider;

import com.evolute.entity.ProviderInterface;
import com.evolute.entity.evo.EvoDataException;
import com.evolute.utils.Singleton;
import com.evolute.utils.tables.ColumnizedObject;
/**
 *
 * @author  fpalma
 */
public abstract class Marcacao extends BaseObject
	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 ProviderInterface JDO;
	
	
	public static Marcacao getMarcacao( int tipo )
	{
		switch( tipo )
		{
			case TIPO_MARCACAO_TRABALHADOR_EXAMES:
				
			case TIPO_MARCACAO_TRABALHADOR_CONSULTA:
				return new MarcacoesTrabalhadorData();
				
			case TIPO_MARCACAO_ESTABELECIMENTO:
				return new MarcacoesEstabelecimentoData();
				
			case TIPO_MARCACAO_EMPRESA:
				return new MarcacoesEmpresaData();
		}
		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 MarcacoesEmpresaData )
//				{
//					return new Boolean( "y".equals( realizada ) );
//				}
//				else
//				{
					
				realizada = "y".equals( realizada ) ? "Sim" : "N\u00e3o";
				return realizada;
//				}
				
			case 2:
				if( this instanceof MarcacoesEmpresaData )
				{
					String textoStr = (String ) get( MarcacoesEmpresaData.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 );
		MarcacoesTrabalhadorData marcacao;
		if( marcacaoID == null )
		{
			marcacao = null;
		}
		else
		{
			if( JDO == null )
			{
				JDO = ( ProviderInterface ) Singleton.getInstance( Singleton.DEFAULT_JDO_PROVIDER );
			}
			marcacao = ( MarcacoesTrabalhadorData ) JDO.load( MarcacoesTrabalhadorData.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 MarcacoesTrabalhadorData();
			if( JDO == null )
			{
				JDO = ( ProviderInterface ) Singleton.getInstance( Singleton.DEFAULT_JDO_PROVIDER );
			}
			TrabalhadoresData trab = (TrabalhadoresData)JDO.load( TrabalhadoresData.class, trabalhadorID );
			marcacao.set( MarcacoesTrabalhadorData.TO_TRABALHADOR_ID, trab );
			marcacao.set( MarcacoesTrabalhadorData.TIPO, new Integer( MarcacoesTrabalhadorData.TIPO_CONSULTA ) );
			marcacao.set( Marcacao.DATA, date );
			marcacao.set( Marcacao.REALIZADA, "n" );
			marcacao.set( MarcacoesTrabalhadorData.ESTADO, new Integer( siprp.medicina.MedicinaDataProvider.ESTADO_POR_REALIZAR ) );
			marcacao.set( MarcacoesTrabalhadorData.MOTIVO, new Integer( 2 ) );
			marcacao.save();
		}
	}
	
	@Override
	public void save() throws EvoDataException
	{
		super.save();
		postSave(this);
	}
	
	@Override
	public void delete() throws EvoDataException
	{
		if( preDelete(this) )
		{
			super.delete();
			postDelete(this);
		}
	}
	
	protected boolean postSave( Marcacao object )
		throws EvoDataException
	{
		boolean result = false;
		try
		{
			if( object instanceof MarcacoesEmpresaData )
			{
				AvisosData aviso = (AvisosData) JDO.load( AvisosData.class, 
					new Object[]{ object.get( MarcacoesEmpresaData.ID ), new Integer( AvisosData.TIPO_EMPRESA ) }, 
					new String[]{ AvisosData.EVENTO_ID, AvisosData.TIPO } );
				if( aviso == null )
				{
					aviso = new AvisosData();
				}
				aviso.setTipo( AvisosData.TIPO_EMPRESA );
				EmpresasData empresa = ((MarcacoesEmpresaData)object).toEmpresa_id();
				aviso.setToEmpresa_id( empresa );
				aviso.set( AvisosData.EVENTO_ID, object.get( MarcacoesEmpresaData.ID ) );
				Date dataEvento = (Date) object.get( Marcacao.DATA );
				aviso.set( AvisosData.DATA_EVENTO, dataEvento );
				aviso.set( AvisosData.DATA_AVISO, dataEvento );
				String descricao = "Tarefa ";
				aviso.set( AvisosData.DESCRICAO, descricao );
				aviso.save();
				
				empresa.save();
			}
			else if( object instanceof MarcacoesEstabelecimentoData )
			{
				AvisosData aviso = (AvisosData) JDO.load( AvisosData.class, 
					new Object[]{ object.get( MarcacoesEstabelecimentoData.ID ), new Integer( AvisosData.TIPO_ESTABELECIMENTO ) }, 
					new String[]{ AvisosData.EVENTO_ID, AvisosData.TIPO } );
				if( aviso == null )
				{
					aviso = new AvisosData();
				}
				aviso.set( AvisosData.TIPO, new Integer( AvisosData.TIPO_ESTABELECIMENTO ) );
				EstabelecimentosData estabelecimento = ((MarcacoesEstabelecimentoData)object).toEstabelecimento_id();
				aviso.setToEstabelecimento_id( estabelecimento );
				EmpresasData empresa = estabelecimento.toEmpresa_id();
				aviso.setToEmpresa_id( empresa );
				aviso.set( AvisosData.EVENTO_ID, object.get( MarcacoesEstabelecimentoData.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( AvisosData.DATA_AVISO, dataAviso );
				aviso.set( AvisosData.DATA_EVENTO, dataEvento );
				String descricao = "Visita ";
				aviso.set( AvisosData.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 MarcacoesTrabalhadorData )
			{
				AvisosData aviso = (AvisosData) JDO.load( AvisosData.class, 
					new Object[]{ object.get( MarcacoesTrabalhadorData.ID ), new Integer( AvisosData.TIPO_TRABALHADOR ) }, 
					new String[]{ AvisosData.EVENTO_ID, AvisosData.TIPO } );
				if( aviso == null )
				{
					aviso = new AvisosData();
				}
				aviso.set( AvisosData.TIPO, new Integer( AvisosData.TIPO_TRABALHADOR ) );
				TrabalhadoresData trab = ((MarcacoesTrabalhadorData)object).toTrabalhador_id();
				aviso.setToTrabalhador_id( trab );
				EstabelecimentosData estabelecimento = trab.toEstabelecimento_id();
				aviso.setToEstabelecimento_id( estabelecimento );
				EmpresasData empresa = estabelecimento.toEmpresa_id();
				aviso.setToEmpresa_id( empresa );
				aviso.set( AvisosData.EVENTO_ID, object.get( MarcacoesTrabalhadorData.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( AvisosData.DATA_AVISO, dataAviso );
				aviso.set( AvisosData.DATA_EVENTO, dataEvento.clone() );
				String descricao = "";
				switch( ( ( Integer ) object.get( MarcacoesTrabalhadorData.TIPO ) ).intValue() )
				{
					case MarcacoesTrabalhadorData.TIPO_EXAMES:
						descricao = "Exames";
						break;
		
					case MarcacoesTrabalhadorData.TIPO_CONSULTA:
						Integer motivo = ( ( Integer ) object.get( MarcacoesTrabalhadorData.MOTIVO ) );
						descricao = "Consulta " + ( motivo == null ? "" : ("(" + MedicinaDataProvider.TIPOS_CONSULTAS[ motivo.intValue() ] + ")" ) );
						break;
				}
				aviso.set( AvisosData.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( AvisosData.DATA_AVISO, dataEvento.clone() );
					}
					aviso.save();
				}
				
				trab.save();
			}
			else
			{
				result = false;
			}
			result = true;
		}
		catch (Exception e)
		{
			throw new EvoDataException( e );
		}
		return result;
	}
	
	protected boolean preDelete( Marcacao object )
		throws EvoDataException
	{
		try
		{
			if( object instanceof MarcacoesTrabalhadorData &&
				( ( Integer ) object.get( MarcacoesTrabalhadorData.TIPO ) ).intValue() == MarcacoesTrabalhadorData.TIPO_EXAMES ) 
			{
				((MedicinaDataProvider)MedicinaDataProvider.getProvider()).deleteDetalhesRealizadosForMarcacao( ( Integer ) object.get( MarcacoesTrabalhadorData.ID ) );
				return true;
			}
		}
		catch (Exception e)
		{
			throw new EvoDataException( e );
		}
		return false;
	}
	
	protected boolean postDelete( Marcacao object )
		throws EvoDataException
	{
		try
		{
			Integer tipo;
			if( object instanceof MarcacoesEmpresaData )
			{
				tipo = new Integer( AvisosData.TIPO_EMPRESA );
			}
			else if( object instanceof MarcacoesEstabelecimentoData )
			{
				tipo = new Integer( AvisosData.TIPO_ESTABELECIMENTO );
			}
			if( object instanceof MarcacoesTrabalhadorData )
			{
				tipo = new Integer( AvisosData.TIPO_TRABALHADOR );
			}
			else
			{
				return false;
			}
			AvisosData aviso = (AvisosData) JDO.load( AvisosData.class, 
				new Object[]{ object.get( "id" ), tipo }, 
				new String[]{ AvisosData.EVENTO_ID, AvisosData.TIPO } );
			if( aviso != null )
			{
				aviso.delete();
			}
			
			return true;
		}
		catch (Exception e)
		{
			throw new EvoDataException( e );
		}
	}
	
}
