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

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 SeguimentoTableDataProvider 
{
	
	private static SeguimentoTableDataProvider instance = null;
	
	private final Executer EXECUTER;
	private final JDOProvider JDO_PROVIDER;
	
	private SeguimentoTableDataProvider() 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 SeguimentoTableDataProvider getProvider() throws Exception
	{
		if ( instance == null )
		{
			instance = new SeguimentoTableDataProvider();
		}
		return instance;
	}
	
	
	/**
	 * director geral RH e director siprp
	 * 
	 * @return
	 * @throws Exception
	 */
	public Virtual2DArray getAnalisesSeguimento_DirGeralRH() 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.ESTADO_FULL ).isLess( AppConstants.ESTADO_CONCLUIDO ).and(
				new Field( AnalisesAcidentesData.APAGADA_FULL ).isEqual( "n" )
			), 
			new String[] { AnalisesAcidentesData.ANALISE_NR_FULL }, 
			null, 
			null, 
			null
		);
		
		return EXECUTER.executeQuery( query );
	}
	
	public Virtual2DArray getAnalisesSeguimentoByEstabelecimentoID( Integer estabelecimento_id ) 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.ESTADO_FULL ).isLess( AppConstants.ESTADO_CONCLUIDO ).and(
				new Field( AnalisesAcidentesData.APAGADA_FULL ).isEqual( "n" ).and(
					new Field( AnalisesAcidentesData.ESTABELECIMENTO_ID_FULL ).isEqual( estabelecimento_id )
				)
			), 
			new String[] { AnalisesAcidentesData.ANALISE_NR_FULL }, 
			null, 
			null, 
			null
		);
		
		return EXECUTER.executeQuery( query );
	}
	
	public Virtual2DArray getAnalisesSeguimento_HS() throws Exception
	{
		/*
		SELECT * 
		FROM analises_acidentes 
		WHERE 
			(estado < Global.ESTADO_HS OR (estado > Global.ESTADO_HS AND estado < Global.ESTADO_CONSOLIDACAO ) 
			OR (estado > Global.ESTADO_CONSOLIDACAO AND estado < Global.ESTADO_FECHAR ))
			AND apagada = 'n' 
		ORDER BY analise_nr
		*/
		
		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 ).isLess( AppConstants.ESTADO_HS ).or(
					new Field( AnalisesAcidentesData.ESTADO_FULL ).isGreater( AppConstants.ESTADO_HS ).and(
						new Field( AnalisesAcidentesData.ESTADO_FULL ).isLess( AppConstants.ESTADO_CONSOLIDACAO )
					)
				).or(
					new Field( AnalisesAcidentesData.ESTADO_FULL ).isGreater( AppConstants.ESTADO_CONSOLIDACAO ).and(
						new Field( AnalisesAcidentesData.ESTADO_FULL ).isLess( AppConstants.ESTADO_FECHAR )
					)
				)
			),
			new String[] { AnalisesAcidentesData.ANALISE_NR_FULL }, 
			null, 
			null, 
			null
		);
		System.out.println( "\n" + query.toString() );
		
		return EXECUTER.executeQuery( query );
	}
	
//	public Virtual2DArray getAnalisesSeguimento_Medico( Integer estabelecimento_id ) throws Exception 
//	{
//		/*
//		SELECT * 
//		FROM analises_acidentes 
//		WHERE 
//			estado < 5 OR (estado = 6 AND estado_assinatura <> 2) 
//			OR (estado = 6 AND estado_assinatura = 2 AND ass_med = 'y') 
//			OR (estado > 6 AND estado < 9) 
//			AND estabelecimento_id = estabelecimento_id 
//			AND apagada = 'n' 
//		ORDER BY analise_nr
//		*/
//		
//		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(
//					new Field( AnalisesAcidentesData.ESTADO_FULL ).isLess( 5 ).or( 
//						new Field( AnalisesAcidentesData.ESTADO_FULL ).isEqual( 6 ).and(
//							new Field( AnalisesAcidentesData.ESTADO_ASSINATURA_FULL ).isDifferent( 2 )
//						)
//					).or(
//						new Field( AnalisesAcidentesData.ESTADO_FULL ).isEqual( 6 ).and(
//							new Field( AnalisesAcidentesData.ESTADO_ASSINATURA_FULL ).isEqual( 2 ).and(
//								new Field( AnalisesAcidentesData.ASS_MED_FULL ).isEqual( "y" )
//							)
//						)
//					).or(
//						new Field( AnalisesAcidentesData.ESTADO_FULL ).isGreater( 6 ).and(
//							new Field( AnalisesAcidentesData.ESTADO_FULL ).isLess( 9 )
//						)
//					)
//				)
//			),
//			new String[] { AnalisesAcidentesData.ANALISE_NR_FULL }, 
//			null, 
//			null, 
//			null
//		);
//		System.out.println( "\n" + query.toString() );
//			
//		return EXECUTER.executeQuery( query );		
//	}
			
}
