package siprp.database.cayenne.objects;

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

import leaf.data.OrderedMap;
import siprp.MedicinaConstants;
import siprp.database.cayenne.objects.auto._TrabalhadoresEcds;

public class TrabalhadoresEcds extends _TrabalhadoresEcds implements MedicinaConstants
{
	private static final long serialVersionUID = 1L;

	public String getDataString()
	{
		return getData() == null ? "(sem data definida)" : sdf.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<PrtGruposProtocolo> getGruposExamesForPerfil()
	{
		OrderedMap<PrtGruposProtocolo> grupos = new OrderedMap<PrtGruposProtocolo>();
		
		Trabalhadores trabalhador = this.getToTrabalhadores();
		Integer perfil = trabalhador.getPerfil();
		if( perfil != null )
		{
			Empresas empresa = trabalhador.getToEstabelecimentos().getToEmpresas();
			List<PrtElementosProtocolo> ecdsPerfil = (List<PrtElementosProtocolo>) empresa.getPrtElementosProtocoloArray();
			for( PrtElementosProtocolo ecdPerfil : ecdsPerfil )
			{
				if( perfil.equals( ecdPerfil.getNumeroPerfil() ) )
				{
					PrtTiposElementosProtocolo ecd = ecdPerfil.getToPrtTiposElementosProtocolo();
					if( ecd != null )
					{
						PrtGruposProtocolo grupoEcd = ecd.getToPrtGruposProtocolo();
						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<TrabalhadoresEcdsDatas> marcacoes = getTrabalhadoresEcdsDatasArray();
		if( marcacoes != null )
		{
			for( TrabalhadoresEcdsDatas 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( PrtGruposProtocolo grupoEcd )
	{
		Integer estado = null;
		List<TrabalhadoresEcdsDatas> marcacoes = getTrabalhadoresEcdsDatasArray();
		if( marcacoes != null )
		{
			for( TrabalhadoresEcdsDatas marcacao : marcacoes )
			{
				List<TrabalhadoresEcd> ecds = marcacao.getTrabalhadoresEcdArray();
				for( TrabalhadoresEcd ecd : ecds )
				{
					if( ecd.getToPrtTiposElementosProtocolo().getToPrtGruposProtocolo().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;
	}

}
