package siprp.medicina.locais_analise;

import java.util.Date;

import siprp.medicina.locais_realizacao.LocaisRealizacaoConstants;

import com.evolute.utils.Singleton;
import com.evolute.utils.arrays.Virtual2DArray;
import com.evolute.utils.data.IDObject;
import com.evolute.utils.data.MappableObject;
import com.evolute.utils.db.DBManager;
import com.evolute.utils.db.Executer;
import com.evolute.utils.sql.Assignment;
import com.evolute.utils.sql.Begin;
import com.evolute.utils.sql.Commit;
import com.evolute.utils.sql.Delete;
import com.evolute.utils.sql.Expression;
import com.evolute.utils.sql.Field;
import com.evolute.utils.sql.Insert;
import com.evolute.utils.sql.Select;
import com.evolute.utils.sql.Select2;

public class LocaisAnaliseDataProvider
{
	private static final Object LOCK = new Object();
	private static LocaisAnaliseDataProvider instance = null;
	
	private Executer EXECUTER;
	
	/** Creates a new instance of LocaisRealizacaoDataProvider */
	private LocaisAnaliseDataProvider()
		throws Exception
	{
		DBManager dbm = ( DBManager ) Singleton.getInstance( Singleton.DEFAULT_DBMANAGER );
		EXECUTER = dbm.getSharedExecuter( this );
	}
	
	public static LocaisAnaliseDataProvider getProvider()
		throws Exception
	{
		synchronized( LOCK )
		{
			if( instance == null )
			{
				instance = new LocaisAnaliseDataProvider();
			}
		}
		return instance;
	}
	
	protected IDObject[] getGruposEcdsByMarcacoes( Integer marcacoesIds[] )
		throws Exception
	{
		if( marcacoesIds == null || marcacoesIds.length == 0 )
		{
			return new IDObject[ 0 ];
		}
		Select select =
			new Select2( 
				new String[]{ "trabalhadores_ecd", "prt_tipos_elementos_protocolo",
								"prt_grupos_protocolo"},
				new Integer[]{ Select2.JOIN_INNER, Select2.JOIN_INNER },
				new Expression[]{
					new Field( "trabalhadores_ecd.ecd_id" ).isEqual(
						new Field( "prt_tipos_elementos_protocolo.id" ) ),
					new Field( "prt_tipos_elementos_protocolo.grupo_protocolo_id" ).isEqual( 
						new Field( "prt_grupos_protocolo.id" ) )
				},
				new String[]{ "DISTINCT prt_grupos_protocolo.id", "prt_grupos_protocolo.descricao", 
								"prt_grupos_protocolo.ordem" },
				new Field( "trabalhadores_ecd.trabalhadores_ecds_datas_id" ).in( marcacoesIds ),
				new String[]{ "prt_grupos_protocolo.ordem" },
				null,
				null,
				null );
		Virtual2DArray array = EXECUTER.executeQuery( select );
		IDObject grupos[] = new IDObject[ array.columnLength() ];
		for( int n = 0; n < grupos.length; n++ )
		{
			Integer id = ( Integer ) array.get( n, 0 );
			String descricao = ( String ) array.get( n, 1 );
			grupos[ n ] = new MappableObject( id, descricao );
		}
		return grupos;
	}
	
	public void savePrestadorEGruposData( Date data, Integer prestadorId, Integer gruposIds[] )
		throws Exception
	{
		EXECUTER.executeQuery( Begin.BEGIN );
		Delete delete = 
			new Delete( "trabalhadores_ecds_analise",
						new Field( "data" ).isEqual( data ) );
		EXECUTER.executeQuery( delete );
		if( prestadorId != null && !LocaisRealizacaoConstants.PRESTADOR_ID_SIPRP.equals( prestadorId )
				&& gruposIds != null && gruposIds.length > 0 )
		{
			Insert insert = 
				new Insert( "trabalhadores_ecds_analise",
							new Assignment[]{
								new Assignment( new Field( "data" ), data ),
								new Assignment( new Field( "prestador_id" ), prestadorId ),
								new Assignment( new Field( "grupo_ecds_id" ), gruposIds )
							} );
			EXECUTER.executeQuery( insert );
		}
		EXECUTER.executeQuery( Commit.COMMIT );
	}
	
	public Object[] getDataPrestadorEGruposByData( Date data )
		throws Exception
	{
		Select select =
			new Select2( 
				new String[]{ "trabalhadores_ecds_analise" },
				new Integer[]{},
				new Expression[]{},
				new String[]{ "prestador_id", "grupo_ecds_id" },
				new Field( "data" ).isEqual( data ),
				null,
				null,
				null,
				null );
		Virtual2DArray array = EXECUTER.executeQuery( select );
		if( array.columnLength() == 0 )
		{
			return null;
		}
		Integer grupos[] = new Integer[ array.columnLength() ];
		for( int n = 0; n < grupos.length; n++ )
		{
			grupos[ n ] = ( Integer ) array.get( n, 1 );
		}
		return new Object[]{ data, array.get( 0, 0 ), grupos };
	}
}

	