/*
* TrabalhadoresEcdsData.java
*
* Generated by com.evutils.codegen.EntityObjectGenerator
*
* Edit at will
*/
package siprp.data.outer;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import siprp.MedicinaConstants;

import com.evolute.adt.OrderedMap;


public final class TrabalhadoresEcdsData extends siprp.data.inner.TrabalhadoresEcds implements MedicinaConstants
{

	public TrabalhadoresEcdsData()
	{
		super();
	}
	public String getDataString()
	{
		return getData() == null ? "(sem data definida)" : DATE_FORMAT.format( getData() );
	}

	public String getEstadoString()
	{
		return isNew() ? isNewMessage : (getEstado() == null || getEstado() >= ESTADOS_EXAME_STR.length ? "" : ESTADOS_EXAME_STR[getEstado()]);
	}

	public HashMap<Integer, String> getEstados()
	{
		HashMap<Integer, String> result = new HashMap<Integer, String>();
		for( int i = 0; i < ESTADOS_EXAME_STR.length; ++i )
		{
			if( ESTADOS_EXAME_STR[i] != null )
			{
				result.put( new Integer( i ), ESTADOS_EXAME_STR[i] );
			}
		}
		return result;
	}

	@Override
	public String toString()
	{
		return getDataString() + ": " + getEstadoString();
	}

	public OrderedMap<PrtGruposProtocoloData> getGruposExamesForPerfil()
	{
		OrderedMap<PrtGruposProtocoloData> grupos = new OrderedMap<PrtGruposProtocoloData>();
		
		TrabalhadoresData trabalhador = this.toTrabalhador_id();
		Integer perfil = trabalhador.getPerfil();
		if( perfil != null )
		{
			EmpresasData empresa = trabalhador.toEstabelecimento_id().toEmpresa_id();
			List<PrtElementosProtocoloData> ecdsPerfil = empresa.fromPrtElementosProtocolo_empresa_id();
			for( PrtElementosProtocoloData ecdPerfil : ecdsPerfil )
			{
				if( perfil.equals( ecdPerfil.getNumero_perfil() ) )
				{
					PrtTiposElementosProtocoloData ecd = ecdPerfil.toTipo_elemento_protocolo_id();
					if( ecd != null )
					{
						PrtGruposProtocoloData grupoEcd = ecd.toGrupo_protocolo_id();
						if( grupoEcd != null )
						{
							String descricao = grupoEcd.getDescricao();
							if( descricao != null && !grupos.containsKey( grupoEcd ) )
							{
								grupos.putLast( grupoEcd, descricao );
								Integer estado = getEstadoForGrupoEcd( grupoEcd );
								grupos.putLast( grupoEcd, estado != null ? MedicinaConstants.ESTADOS_EXAME_STR[estado] : " " );
							}
						}
					}
				}
			}
		}
		List<Integer> estados = new ArrayList<Integer>();
		List<TrabalhadoresEcdsDatasData> marcacoes = fromTrabalhadoresEcdsDatas_trabalhadores_ecds_id();
		if( marcacoes != null )
		{
			for( TrabalhadoresEcdsDatasData marcacao : marcacoes )
			{
				Integer estado = marcacao.getEstado();
				if( !estados.contains( estado ) )
				{
					estados.add( estado );
				}
			}
		}
		if( estados.size() == 1 )
		{
//			if( estadosSoFar.contains( new Integer( ESTADO_ANULADO ) ) || estadosSoFar.contains( new Integer( ESTADO_REALIZADO ) ) )
//			{
			setEstado( estados.get( 0 ) );
//			}
//			else if( estadosSoFar.contains( new Integer( ESTADO_POR_REALIZAR ) ) )
//			{
//				setEstado( ESTADO_POR_REALIZAR );
//			}
//			else
//			{
//				setEstado( ESTADO_POR_MARCAR );
//			}
		}
		else if( estados.size() == 2 )
		{
			if( estados.contains( new Integer( ESTADO_ANULADO ) ) && estados.contains( new Integer( ESTADO_REALIZADO ) ) )
			{
				setEstado( ESTADO_REALIZADO );
			}
			else if( estados.contains( new Integer( ESTADO_POR_MARCAR ) ) )
			{
				setEstado( ESTADO_POR_MARCAR );
			}
			else if( estados.contains( new Integer( ESTADO_ANULADO ) ) || estados.contains( new Integer( ESTADO_REALIZADO ) ) )
			{
				setEstado( ESTADO_PARCIALMENTE_REALIZADO );
			}
			else
			{
				setEstado( ESTADO_POR_REALIZAR );
			}
		}
		else
		{
			if( estados.contains( new Integer( ESTADO_POR_MARCAR ) ) )
			{
				setEstado( ESTADO_POR_MARCAR );
			}
			else if( estados.contains( new Integer( ESTADO_ANULADO ) ) && estados.contains( new Integer( ESTADO_REALIZADO ) ) )
			{
				setEstado( ESTADO_PARCIALMENTE_REALIZADO );
			}
			else
			{
				setEstado( ESTADO_POR_REALIZAR );
			}
		}
		grupos.order();
		return grupos;
	}

	private Integer getEstadoForGrupoEcd( PrtGruposProtocoloData grupoEcd )
	{
		Integer estado = null;
		List<TrabalhadoresEcdsDatasData> marcacoes = fromTrabalhadoresEcdsDatas_trabalhadores_ecds_id();
		if( marcacoes != null )
		{
			for( TrabalhadoresEcdsDatasData marcacao : marcacoes )
			{
				List<TrabalhadoresEcdData> ecds = marcacao.fromTrabalhadoresEcd_trabalhadores_ecds_datas_id();
				for( TrabalhadoresEcdData ecd : ecds )
				{
					if( ecd.toEcd_id().toGrupo_protocolo_id().equals( grupoEcd ) )
					{
						if( new Integer( ESTADO_REALIZADO ).equals( ecd.getEstado() ) || new Integer( ESTADO_ANULADO ).equals( ecd.getEstado() ) )
						{
							return ecd.getEstado();
						}
						else if( new Integer( ESTADO_POR_REALIZAR ).equals( ecd.getEstado() ) )
						{
							estado = ecd.getEstado();
							break;
						}
					}
				}
			}
		}
		return estado == null ? ESTADO_POR_MARCAR : estado;
	}
	
}
