/*
 * RemarcacoesDataProvider.java
 *
 * Created on February 14, 2007, 10:56 AM
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package siprp.lembretes.marcacoes;

import static com.evolute.utils.strings.UnicodeLatin1Map.atilde;

import java.text.DateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;

import siprp.lembretes.LembretesConstants;
import siprp.lembretes.LembretesDataProvider;

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.Expression;
import com.evolute.utils.sql.Field;
import com.evolute.utils.sql.Select;
import com.evolute.utils.sql.Select2;

/**
 *
 * @author lflores
 */
public class MarcacoesDataProvider
{
	private static final DateFormat D_F = DateFormat.getDateInstance( DateFormat.SHORT, new Locale( "pt", "PT" ) );
	
	private static final Object LOCK = new Object();
	private static MarcacoesDataProvider instance = null;
	
	private Executer EXECUTER;
	private LembretesDataProvider lembretesProvider;
	
	/** Creates a new instance of RemarcacoesDataProvider */
	public MarcacoesDataProvider()
		throws Exception
	{
		DBManager dbm = ( DBManager ) Singleton.getInstance( Singleton.DEFAULT_DBMANAGER );
		EXECUTER = dbm.getSharedExecuter( this );
		lembretesProvider = LembretesDataProvider.getProvider();
	}

	public static MarcacoesDataProvider getProvider()
		throws Exception
	{
		synchronized( LOCK )
		{
			if( instance == null )
			{
				instance = new MarcacoesDataProvider();
			}
		}
		return instance;
	}
	
	private Expression whereExpressionLembretesRemarcacao( Integer empresaID, Integer estabelecimentoID ) throws Exception
	{
		Expression result = new Field( "lembretes.tipo_id" ).isEqual( 
				lembretesProvider.getTipoLembreteByCodigo( LembretesConstants.CODE_MARCACOES ).getID() ).and( 
			new Field( "lembretes.data" ).isLessOrEqual( new Field( "current_date" ) ) ).and(
					new Field( "lembretes.deleted_date" ).isEqual( null ) );
		if( empresaID != null )
		{
			result = result.and( new Field("empresas.id").isEqual( empresaID ) );
			if( estabelecimentoID != null )
			{
				result = result.and( new Field("estabelecimentos.id").isEqual( estabelecimentoID ) );
			}
		}
		return result;
	}
	
	public IDObject[] getLembretesMarcacaoTrabalhador( Integer empresaID, Integer estabelecimentoID )
		throws Exception
	{
		Select select =
				new Select2( new String[]{ "lembretes", "marcacoes_trabalhador", "trabalhadores", 
											"estabelecimentos", "empresas", "trabalhadores_consultas_datas", "trabalhadores_ecds_datas"},
								new Integer [] {
								                Select2.JOIN_LEFT_OUTER, Select2.JOIN_LEFT_OUTER,
								                Select2.JOIN_LEFT_OUTER, Select2.JOIN_LEFT_OUTER,
								                Select2.JOIN_LEFT_OUTER, Select2.JOIN_LEFT_OUTER
								                },
								new Expression[]{ 
										new Field( "lembretes.marcacao_trabalhador_id" ).isEqual( new Field( "marcacoes_trabalhador.id" ) ),/*.or(
												new Field( "lembretes.trabalhadores_consultas_datas_id" ).isEqual( new Field( "trabalhadores_consultas_datas.id" ) )		
										).or(
												new Field( "lembretes.trabalhadores_ecds_datas_id" ).isEqual( new Field( "trabalhadores_ecds_datas.id" ) )
										),
										*/
										new Field( "marcacoes_trabalhador.trabalhador_id" ).isEqual( new Field( "trabalhadores.id" ) ).or( new Field( "lembretes.trabalhador_id" ).isEqual( new Field( "trabalhadores.id" ) ) ),
										new Field( "trabalhadores.estabelecimento_id" ).isEqual( new Field( "estabelecimentos.id" ) ),
										new Field( "estabelecimentos.empresa_id" ).isEqual( new Field( "empresas.id" ) ),
										new Field( "lembretes.trabalhadores_consultas_datas_id" ).isEqual( new Field( "trabalhadores_consultas_datas.id" ) ),
										new Field( "lembretes.trabalhadores_ecds_datas_id" ).isEqual( new Field( "trabalhadores_ecds_datas.id" ) )
									},
								new String[]{ "lembretes.id", "lembretes.descricao", 
												"marcacoes_trabalhador.tipo", "lembretes.data",
												"trabalhadores.nome", "estabelecimentos.nome", "empresas.designacao_social",
												"trabalhadores.nome_plain" },
								whereExpressionLembretesRemarcacao( empresaID, estabelecimentoID ),
								new String[]{ "trabalhadores.nome_plain" },
								null,
								null,
								null
							);
		Virtual2DArray array = EXECUTER.executeQuery( select );
		IDObject lembretes[] = new IDObject[ array.columnLength() ];
		for( int n = 0; n < lembretes.length; n++ )
		{
			Integer id = ( Integer ) array.get( n, 0 );
			String descricao = ( String ) array.get( n, 1 );
			Date data = ( Date ) array.get( n, 3 );
			Calendar c = Calendar.getInstance();
			c.setTime( data );
//			c.add( Calendar.MONTH, 2 );
//			
			String trabalhador = ( String ) array.get( n, 4 );
			String split[] = trabalhador.split( " " );
			trabalhador = split[ 0 ] + " " + ( split.length > 2 ? split[ 1 ].charAt( 0 ) + ". " : " " ) +
							( split.length > 1 ? split[ split.length - 1 ] : "" );
			String estabelecimento = ( String ) array.get( n, 5 );
			String empresa = ( String ) array.get( n, 6 );
			String str = "<html><body><font color=\"#00009f\">" + trabalhador + "</font>"
							+ "<br>&nbsp;&nbsp;&nbsp;" + "Ficha de aptid" + atilde + "o caduca a " + D_F.format( c.getTime() )
							+ "<br>&nbsp;&nbsp;&nbsp;<font color=\"#009f00\">" + descricao + "</font>"
							+ "<br>&nbsp;&nbsp;&nbsp;" + empresa.substring( 0, empresa.length() > 20 ? 20 : empresa.length() )
							+ " / " + estabelecimento.substring( 0, estabelecimento.length() > 10 ? 10 : estabelecimento.length() )
							+ "</body></html>";
			lembretes[ n ] = new MappableObject( id, str );
		}
		return lembretes;
	}
}
