package siprp.database.cayenne.providers;

import java.util.Date;
import java.util.LinkedList;
import java.util.List;

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

import siprp.database.cayenne.objects.EmailPlanoDeActuacao;
import siprp.database.cayenne.objects.Estabelecimentos;
import siprp.database.cayenne.objects.HsLegislacao;
import siprp.database.cayenne.objects.HsLegislacaoCategoria;
import siprp.database.cayenne.objects.HsPosto;
import siprp.database.cayenne.objects.HsPostoRisco;
import siprp.database.cayenne.objects.HsRelatorio;
import siprp.database.cayenne.objects.HsRelatorioRiscoValorQualitativo;
import siprp.database.cayenne.objects.HsRisco;
import siprp.database.cayenne.objects.HsRiscoTema;
import siprp.database.cayenne.objects.MarcacoesEstabelecimento;

public class PlanoActuacaoDAO extends MainDAO
{

	public Estabelecimentos getEstabelecimentoByID( Integer id )
	{
		return (Estabelecimentos) DataObjectUtils.objectForPK( context, Estabelecimentos.class, id );
	}

	public void addEmailToEstabelecimento( String email, Estabelecimentos estabelecimento )
	{
		EmailPlanoDeActuacao emailObject = (EmailPlanoDeActuacao) context.newObject( EmailPlanoDeActuacao.class );
		emailObject.setDescription( email );
		emailObject.setToEstabelecimentos( estabelecimento );
		context.commitChanges();
	}

	public List<HsRiscoTema> getAllRiscoTemas()
	{
		SelectQuery query = new SelectQuery( HsRiscoTema.class );
		query.andQualifier( ExpressionFactory.matchExp( HsRiscoTema.DELETED_DATE_PROPERTY, null ) );
		query.addOrdering( HsRiscoTema.DESCRIPTION_PROPERTY, true );
		return context.performQuery( query );
	}

	public HsRelatorio criarRelatorioForVisita( MarcacoesEstabelecimento visita )
	{
		HsRelatorio result = null;
		if( visita != null )
		{
			result = (HsRelatorio) context.newObject( HsRelatorio.class );
			result.setToHsMarcacoesEstabelecimento( visita );
			result.setData( new Date() );
			context.commitChanges();
		}
		return result;
	}

	public HsPostoRisco createValoresFor( HsRisco risco, HsPosto posto )
	{
		HsPostoRisco result = null;
		if( risco != null && posto != null )
		{
			result = (HsPostoRisco) context.newObject( HsPostoRisco.class );
			result.setToHsPosto( posto );
			result.setToHsRisco( risco );
			result.setIsPlanoActuacao( "n" );
			context.commitChanges();
		}
		return result;
	}

	public List<HsRelatorioRiscoValorQualitativo> getAllValoresQualitativos()
	{
		SelectQuery query = new SelectQuery( HsRelatorioRiscoValorQualitativo.class );
		return context.performQuery( query );
	}

