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

package siprp.medicina.locais_realizacao;

import com.evolute.utils.data.IDObject;
import com.evolute.utils.data.MappableObject;
import com.evolute.utils.tables.BaseTable;
import com.evolute.utils.tables.ColumnizedMappable;
import com.evolute.utils.tables.VectorTableModel;
import com.evolute.utils.tracker.TrackableWindow;
import com.evolute.utils.ui.DialogException;
import com.evolute.utils.ui.calendar.JCalendarPanel;
import info.clearthought.layout.TableLayout;
import info.clearthought.layout.TableLayoutConstraints;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Arrays;
import java.util.Date;
import java.util.Vector;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ListSelectionModel;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import siprp.data.Marcacao;
import siprp.medicina.prestadores.PrestadoresDataProvider;

/**
 *
 * @author fpalma
 */
public class LocaisRealizacaoWindow extends JFrame
		implements ActionListener, TrackableWindow, ListSelectionListener
{
	protected static final Integer PRESTADOR_ID_SIPRP = new Integer( -1 );
	
	protected static final IDObject PRESTADOR_SIPRP = new MappableObject( PRESTADOR_ID_SIPRP, "SIPRP" );
	
	protected JCalendarPanel dataPanel;
	protected JButton carregarButton;
	protected JButton recarregarPrestadoresButton;
	protected VectorTableModel empresasModel;
	protected BaseTable empresasTable;
	protected VectorTableModel estabelecimentosModel;
	protected BaseTable estabelecimentosTable;
	protected JLabel numeroConsultasLabel;
	protected JComboBox prestadoresConsultasCombo;
	protected JButton enviarConsultasButton;
	protected JButton faxConsultasButton;
	protected JLabel numeroECDsLabel;
	protected JComboBox prestadoresECDsCombo;
	protected JButton enviarECDsButton;
	protected JButton faxECDsButton;
	
	
	protected LocaisRealizacaoDataProvider provider;
	protected PrestadoresDataProvider prestadoresProvider;
	
	/**
	 * Creates a new instance of LocaisRealizacaoWindow
	 */
	public LocaisRealizacaoWindow()
		throws Exception
	{
		provider = LocaisRealizacaoDataProvider.getProvider();
		prestadoresProvider = PrestadoresDataProvider.getProvider();
		setupComponents();
	}
	
	private void setupComponents()
	{
		setTitle( "Locais de Realiza\u00e7\u00e3o" );
		setSize( 1000, 700 );
		JLabel dataLabel = new JLabel( "Data" );
		dataPanel = new JCalendarPanel( this );
		
		carregarButton = new JButton( "Carregar" );
		carregarButton.addActionListener( this );
		recarregarPrestadoresButton = new JButton( "Recarregar Prestadores" );
		recarregarPrestadoresButton.addActionListener( this );
		empresasModel = new VectorTableModel( new String[]{ "empresa" } );
		empresasTable = new BaseTable( empresasModel );
		empresasTable.setSelectionMode( ListSelectionModel.SINGLE_SELECTION );
		empresasTable.getSelectionModel().addListSelectionListener( this );
		JScrollPane empresasScp = new JScrollPane( empresasTable, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
													JScrollPane.HORIZONTAL_SCROLLBAR_NEVER );
		estabelecimentosModel = new VectorTableModel( new String[]{ "estabelecimento" } );
		estabelecimentosTable = new BaseTable( estabelecimentosModel );
		estabelecimentosTable.setSelectionMode( ListSelectionModel.SINGLE_SELECTION );
		estabelecimentosTable.getSelectionModel().addListSelectionListener( this );
		JScrollPane estabelecimentosScp = new JScrollPane( estabelecimentosTable, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
													JScrollPane.HORIZONTAL_SCROLLBAR_NEVER );
		JPanel consultasPanel = new JPanel();
		consultasPanel.setBorder( BorderFactory.createTitledBorder( 
					BorderFactory.createEtchedBorder(), "Consultas" ) );
		JLabel consultasLabel = new JLabel( "Quantidade " );
		numeroConsultasLabel = new JLabel( "   " );
		numeroConsultasLabel.setForeground( Color.green.darker() );
		prestadoresConsultasCombo = new JComboBox();
		enviarConsultasButton = new JButton( "Atribuir" );
		enviarConsultasButton.addActionListener( this );
		faxConsultasButton = new JButton( "Fax" );
		faxConsultasButton.addActionListener( this );
		JPanel ecdsPanel = new JPanel();
		ecdsPanel.setBorder( BorderFactory.createTitledBorder( 
					BorderFactory.createEtchedBorder(), "ECDs" ) );
		JLabel ecdsLabel = new JLabel( "Quantidade " );
		numeroECDsLabel = new JLabel( "   " );
		numeroECDsLabel.setForeground( Color.green.darker() );
		prestadoresECDsCombo = new JComboBox();
		enviarECDsButton = new JButton( "Atribuir" );
		enviarECDsButton.addActionListener( this );
		faxECDsButton = new JButton( "Fax" );
		faxECDsButton.addActionListener( this );
		dataPanel.addChangeListener( new ChangeListener(){
			public void stateChanged(ChangeEvent e)
			{
				empresasTable.clearSelection();
				Vector values = empresasModel.getValues();
				values.clear();
				empresasModel.setValues( values );
			}
		} );
		
		getContentPane().setLayout( new BorderLayout( 5, 5 ) );
		JPanel upperPanel = new JPanel();
		getContentPane().add( upperPanel, BorderLayout.NORTH );
		JPanel centerPanel = new JPanel();
		getContentPane().add( centerPanel, BorderLayout.CENTER );
		
		upperPanel.setLayout( new FlowLayout( FlowLayout.CENTER ) );
		upperPanel.add( dataLabel );
		upperPanel.add( dataPanel );
		upperPanel.add( carregarButton );
		upperPanel.add( recarregarPrestadoresButton );
		
		centerPanel.setLayout( new GridLayout( 1, 3 ) );
		centerPanel.add( empresasScp );
		centerPanel.add( estabelecimentosScp );
		JPanel detalhesPanel = new JPanel();
		centerPanel.add( detalhesPanel );
		
		double cols[] = 
				new double[]{ TableLayout.MINIMUM, TableLayout.FILL };
		double rows[] = 
				new double[]{ TableLayout.MINIMUM, TableLayout.MINIMUM, TableLayout.MINIMUM };
		
		TableLayout tableLayout = new TableLayout( cols,rows );
		consultasPanel.setLayout( tableLayout );
		
		consultasPanel.add( consultasLabel, new TableLayoutConstraints( 0, 0 ) );
		consultasPanel.add( numeroConsultasLabel, new TableLayoutConstraints( 1, 0 ) );
		consultasPanel.add( prestadoresConsultasCombo, new TableLayoutConstraints( 0, 1, 1, 1 ) );
		consultasPanel.add( enviarConsultasButton, new TableLayoutConstraints( 0, 2, 1, 2 ) );
//		consultasPanel.add( faxConsultasButton, new TableLayoutConstraints( 0, 3, 1, 3 ) );
		
		rows = new double[]{ TableLayout.MINIMUM, TableLayout.MINIMUM, TableLayout.MINIMUM, TableLayout.MINIMUM };
						
		tableLayout = new TableLayout( cols,rows );
		ecdsPanel.setLayout( tableLayout );
		
		ecdsPanel.add( ecdsLabel, new TableLayoutConstraints( 0, 0 ) );
		ecdsPanel.add( numeroECDsLabel, new TableLayoutConstraints( 1, 0 ) );
		ecdsPanel.add( prestadoresECDsCombo, new TableLayoutConstraints( 0, 1, 1, 1 ) );
		ecdsPanel.add( enviarECDsButton, new TableLayoutConstraints( 0, 2, 1, 2 ) );
		ecdsPanel.add( faxECDsButton, new TableLayoutConstraints( 0, 3, 1, 3 ) );
		
		cols = new double[]{ TableLayout.FILL };
		rows = new double[]{ TableLayout.PREFERRED, TableLayout.PREFERRED, TableLayout.FILL };
		
		tableLayout = new TableLayout( cols,rows );
		detalhesPanel.setLayout( tableLayout );
		
		detalhesPanel.add( consultasPanel, new TableLayoutConstraints( 0, 0 ) );
		detalhesPanel.add( ecdsPanel, new TableLayoutConstraints( 0, 1 ) );
		
		setDefaultCloseOperation( WindowConstants.DO_NOTHING_ON_CLOSE );
		addWindowListener( new WindowAdapter(){
			public void windowClosing( WindowEvent e )
			{
				close();
			}
			
			public void windowOpened( WindowEvent e )
			{
//				setExtendedState( getExtendedState() | MAXIMIZED_BOTH );
			}
			
		} );
		dataPanel.setDate( new Date() );
		recarregarPrestadores();
		carregar();
	}

	public void refresh()
	{
	}

	public void open()
	{
		setVisible( true );
	}
	
	public void close()
	{
		SwingUtilities.invokeLater( new Runnable() {
			public void run()
			{
				setVisible( false );
				dispose();
			}
		} );
	}

	public boolean closeIfPossible()
	{
		close();
		return true;
	}

	public void actionPerformed(ActionEvent e)
	{
		Object source = e.getSource();
		if( source.equals( carregarButton ) )
		{
			carregar();
		}
		else if( source.equals( recarregarPrestadoresButton ) )
		{
			recarregarPrestadores();
		}
		else if( source.equals( enviarConsultasButton ) )
		{
			enviarConsultas();
		}
		else if( source.equals( faxConsultasButton ) )
		{
			faxConsultas();
		}
		else if( source.equals( enviarECDsButton ) )
		{
			enviarECDs();
		}
		else if( source.equals( faxECDsButton ) )
		{
			faxECDs();
		}
		
	}

	public void valueChanged(ListSelectionEvent e)
	{
		Object source = e.getSource();
		if( e.getValueIsAdjusting() )
		{
			return;
		}
		if( source.equals( empresasTable.getSelectionModel() ) )
		{
			mudarEmpresa();
		}
		else if( source.equals( estabelecimentosTable.getSelectionModel() ) )
		{
			mudarEstabelecimento();
		}
	}
	
	protected void carregar()
	{
		empresasTable.clearSelection();
		Date data = dataPanel.getDate();
		if( data == null )
		{
			empresasModel.clearAll();
			return;
		}
		try
		{
			ColumnizedMappable empresas[] = provider.getEmpresasComMarcacoes( data );
			Vector values = empresasModel.getValues();
			values.clear();
			values.addAll( Arrays.asList( empresas ) );
			empresasModel.setValues( values );
		}
		catch( Exception ex )
		{
			DialogException.showExceptionMessage( ex, "Erro a carregar empresas", true );
		}
	}
	
	protected void mudarEmpresa()
	{
		estabelecimentosTable.clearSelection();
		Date data = dataPanel.getDate();
		int selected = empresasTable.getSelectedRow();
		if( data == null || selected == -1 )
		{
			estabelecimentosModel.clearAll();
			return;
		}
		Integer empresaID = ( ( ColumnizedMappable ) empresasModel.getRowAt( selected ) ).getID();
		try
		{
			ColumnizedMappable estabelecimentos[] = 
					provider.getEstabelecimentosComMarcacoesByEmpresa( empresaID, data );
			Vector values = estabelecimentosModel.getValues();
			values.clear();
			values.addAll( Arrays.asList( estabelecimentos ) );
			estabelecimentosModel.setValues( values );
		}
		catch( Exception ex )
		{
			DialogException.showExceptionMessage( ex, "Erro a carregar estabelecimentos", true );
		}
	}
	
	protected void mudarEstabelecimento()
	{
		Date data = dataPanel.getDate();
		int selectedEstabelecimento = estabelecimentosTable.getSelectedRow();
		numeroConsultasLabel.setText( "   " );
		numeroECDsLabel.setText( "   " );
		enviarConsultasButton.setEnabled( false );
		enviarECDsButton.setEnabled( false );
		if( data == null || selectedEstabelecimento == -1 )
		{
			return;
		}
		Integer estabelecimentoID = ( ( ColumnizedMappable ) estabelecimentosModel.getRowAt( selectedEstabelecimento ) ).getID();
		try
		{
			int countConsultas = 
					provider.getNumeroMarcacoesByEstabelecimentoAndTipo( estabelecimentoID, 
							Marcacao.TIPO_MARCACAO_TRABALHADOR_CONSULTA, data );
			int countECDs = 
					provider.getNumeroMarcacoesByEstabelecimentoAndTipo( estabelecimentoID, 
							Marcacao.TIPO_MARCACAO_TRABALHADOR_EXAMES, data );
			if( countConsultas > 0 )
			{
				numeroConsultasLabel.setText( "" + countConsultas );
				enviarConsultasButton.setEnabled( true );
				Integer[] escolhidos =
						provider.getPrestadoresIDByEstabelecimentoAndTipo( estabelecimentoID, 
											Marcacao.TIPO_MARCACAO_TRABALHADOR_CONSULTA, data );
				if( escolhidos.length == 1 )
				{
					numeroConsultasLabel.setForeground( Color.green.darker() );
				}
				else
				{
					numeroConsultasLabel.setForeground( Color.red.darker() );
				}
				int e;
				for( e = 0; e < escolhidos.length; e++ )
				{
					if( escolhidos[ e ] != null )
					{
						break;
					}
				}
				if( e == escolhidos.length || escolhidos[ e ] == null )
				{
					prestadoresConsultasCombo.setSelectedIndex( 0 );
				}
				else
				{
					for( int p = 0; p < prestadoresConsultasCombo.getItemCount(); p++ )
					{
						IDObject prestador = ( IDObject ) prestadoresConsultasCombo.getItemAt( p );
						if( prestador.getID().equals( escolhidos[ e ] ) )
						{
							prestadoresConsultasCombo.setSelectedIndex( p );
						}
					}
				}
			}
			if( countECDs > 0 )
			{
				numeroECDsLabel.setText( "" + countECDs );
				enviarECDsButton.setEnabled( true );
				Integer[] escolhidos =
						provider.getPrestadoresIDByEstabelecimentoAndTipo( estabelecimentoID, 
											Marcacao.TIPO_MARCACAO_TRABALHADOR_EXAMES, data );
				if( escolhidos.length == 1 )
				{
					numeroECDsLabel.setForeground( Color.green.darker() );
				}
				else
				{
					numeroECDsLabel.setForeground( Color.red.darker() );
				}
				int e;
				for( e = 0; e < escolhidos.length; e++ )
				{
					if( escolhidos[ e ] != null )
					{
						break;
					}
				}
				if( e == escolhidos.length || escolhidos[ e ] == null )
				{
					prestadoresECDsCombo.setSelectedIndex( 0 );
				}
				else
				{
					for( int p = 0; p < prestadoresECDsCombo.getItemCount(); p++ )
					{
						IDObject prestador = ( IDObject ) prestadoresECDsCombo.getItemAt( p );
						if( prestador.getID().equals( escolhidos[ e ] ) )
						{
							prestadoresECDsCombo.setSelectedIndex( p );
						}
					}
				}
			}
		}
		catch( Exception ex )
		{
			DialogException.showExceptionMessage( ex, "Erro a carregar detalhes", true );
		}
	}
	
	protected void recarregarPrestadores()
	{
		try
		{
			IDObject prestadoresConsultas[] = prestadoresProvider.getPrestadoresConsultasActivos();
			IDObject prestadoresECDs[] = prestadoresProvider.getPrestadoresECDsActivos();
			prestadoresConsultasCombo.removeAllItems();
			prestadoresConsultasCombo.addItem( PRESTADOR_SIPRP );
			for( int n = 0; n < prestadoresConsultas.length; n++ )
			{
				prestadoresConsultasCombo.addItem( prestadoresConsultas[ n ] );
			}
			prestadoresECDsCombo.removeAllItems();
			prestadoresECDsCombo.addItem( PRESTADOR_SIPRP );
			for( int n = 0; n < prestadoresECDs.length; n++ )
			{
				prestadoresECDsCombo.addItem( prestadoresECDs[ n ] );
			}
		}
		catch( Exception ex )
		{
			DialogException.showExceptionMessage( ex, "Erro a carregar prestadores", true );
		}
	}
	
	protected void enviarECDs()
	{
		Date data = dataPanel.getDate();
		int selectedEstabelecimento = estabelecimentosTable.getSelectedRow();
		if( data == null || selectedEstabelecimento == -1 )
		{
			return;
		}
		Integer estabelecimentoID = ( ( ColumnizedMappable ) estabelecimentosModel.getRowAt( selectedEstabelecimento ) ).getID();
		try
		{
			Integer prestadorID = ( ( IDObject ) prestadoresECDsCombo.getSelectedItem() ).getID();
			if( PRESTADOR_ID_SIPRP.equals( prestadorID ) )
			{
				prestadorID = null;
			}
			provider.setPrestadorIDForEstabelecimentoAndTipo( estabelecimentoID, 
					Marcacao.TIPO_MARCACAO_TRABALHADOR_EXAMES, data, prestadorID );
		}
		catch( Exception ex )
		{
			DialogException.showExceptionMessage( ex, "Erro a atribuir", true );
		}
	}
	
	protected void faxECDs()
	{
		Date data = dataPanel.getDate();
		int selectedEstabelecimento = estabelecimentosTable.getSelectedRow();
		if( data == null || selectedEstabelecimento == -1 )
		{
			return;
		}
		Integer estabelecimentoID = ( ( ColumnizedMappable ) estabelecimentosModel.getRowAt( selectedEstabelecimento ) ).getID();
		try
		{
			Integer prestadorID = ( ( IDObject ) prestadoresECDsCombo.getSelectedItem() ).getID();
			if( PRESTADOR_ID_SIPRP.equals( prestadorID ) )
			{
				prestadorID = null;
			}
			provider.setPrestadorIDForEstabelecimentoAndTipo( estabelecimentoID, 
					Marcacao.TIPO_MARCACAO_TRABALHADOR_EXAMES, data, prestadorID );
		}
		catch( Exception ex )
		{
			DialogException.showExceptionMessage( ex, "Erro a atribuir", true );
		}
	}
	
	protected void enviarConsultas()
	{
		Date data = dataPanel.getDate();
		int selectedEstabelecimento = estabelecimentosTable.getSelectedRow();
		if( data == null || selectedEstabelecimento == -1 )
		{
			return;
		}
		Integer estabelecimentoID = ( ( ColumnizedMappable ) estabelecimentosModel.getRowAt( selectedEstabelecimento ) ).getID();
		try
		{
			Integer prestadorID = ( ( IDObject ) prestadoresConsultasCombo.getSelectedItem() ).getID();
			if( PRESTADOR_ID_SIPRP.equals( prestadorID ) )
			{
				prestadorID = null;
			}
			provider.setPrestadorIDForEstabelecimentoAndTipo( estabelecimentoID, 
					Marcacao.TIPO_MARCACAO_TRABALHADOR_CONSULTA, data, prestadorID );
		}
		catch( Exception ex )
		{
			DialogException.showExceptionMessage( ex, "Erro a atribuir", true );
		}
	}
	
	protected void faxConsultas()
	{
	}
}
