package siprp.database.cayenne.providers;

import java.util.List;

import org.apache.cayenne.DataObjectUtils;
import org.apache.cayenne.PersistenceState;
import org.apache.cayenne.exp.ExpressionFactory;
import org.apache.cayenne.query.SelectQuery;

import siprp.database.cayenne.objects.BaseObject;
import siprp.database.cayenne.objects.Empresas;
import siprp.database.cayenne.objects.Prestadores;
import siprp.database.cayenne.objects.PrtGruposProtocolo;
import siprp.database.cayenne.objects.Trabalhadores;
import siprp.database.cayenne.objects.TrabalhadoresProcesso;
import siprp.medicina.processo.ProcessoConstants;

public class MedicinaDAO extends MainDAO
{
//	private static final String defaultPrestadorName = "SIPRP";
	private Prestadores defaultPrestador = null;

	public Trabalhadores getTrabalhadorByID( Integer id )
	{
		return (Trabalhadores) DataObjectUtils.objectForPK( context, Trabalhadores.class, id );
	}

	public List<Empresas> getAllEmpresas()
	{
		SelectQuery query = new SelectQuery( Empresas.class );
		query.andQualifier( ExpressionFactory.noMatchExp( Empresas.INACTIVO_PROPERTY, "y" ) );
		query.addOrdering( Empresas.DESIGNACAO_SOCIAL_PLAIN_PROPERTY, true );
		List<Empresas> allEmpresas = context.performQuery( query );
		return allEmpresas;
	}
	
	public List<Prestadores> getAllPrestadores()
	{
		SelectQuery query = new SelectQuery( Prestadores.class );
		query.andQualifier( ExpressionFactory.matchExp( Prestadores.ACTIVO_PROPERTY, "y" ) );
		query.addOrdering( Prestadores.NOME_PROPERTY, true );
		List<Prestadores> allPrestadores = context.performQuery( query );
		return allPrestadores;
	}
	
	public List<PrtGruposProtocolo> getAllPrtGruposProtocolo()
	{
		SelectQuery query = new SelectQuery( PrtGruposProtocolo.class );
		query.addOrdering( PrtGruposProtocolo.DESCRICAO_PLAIN_PROPERTY, true );
		List<PrtGruposProtocolo> allPrtGruposProtocolo= context.performQuery( query );
		return allPrtGruposProtocolo;
	}

	public BaseObject saveObject( BaseObject object )
	{
		if( object != null )
		{
			if( object.getPersistenceState() ==  PersistenceState.NEW )
			{
				context.registerNewObject( object );
			}
			context.commitChanges();
		}
		return object;
	}
	
	public void rollback()
	{
		context.rollbackChanges();
		context.unregisterObjects( context.uncommittedObjects() );
		context.deleteObjects( context.newObjects() );
	}

	public void fecharProcesso( TrabalhadoresProcesso currentProcesso )
	{
		currentProcesso.setEstado( ProcessoConstants.PROCESSO_FECHADO_CODE );
		context.commitChanges();
	}

	public Prestadores getDefaultPrestador()
	{
		if(defaultPrestador == null)
		{
			getAllPrestadores();
		}
		return defaultPrestador;
	}

}
