package com.evolute.siprp.server.logic.AnaliseAcidentesTrabalho.actual;

import com.evolute.siprp.client.panels.utils.AppConstants;
import com.evolute.siprp.server.db.InitDB;
import com.evolute.siprp.server.db.data.siprp.AcidentadosData;
import com.evolute.siprp.server.db.data.siprp.AnalisesAcidentesData;
import com.evolute.utils.Singleton;
import com.evolute.utils.arrays.Virtual2DArray;
import com.evolute.utils.db.DBManager;
import com.evolute.utils.db.Executer;
import com.evolute.utils.jdo.JDOProvider;
import com.evolute.utils.sql.Expression;
import com.evolute.utils.sql.Field;
import com.evolute.utils.sql.Select;
import com.evolute.utils.sql.Select2;

public class ActualTableDataProvider 
{
	private static ActualTableDataProvider instance = null;
	
	private final Executer EXECUTER;
	private final JDOProvider JDO_PROVIDER;
	
	private ActualTableDataProvider() throws Exception
	{
		InitDB.init();
		
		DBManager dbm = ( DBManager ) Singleton.getInstance( Singleton.DEFAULT_DBMANAGER );
		EXECUTER = dbm.getSharedExecuter( this );
		JDO_PROVIDER = ( JDOProvider ) Singleton.getInstance( Singleton.DEFAULT_JDO_PROVIDER );
	}
	
	
	public static ActualTableDataProvider getProvider() throws Exception
	{
		if ( instance == null )
		{
			instance = new ActualTableDataProvider();
		}
		return instance;
	}
	
	
	
	public Virtual2DArray getAnalisesActuaisSeguranca( Integer estabelecimento_id, Boolean responsavel_loja )
		throws Exception
	{	
		Expression whereExpression = new Field( AnalisesAcidentesData.ESTADO_FULL ).isEqual( AppConstants.ESTADO_SEG ).or(
			new Field( AnalisesAcidentesData.AVERIGUACAO_POSTERIOR_FULL ).isEqual( "y" ).and(
				new Field( AnalisesAcidentesData.AVERIGUACAO_OBS_FULL ).isEqual( "" )
			) 
		);
		if ( responsavel_loja )
		{
			whereExpression = whereExpression.or(
				new Field( AnalisesAcidentesData.ESTADO_FULL ).isEqual( AppConstants.ESTADO_ASSINATURA_SEG )
			);
		}
		Select query = new Select2(
			new String[] { AnalisesAcidentesData.TABLENAME, AcidentadosData.TABLENAME },
			new Integer[] { Select2.JOIN_INNER },
			new Expression[] {
				new Field( AnalisesAcidentesData.ACIDENTADO_ID_FULL ).isEqual( new Field( AcidentadosData.ID_FULL ) )
			},
			new String[] { 
				AnalisesAcidentesData.ID_FULL, AnalisesAcidentesData.DATA_ACIDENTE_FULL, AnalisesAcidentesData.DATA_INICIO_PROCESSO_FULL,
				AnalisesAcidentesData.ANALISE_NR_FULL, AcidentadosData.NUMERO_MECANOGRAFICO_FULL, AcidentadosData.NOME_FULL, 
				AnalisesAcidentesData.ESTADO_FULL
			},
			new Field( AnalisesAcidentesData.APAGADA_FULL ).isEqual( "n" ).and(
				new Field( AnalisesAcidentesData.ESTABELECIMENTO_ID_FULL ).isEqual( estabelecimento_id ).and(
					whereExpression
				)
			),
			new String[] { AnalisesAcidentesData.ANALISE_NR_FULL },
			null,
			null,
			null
		);
		System.out.println( "\n" + query.toString() );
		
		return EXECUTER.executeQuery( query );	
	}
	
	public Virtual2DArray getAnalisesActuaisRH( Integer estabelecimento_id, Boolean responsavel_loja )
		throws Exception
	{		
		Expression whereExpression = new Field( AnalisesAcidentesData.ESTADO_FULL ).isEqual( AppConstants.ESTADO_RH1 ).or(
			new Field( AnalisesAcidentesData.ESTADO_FULL ).isEqual( AppConstants.ESTADO_RH2 )
		);
		if ( responsavel_loja )
		{
			whereExpression = whereExpression.or( 
				new Field( AnalisesAcidentesData.ESTADO_FULL ).isEqual( AppConstants.ESTADO_ASSINATURA_RH )
			);
		}
		
		Select query = new Select2(
			new String[] { AnalisesAcidentesData.TABLENAME, AcidentadosData.TABLENAME },
			new Integer[] { Select2.JOIN_INNER },
			new Expression[] {
				new Field( AnalisesAcidentesData.ACIDENTADO_ID_FULL ).isEqual( new Field( AcidentadosData.ID_FULL ) )
			},
			new String[] { 
				AnalisesAcidentesData.ID_FULL, AnalisesAcidentesData.DATA_ACIDENTE_FULL, AnalisesAcidentesData.DATA_INICIO_PROCESSO_FULL,
				AnalisesAcidentesData.ANALISE_NR_FULL, AcidentadosData.NUMERO_MECANOGRAFICO_FULL, AcidentadosData.NOME_FULL, 
				AnalisesAcidentesData.ESTADO_FULL
			},
			new Field( AnalisesAcidentesData.APAGADA_FULL ).isEqual( "n" ).and(
				new Field( AnalisesAcidentesData.ESTABELECIMENTO_ID_FULL ).isEqual( estabelecimento_id ).and(
					whereExpression
				)
			),
			new String[] { AnalisesAcidentesData.ANALISE_NR_FULL },
			null,
			null,
			null
		);
		System.out.println( "\n" + query.toString() );
		
		return EXECUTER.executeQuery( query );
	}
	
	public Virtual2DArray getAnalisesActuaisHS()
		throws Exception
	{		
		Select query = new Select2(
			new String[] { AnalisesAcidentesData.TABLENAME, AcidentadosData.TABLENAME },
			new Integer[] { Select2.JOIN_INNER },
			new Expression[] {
				new Field( AnalisesAcidentesData.ACIDENTADO_ID_FULL ).isEqual( new Field( AcidentadosData.ID_FULL ) )
			},
			new String[] { 
				AnalisesAcidentesData.ID_FULL, AnalisesAcidentesData.DATA_ACIDENTE_FULL, AnalisesAcidentesData.DATA_INICIO_PROCESSO_FULL,
				AnalisesAcidentesData.ANALISE_NR_FULL, AcidentadosData.NUMERO_MECANOGRAFICO_FULL, AcidentadosData.NOME_FULL, 
				AnalisesAcidentesData.ESTADO_FULL
			},
			new Field( AnalisesAcidentesData.APAGADA_FULL ).isEqual( "n" ).and( 
				new Field( AnalisesAcidentesData.ESTADO_FULL ).isEqual( AppConstants.ESTADO_HS ).or(
					new Field( AnalisesAcidentesData.ESTADO_FULL ).isEqual( AppConstants.ESTADO_FECHAR ).or(
						new Field( AnalisesAcidentesData.ESTADO_FULL ).isEqual( AppConstants.ESTADO_CONSOLIDACAO )
					)
				)
			),
			new String[] { AnalisesAcidentesData.ANALISE_NR_FULL },
			null,
			null,
			null
		);
		System.out.println( "\n" + query.toString() );
		
		return EXECUTER.executeQuery( query );
	}
    
}
