/*
 * MarcacoesHigieneWindow.java
 *
 * Created on January 31, 2006, 11:32 PM
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package siprp.higiene.marcacoes;

import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.text.DateFormat;
import java.util.Date;
import java.util.Hashtable;
import java.util.Locale;

import javax.swing.JComboBox;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

import siprp.CompanyDataLoader;
import siprp.SIPRPTracker;
import siprp.SingletonConstants;
import siprp.data.AvisoConstants;
import siprp.data.Marcacao;
import siprp.data.outer.ContactosData;
import siprp.data.outer.EstabelecimentosData;
import siprp.data.outer.MarcacoesEstabelecimentoData;
import siprp.higiene.HigieneDataProvider;

import com.evolute.entity.ProviderInterface;
import com.evolute.utils.Singleton;
import com.evolute.utils.arrays.Object2DArray;
import com.evolute.utils.data.MappableObject;
import com.evolute.utils.ui.DialogException;
import com.evolute.utils.ui.panel.TableEditorPanel;
import com.evolute.utils.ui.text.CopyPasteHandler;
import com.evolute.utils.ui.window.EditorWindow;

/**
 *
 * @author fpalma
 */
public class MarcacoesHigieneWindow extends EditorWindow
		implements ItemListener, ActionListener, ListSelectionListener
{

	private static final long serialVersionUID = 1L;

	public final static String TITLE = "Marca\u00e7\u00f5es de Higiene e Seguran\u00e7a";
	
	private final static int iPermissionArray[][] =
		new int[][]{ {}, { NEW_INDEX, EDIT_INDEX, CANCEL_INDEX, SAVE_INDEX, DELETE_INDEX } };
	
	private static final int INDEX_MAIN = 0;
	private static final int INDEX_VISITA = 1;
	
	private static final DateFormat DATE_FORMAT =
			DateFormat.getDateInstance( DateFormat.SHORT, new Locale( "PT", "pt" ) );
	
	protected MarcacoesHigieneUpperPanel upperPanel;
	protected MarcacaoVisitaHSTPanel marcacaoPanel;
	protected TableEditorPanel marcacaoEditorPanel;
	
	protected HigieneDataProvider provider;
	protected ProviderInterface JDO;
	protected SIPRPTracker tracker;
	
	private Hashtable<Object, Object[]> tecnicosHash;
	
	protected Integer empresaID;
	protected String empresa;
	protected Integer estabelecimentoID;
	protected EstabelecimentosData estabelecimento;
	
	protected boolean editing = false;
	
	/** Creates a new instance of MarcacoesHigieneWindow */
	public MarcacoesHigieneWindow()	
		throws Exception
	{
		super( iPermissionArray );
		this.provider = ( HigieneDataProvider ) HigieneDataProvider.getProvider();
		this.JDO = ( ProviderInterface ) Singleton.getInstance( Singleton.DEFAULT_JDO_PROVIDER );
		this.tecnicosHash = new Hashtable<Object, Object[]>();
		this.setupComponents();
		this.setSize( 800, 700 );
		this.setLocationRelativeTo(null);
		this.setExtendedState( getExtendedState() | MAXIMIZED_BOTH );
	}
	
	private void setupComponents()
		throws Exception
	{
		setTitle( TITLE );
		upperPanel = new MarcacoesHigieneUpperPanel();
		JPanel panel = new JPanel();
		
		GridBagLayout gridbag = new GridBagLayout();
		GridBagConstraints constraints = new GridBagConstraints();
		getContentPane().setLayout( gridbag );
		constraints.insets = new Insets( 2, 2, 2, 2 );
		constraints.fill = GridBagConstraints.BOTH;
		constraints.gridwidth = GridBagConstraints.REMAINDER;
		constraints.weightx = 1;
		constraints.gridheight = 1;
		
		constraints.weighty = 1;
		gridbag.setConstraints( upperPanel, constraints );
		
		constraints.weighty = 0;
		gridbag.setConstraints( panel, constraints );
		
		getContentPane().add( upperPanel );
		getContentPane().add( panel );
		
		changeGroupName( INDEX_VISITA, "Visitas" );
		setActionName( INDEX_VISITA, NEW_INDEX, "Nova" );
		setActionTooltip( INDEX_VISITA, NEW_INDEX, "Nova" );
		JPanel toolbar = getToolbarPanel( INDEX_VISITA );
		
		gridbag = new GridBagLayout();
//		GridBagConstraints constraints = new GridBagConstraints();
		panel.setLayout( gridbag );
		constraints.insets = new Insets( 2, 2, 2, 2 );
		constraints.fill = GridBagConstraints.BOTH;
		constraints.gridwidth = GridBagConstraints.REMAINDER;
		constraints.weightx = 1.0;
		constraints.weighty = 0;
		
		gridbag.setConstraints( toolbar, constraints );
		panel.add( toolbar );
		
		constraints.gridheight = 1;
		constraints.weighty = 0;
		try
		{
			marcacaoEditorPanel = 
				new TableEditorPanel( new String[]{ "Data", 
					"Estado" },
					new int[]{0,2}, new int[]{0,0},
						0.0, 1.0, new Dimension( 350, 100 ) );
			marcacaoPanel = new MarcacaoVisitaHSTPanel();
			new CopyPasteHandler( marcacaoPanel.getObservacoesText() );
			marcacaoEditorPanel.addComponent( marcacaoPanel, 
					new int[]{0,2}, new int[]{1,2},
					1.0, 1.0 );
			marcacaoEditorPanel.addListSelectionListener( new ListSelectionListener(){
				public void valueChanged(javax.swing.event.ListSelectionEvent listSelectionEvent)
				{
					if( marcacaoEditorPanel.getID() != null )
					{
						reload(INDEX_VISITA);
						select(INDEX_VISITA);
					}
					else
					{
						clear( INDEX_VISITA );
					}
				}
			});
		}catch( Exception ex )
		{
			DialogException.showException( ex );
			return;
		}
		gridbag.setConstraints( marcacaoEditorPanel, constraints );
		panel.add( marcacaoEditorPanel );
		marcacaoPanel.getEmailButton().addActionListener( this );
		
		fillCombos();
		upperPanel.addListSelectionListener( this );
	}
	
	public void fillCombos()
		throws Exception
	{
		JComboBox tecnicosList = marcacaoPanel.getTecnicoList();
		JComboBox tecnicosSuperioresList = marcacaoPanel.getTecnicoSuperiorList();
		tecnicosHash.clear();
		tecnicosList.removeItemListener( this );
		tecnicosSuperioresList.removeItemListener( this );
		fillTecnicos(tecnicosList,false);
		fillTecnicos(tecnicosSuperioresList,true);
		tecnicosList.addItemListener( this );
		tecnicosSuperioresList.addItemListener( this );
	}
	
	private void fillTecnicos( JComboBox tecnicosList, boolean superiores ) throws Exception
	{
		tecnicosList.removeAllItems();
		Object tecnicos[][] = provider.getTecnicosHST( superiores );
		tecnicosList.addItem( new MappableObject( new Integer( -2 ), " " ) );
		for( int n = 0; n < tecnicos.length; n++ )
		{
			Object tecnico[] = new Object[ 4 ];
			tecnico[ 0 ] = new Integer( ( (Number)tecnicos[n][0] ).intValue() );
			tecnico[ 1 ] = tecnicos[ n ][ 1 ];
			tecnico[ 2 ] = tecnicos[ n ][ 2 ];
			tecnico[ 3 ] = new Integer( n );
			tecnicosHash.put( tecnicos[ n ][ 0 ], tecnico );
			tecnicosList.addItem( new MappableObject( (Integer) tecnico[ 0 ], tecnico[ 1 ] ) );
		}
		tecnicosList.setSelectedIndex( 0 );

		tecnicosList.addItem( new MappableObject( new Integer( -1 ), "Novo/Editar" ) );
	}
	
	public void itemStateChanged( ItemEvent itemEvent )
	{
		JComboBox tecnicos = null;
		if( itemEvent.getSource().equals( marcacaoPanel.getTecnicoList() ) )
		{
			tecnicos = marcacaoPanel.getTecnicoList();
		}
		else if( itemEvent.getSource().equals( marcacaoPanel.getTecnicoSuperiorList() ) )
		{
			tecnicos = marcacaoPanel.getTecnicoSuperiorList();
		}
		if( tecnicos != null && itemEvent.getStateChange() == ItemEvent.SELECTED )
		{
			int index = tecnicos.getSelectedIndex();
			if( index == tecnicos.getItemCount() - 1 )
			{
				try
				{
					TecnicoEditor te = new TecnicoEditor( this );
					te.setVisible( true );
					Integer id = te.getID();
					if( id == null )
					{
						tecnicos.setSelectedIndex( 0 );
					}
					else
					{
						fillCombos();
						if( id != null )
						{
							Object[] tecnico = tecnicosHash.get( id );
							tecnicos.setSelectedIndex( ( (Integer)tecnico[ 3 ] ).intValue()  + 1 );
						}
					}
					
				}
				catch( Exception ex )
				{
					DialogException.showExceptionMessage( ex, "Erro na janela de edi\u00e7\u00e3o...", true );
					ex.printStackTrace();
					tecnicos.setSelectedIndex( 0 );
					return;
				}
			}
		}
	}
	
	public boolean save(int index)
	{
		switch( index )
		{
			case INDEX_VISITA:
				MarcacoesEstabelecimentoData visita = ( MarcacoesEstabelecimentoData ) marcacaoPanel.save();
				Date data = ( Date ) visita.get( MarcacoesEstabelecimentoData.DATA );
				if( data == null )
				{
					JOptionPane.showMessageDialog( this, "Tem de preencher uma data para a visita.",
						"Erro", JOptionPane.ERROR_MESSAGE );
					return false;
				}
				visita.setToEstabelecimento_id( estabelecimento );	
				try
				{
					visita.set( MarcacoesEstabelecimentoData.REALIZADA,
								( ( Integer )visita.get( MarcacoesEstabelecimentoData.ESTADO ) ).intValue() ==
									HigieneDataProvider.ESTADO_REALIZADO ? "y" : "n" );
					System.out.println( "DATA " + visita.get( MarcacoesEstabelecimentoData.DATA ) );
					Integer tecnico = ( Integer ) visita.get( MarcacoesEstabelecimentoData.TECNICO_HST );
					if( tecnico != null && tecnico.intValue() < 0 )
					{
						visita.set( MarcacoesEstabelecimentoData.TECNICO_HST, null );
					}
					Integer tecnicoSup = ( Integer ) visita.get( MarcacoesEstabelecimentoData.TECNICO_SUPERIOR_HST );
					if( tecnicoSup != null && tecnicoSup.intValue() < 0 )
					{
						visita.set( MarcacoesEstabelecimentoData.TECNICO_SUPERIOR_HST, null );
					}
					visita.save();
				}
				catch( Exception ex )
				{
					DialogException.showExceptionMessage( ex, "Erro a gravar", true );
					return false;
				}
				
				break;
		}
		reload( INDEX_MAIN );
		editing = false;
		return true;
	}

	public boolean delete(int index)
	{
		int option = JOptionPane.showConfirmDialog( this, "Tem a certeza que quer apagar a marca\u00e7\u00e3o?",
									"Apagar", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE );
		if( option == 0 )
		{
			switch( index )
			{
				case INDEX_VISITA:
					MarcacoesEstabelecimentoData visita = ( MarcacoesEstabelecimentoData ) marcacaoPanel.save();
					try
					{
						visita.delete();
					}
					catch( Exception ex )
					{
						DialogException.showExceptionMessage( ex, "Erro a apagar.", true );
						return false;
					}
					break;
			}
			reload( INDEX_MAIN );
			return true;
		}
		return false;
	}

	public void clear(int index)
	{
		switch( index )
		{
			case INDEX_MAIN:
				empresaID = null;
				empresa = null;
				estabelecimentoID = null;
				estabelecimento = null;
				upperPanel.clear();
				marcacaoEditorPanel.clear();
				break;
				
			case INDEX_VISITA:
				marcacaoPanel.clear();
				marcacaoPanel.getEmailButton().setText( "Enviar email" );
				break;
		}
	}

	public void enableComponents(int index, boolean enable)
	{
		switch( index )
		{
			case INDEX_MAIN:
				
				break;
			
			case INDEX_VISITA:
				marcacaoPanel.setEnabled( enable );
				marcacaoPanel.getEmailButton().setEnabled( enable );
				upperPanel.setEnabled( !enable );
				editing = enable;
				break;
		}
		if( tracker != null )
		{
			tracker.getAvisosPanel().setEnabled( !editing,
													AvisoConstants.TIPO_ESTABELECIMENTO );
		}
	}
	
	protected void enableSelect( int index, boolean select )
	{
		switch( index )
		{
			case INDEX_VISITA:
				marcacaoEditorPanel.setEnabled( select );
				break;
		}
	}
	
	public void reload( int index )
	{
		switch( index )
		{
			case INDEX_MAIN:
				try
				{
					empresa = provider.getEmpresa( empresaID );
					estabelecimento = ( EstabelecimentosData ) JDO.load( EstabelecimentosData.class, estabelecimentoID );
//					upperPanel.getEmpresaText().setText( empresa );
//					upperPanel.getEstabelecimentoText().setText( estabelecimento );
//					upperPanel.getTrabalhadorText().setText( ( String ) trabalhador.get( TrabalhadoresData.NOME ) );
					Object visitas[][] = provider.getVisitasEstabelecimento( estabelecimentoID );
					if( visitas.length > 0 )
					{
						marcacaoEditorPanel.setData( new Object2DArray( visitas ) );
					}
					else
					{
						marcacaoEditorPanel.clear();
					}
				}
				catch( Exception ex )
				{
					DialogException.showExceptionMessage( ex, "Erro a carregar os dados.", true );
				}
				break;
				
			case INDEX_VISITA:
				Integer visitaID = marcacaoEditorPanel.getID();
				if( visitaID == null )
				{
					return;
				}
				try
				{
					MarcacoesEstabelecimentoData visita = 
							( MarcacoesEstabelecimentoData ) JDO.load( MarcacoesEstabelecimentoData.class, visitaID );			
					marcacaoPanel.fill( visita );
					Date dataEmailVisita = ( Date ) visita.get( MarcacoesEstabelecimentoData.DATA_EMAIL );
					if( dataEmailVisita != null )
					{
						marcacaoPanel.getEmailButton().setText( "Enviar email (" + DATE_FORMAT.format( dataEmailVisita ) + ")" );
					}
					else
					{
						marcacaoPanel.getEmailButton().setText( "Enviar email" );
					}
				}
				catch( Exception ex )
				{
					DialogException.showExceptionMessage( ex, "Erro a carregar os dados da visita.", true );
				}
				break;
		}
	}
	
	public void actionPerformed( ActionEvent e )
	{
		Object source = e.getSource();
		if( source.equals( marcacaoPanel.getEmailButton() ) )
		{
			enviarEmailVisita();
		}
	}
		
	protected void enviarEmailVisita()
	{
		MarcacoesEstabelecimentoData visita = ( MarcacoesEstabelecimentoData ) marcacaoPanel.save();
		
		String subject = ( String ) Singleton.getInstance( SingletonConstants.SUBJECT_VISITA );
		String texto = ( String ) Singleton.getInstance( SingletonConstants.LETTER_VISITA );
		
		Date today = new Date();
		marcacaoPanel.getEmailButton().setText( "Enviar email (" + DATE_FORMAT.format( today ) + ")" );
		
		try
		{
			enviarEmail( subject, texto, ( Date )visita.get( MarcacoesEstabelecimentoData.DATA ) );
			visita.set( Marcacao.DATA_EMAIL, today );
		}
		catch( Exception ex )
		{
			DialogException.showExceptionMessage( ex, "Erro a enviar mail", true );
		}
	}
	
	protected void enviarEmail( String subject, String texto, Date data )
		throws Exception
	{
		String sede = ( String )estabelecimento.get( EstabelecimentosData.NOME );
		String dataStr = DATE_FORMAT.format( data );
		subject = subject.replaceAll( CompanyDataLoader.NOME, sede );
		String morada = ( String )estabelecimento.get( EstabelecimentosData.MORADA );
		
		texto = texto.replaceAll( CompanyDataLoader.DATA, dataStr );
		texto = texto.replaceAll( CompanyDataLoader.NOME, sede );
		texto = texto.replaceAll( CompanyDataLoader.MORADA, morada );
		
		ContactosData contacto = estabelecimento.toContacto_id();
		String mail = "";
		if( contacto != null )
		{
			mail = ( String )contacto.get( ContactosData.EMAIL );
		}
		
		if( System.getProperty( "os.name" ).startsWith( "Windows" ) )
		{
			mail = mail.replaceAll( " ", "%20" );
			subject = subject.replaceAll( " ", "%20" );
			texto = texto.replaceAll( " ", "%20" );
			Process proc = Runtime.getRuntime().exec( "cmd.exe /c start mailto:\"" + mail 
				+ "?subject=" + subject + "&body="

				+ texto
				 );
		}
		else
		{
			mail = mail.replaceAll( " ", "%20" );
			subject = subject.replaceAll( " ", "%20" );
			texto = texto.replaceAll( " ", "%20" );

			Process proc = Runtime.getRuntime().exec( new String[]{ "/usr/bin/open", "/Applications/Mail.app", "mailto:" + mail 
				+ "?subject=" + subject + "&body="
				+ texto } );
		}
	}
	
	public void valueChanged( ListSelectionEvent e )
	{
		Object source = e.getSource();
		if( source.equals( upperPanel ) )
		{
			Integer ids[] = ( Integer [] ) upperPanel.save();
			empresaID = ids[ 0 ];
			estabelecimentoID = ids[ 1 ];
			if( ids[ 1 ] == null )
			{
				clear( INDEX_MAIN );
				unselect( INDEX_MAIN ); 
			}
			else
			{
				reload( INDEX_MAIN );
				select( INDEX_MAIN );
			}
		}
	}
	
	public void setEmpresaAndEstabelecimento( Integer empresaID, Integer estabelecimentoID )
	{
		if( editing )
		{
			JOptionPane.showMessageDialog( this, "Esta janela est\u00e1 em edi\u00e7\u00e3o.", "Erro...",
					JOptionPane.ERROR_MESSAGE );
		}
		else
		{
			upperPanel.fill( new Integer[]{ empresaID, estabelecimentoID } );
		}
	}
	
	public void setTracker( SIPRPTracker tracker )
	{
		this.tracker = tracker;
	}
}