	/**
	 * Get 
	 * @param dates
	 * @param estabelecimentoID
	 * @return
	 */
	public List<HsRelatorio> getRelatoriosNotIn( List<Date> dates, Integer estabelecimentoID )
	{
		List<HsRelatorio> result = new LinkedList<HsRelatorio>();
		if( dates != null )
		{
			SelectQuery query = new SelectQuery( HsRelatorio.class );
			query.andQualifier( ExpressionFactory.noMatchExp( HsRelatorio.IS_SUBMETIDO_PROPERTY, null ) );
			query.andQualifier( ExpressionFactory.matchExp( HsRelatorio.DELETED_DATE_PROPERTY, null ) );
			List<HsRelatorio> all = context.performQuery( query );
			for( HsRelatorio relatorio : all )
			{
				MarcacoesEstabelecimento visita = relatorio.getToHsMarcacoesEstabelecimento();

				if( visita != null )
				{
					if( estabelecimentoID == null
							||
							estabelecimentoID != null && estabelecimentoID.equals( visita.getEstabelecimentoID() ) )
					{
						Date dateVisita = visita.getData();
						if( dateVisita != null && !dates.contains( dateVisita ) )
						{
							result.add( relatorio );
						}
					}
				}
			}
		}
		return result;
	}
//	public Legislacao createNovaLegislacao( Legislacao parent )
//	{
//		Legislacao legislacaoObject = (Legislacao) context.newObject( Legislacao.class );
//		legislacaoObject.setToLegislacao( parent );
//		legislacaoObject.setDescription( "" );
//		return legislacaoObject;
//	}
//	
//	public PostoDeTrabalho createPostoTrabalho( String postoTrabalho )
//	{
//		PostoDeTrabalho postoTrabalhoObject = (PostoDeTrabalho) context.newObject( PostoDeTrabalho.class );
//		postoTrabalhoObject.setDescription( postoTrabalho );
//		context.commitChanges();
//		return postoTrabalhoObject;
//	}
//	
//	public void addLegislacaoToEstabelecimento( Legislacao legislacao, Estabelecimentos estabelecimento )
//	{
//		LegislacaoEstabelecimento rel = (LegislacaoEstabelecimento) context.newObject( LegislacaoEstabelecimento.class );
//		rel.setToEstabelecimentos( estabelecimento );
//		rel.setToLegislacao( legislacao );
//		context.commitChanges();
//	}
//	
//	public void addPostoTrabalhoToEstabelecimento( PostoDeTrabalho postoTrabalho, Estabelecimentos estabelecimento )
//	{
//		PostoDeTrabalhoEstabelecimento rel = (PostoDeTrabalhoEstabelecimento) context.newObject( PostoDeTrabalhoEstabelecimento.class );
//		rel.setToEstabelecimentos( estabelecimento );
//		rel.setToPostoDeTrabalho( postoTrabalho );
//		context.commitChanges();
//	}
//	
//	private boolean containsPostoTrabalho( List<PostoDeTrabalhoEstabelecimento> rels, Estabelecimentos estabelecimento )
//	{
//		boolean result = false; 
//		for( PostoDeTrabalhoEstabelecimento rel : rels )
//		{
//			if( rel.getToEstabelecimentos().equals( estabelecimento ) )
//			{
//				result = true;
//				break;
//			}
//		}
//		return result;
//	}
//	
//	private boolean containsLegislacao( List<LegislacaoEstabelecimento> rels, Estabelecimentos estabelecimento )
//	{
//		boolean result = false; 
//		for( LegislacaoEstabelecimento rel : rels )
//		{
//			if( rel.getToEstabelecimentos().equals( estabelecimento ) )
//			{
//				result = true;
//				break;
//			}
//		}
//		return result;
//	}
//
//	public PostoDeTrabalho [] getAllPostosNotInEstabelecimento( Estabelecimentos estabelecimento )
//	{
//		List<PostoDeTrabalho> result = new LinkedList<PostoDeTrabalho>();
//		SelectQuery query = new SelectQuery( PostoDeTrabalho.class );
//		List<PostoDeTrabalho> res = context.performQuery( query );
//		if( res != null )
//		{
//			for( PostoDeTrabalho posto : res )
//			{
//				if( !containsPostoTrabalho( posto.getPostoDeTrabalhoEstabelecimentoArray() , estabelecimento ) )
//				{
//					result.add( posto );
//				}
//			}
//			Collections.sort( result, new Comparator<PostoDeTrabalho>()
//			{
//				@Override
//				public int compare( PostoDeTrabalho o1, PostoDeTrabalho o2 )
//				{
//					return o1.getDescription().compareTo( o2.getDescription() );
//				}
//			});
//		}
//		return result.toArray( new PostoDeTrabalho[ result.size() ] );
//	}
//	
//	public Legislacao [] getAllLegislacoesNotInEstabelecimento( Estabelecimentos estabelecimento )
//	{
//		List<Legislacao> result = new LinkedList<Legislacao>();
//		SelectQuery query = new SelectQuery( Legislacao.class );
//		query.andQualifier( ExpressionFactory.matchExp( Legislacao.TO_LEGISLACAO_PROPERTY, null ) );
//		List<Legislacao> res = context.performQuery( query );
//		if( res != null )
//		{
//			for( Legislacao legislacao : res )
//			{
//				if( !containsLegislacao( legislacao.getLegislacaoEstabelecimentoArray(), estabelecimento ) )
//				{
//					result.add( legislacao );
//				}
//			}
//			Collections.sort( result, new Comparator<Legislacao>()
//			{
//				@Override
//				public int compare( Legislacao o1, Legislacao o2 )
//				{
//					return o1.getDescription().compareTo( o2.getDescription() );
//				}
//			});
//		}
//		return result.toArray( new Legislacao[ result.size() ] );
//	}
//
//	public Medida createMedida( String medida )
//	{
//		Medida medidaObject = (Medida) context.newObject( Medida.class );
//		medidaObject.setDescription( medida );
//		context.commitChanges();
//		return medidaObject;
//	}
//	
//	private boolean containsMedidas( List<RiscoMedida> rels, Risco risco )
//	{
//		boolean result = false; 
//		for( RiscoMedida rel : rels )
//		{
//			if( rel.getToRisco().equals( risco ) )
//			{
//				result = true;
//				break;
//			}
//		}
//		return result;
//	}
//
//	public Medida[] getAllMedidasNotInRisco( Risco risco )
//	{
//		List<Medida> result = new LinkedList<Medida>();
//		SelectQuery query = new SelectQuery( Medida.class );
//		List<Medida> res = context.performQuery( query );
//		if( res != null )
//		{
//			for( Medida medida : res )
//			{
//				if( !containsMedidas( medida.getRiscoMedidaArray(), risco ) )
//				{
//					result.add( medida );
//				}
//			}
//			Collections.sort( result, new Comparator<Medida>()
//			{
//				@Override
//				public int compare( Medida o1, Medida o2 )
//				{
//					return o1.getDescription().compareTo( o2.getDescription() );
//				}
//			});
//		}
//		return result.toArray( new Medida[ result.size() ] );
//	}
//	
//	public List<Risco> getAllRiscos()
//	{
//		SelectQuery query = new SelectQuery(Risco.class);
//		query.addOrdering( Risco.DESCRIPTION_PROPERTY, true );
//		List<Risco> result = context.performQuery( query );
//		return result;
//	}
//
//	public void addMedidaToRisco( Medida medida, Risco risco )
//	{
//		RiscoMedida rel = (RiscoMedida) context.newObject( RiscoMedida.class );
//		rel.setToMedida( medida );
//		rel.setToRisco( risco );
//		context.commitChanges();
//	}
//
//	public void createRisco( String risco, Integer valorInt )
//	{
//		Risco riscoObject = (Risco) context.newObject( Risco.class );
//		riscoObject.setDescription( risco );
//		riscoObject.setValue( valorInt );
//		context.commitChanges();
//	}
//
//	public List<Legislacao> getAllLegislacoes( Legislacao parent )
//	{
//		SelectQuery query = new SelectQuery( Legislacao.class );
//		query.andQualifier( ExpressionFactory.matchExp( Legislacao.TO_LEGISLACAO_PROPERTY, parent ) );
//		if( parent == null )
//		{
//			query.addOrdering( Legislacao.DESCRIPTION_PROPERTY, true );
//		}
//		return context.performQuery( query );
//	}

	public List<HsLegislacao> getAllLegislacaoGeral()
	{
		SelectQuery query = new SelectQuery( HsLegislacao.class );
		query.andQualifier( ExpressionFactory.matchExp( HsLegislacao.DELETED_DATE_PROPERTY, null ) );
		query.andQualifier( ExpressionFactory.matchExp( HsLegislacao.TO_HS_LEGISLACAO_CATEGORIA_PROPERTY, null ) );
		return context.performQuery( query );
	}
	
	public List<HsLegislacaoCategoria> getAllLegislacaoCategorias()
	{
		SelectQuery query = new SelectQuery( HsLegislacaoCategoria.class );
		query.andQualifier( ExpressionFactory.matchExp( HsLegislacaoCategoria.DELETED_DATE_PROPERTY, null ) );
		return context.performQuery( query );
	}

}
