package siprp.database.cayenne.providers;

import java.util.List;
import java.util.Vector;

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.Estabelecimentos;
import siprp.database.cayenne.objects.Trabalhadores;
import siprp.database.cayenne.objects.TrabalhadoresProcesso;
import siprp.medicina.processo.ProcessoConstants;

import com.evolute.utils.tables.ColumnizedMappable;

public class MedicinaDAO extends MainDAO
{

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

	public Vector<ColumnizedMappable> getAllEmpresas()
	{
		Vector<ColumnizedMappable> result = new Vector<ColumnizedMappable>();
		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 );
		for( Empresas currentEmpresa : allEmpresas )
		{
			Integer id = currentEmpresa.getId();
			String designacao = currentEmpresa.getDesignacaoSocialPlain().toUpperCase();
			result.add( new ColumnizedMappable( id, designacao ) );
		}
		return result;
	}

	public Vector<ColumnizedMappable> getEstabelecimentosForEmpresa( Integer empresaID )
	{
		Vector<ColumnizedMappable> result = new Vector<ColumnizedMappable>();
		SelectQuery query = new SelectQuery( Estabelecimentos.class, ExpressionFactory.matchExp( Estabelecimentos.TO_EMPRESAS_PROPERTY, empresaID ) );
		query.andQualifier( ExpressionFactory.noMatchExp( Estabelecimentos.INACTIVO_PROPERTY, "y" ) );
		query.addOrdering( Estabelecimentos.NOME_PLAIN_PROPERTY, true );
		List<Estabelecimentos> allEstabelecimentos = context.performQuery( query );
		for( Estabelecimentos currentEstabelecimento : allEstabelecimentos )
		{
			Integer id = currentEstabelecimento.getId();
			String designacao = currentEstabelecimento.getNomePlain().toUpperCase();
			result.add( new ColumnizedMappable( id, designacao ) );
		}
		return result;
	}

	public Vector<ColumnizedMappable> getTrabalhadoresForEstabelecimento( Integer estabelecimentoID )
	{
		Vector<ColumnizedMappable> result = new Vector<ColumnizedMappable>();
		SelectQuery query = new SelectQuery( Trabalhadores.class, ExpressionFactory.matchExp( Trabalhadores.TO_ESTABELECIMENTOS_PROPERTY, estabelecimentoID ) );
		query.andQualifier( ExpressionFactory.noMatchExp( Trabalhadores.INACTIVO_PROPERTY, "y" ) );
		query.addOrdering( Trabalhadores.NOME_PLAIN_PROPERTY, true );
		List<Trabalhadores> allTrabalhadores = context.performQuery( query );
		for( Trabalhadores currentTrabalhador : allTrabalhadores )
		{
			Integer id = currentTrabalhador.getId();
			String designacao = currentTrabalhador.getNomePlainCapital();
			result.add( new ColumnizedMappable( id, designacao ) );
		}
		return result;
	}

	public BaseObject saveObject( BaseObject object )
	{
		if( object != null )
		{
			if( object.getPersistenceState() ==  PersistenceState.NEW )
			{
				context.registerNewObject( object );
			}
			context.commitChanges();
		}
		return object;
	}

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

}
