package project;

import java.awt.Color;
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 javax.swing.*;
import javax.swing.border.Border;
import javax.swing.border.EtchedBorder;
import javax.swing.event.EventListenerList;
import javax.swing.table.AbstractTableModel;

public class ParticipantsForm extends JPanel implements ActionListener {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	Participant participant=new Participant();
	JTextField fieldID;
	JTextField fieldAge;	
	RadioButtons fieldGender;
	JTextField fieldEthinicity;
	JTextField fieldOccupation;
	JTextField fieldCountry;
	JTextField fieldOrigin;
	JTextField fieldEducation;
	JTable table; 
	
	JButton saveButton;
	JButton cancelButton;
	
	private EventListenerList listenersList=new EventListenerList();
	
	public ParticipantsForm(Participant p){
		this();
		participant=p;
		populateForm(p);
		
	}
	public ParticipantsForm(){
		Border emptyBorder=BorderFactory.createEmptyBorder(5, 5, 5, 5);
		Border lineBorder=BorderFactory.createLineBorder(Color.blue,1 , true);
		//Border etchBorder=BorderFactory.createEtchedBorder(EtchedBorder.RAISED);
		Border compoundBorder=BorderFactory.createCompoundBorder( emptyBorder,lineBorder);
		
		Dimension dimension=getPreferredSize();
		dimension.width=500;
		dimension.height=400;
		
		/* setting the border */
		setBorder(compoundBorder);
		setBackground(new Color(186	,219,241));
		
		
		/* Setting up Label for the Attributes */
		JLabel labelID=new JLabel("ID:");
		JLabel labelAge=new JLabel("Age:");
		JLabel labelGender=new JLabel("Gender:");
		JLabel labelEthinicity=new JLabel("Ethinicity:");
		JLabel labelOccupation=new JLabel("Occupation:");
		JLabel labelCountry=new JLabel("Country:");
		JLabel labelOrigin=new JLabel("Origin:");
		JLabel labelEducation=new JLabel("Education:");
		
		
		/* Setting up TextField for the Attributes */
		fieldID=new RoundedTextField("",10);
		fieldID.setEnabled(false);
		fieldAge=new RoundedTextField("",10);	
		fieldGender=new RadioButtons(new String[]{"Male","Female"},1);
		fieldEthinicity=new RoundedTextField("",20);	
		fieldOccupation=new RoundedTextField("",20);
		fieldCountry=new RoundedTextField("",20);
		fieldOrigin=new RoundedTextField("",20);
		fieldEducation=new RoundedTextField("",20);
		
		// Setting up Field Validation verifiers
		fieldAge.setInputVerifier(new NumericVerifier());
		fieldEthinicity.setInputVerifier(new TextVerifier());
		fieldOccupation.setInputVerifier(new TextVerifier());
		fieldCountry.setInputVerifier(new TextVerifier());
		fieldOrigin.setInputVerifier(new TextVerifier());
		fieldEducation.setInputVerifier(new TextVerifier());
		
		
		/* Setting up for Buttons */
		saveButton=new JButton("Save");
		saveButton.setActionCommand("save");
		saveButton.addActionListener(this);
		
		cancelButton=new JButton("View")	;
		cancelButton.setActionCommand("view");
		cancelButton.addActionListener(this);
		
		
		
		
		/*Setting up the LayoutManager(GridBagLayout) for the Panel */
		
		setLayout(new GridBagLayout());
		GridBagConstraints gc=new GridBagConstraints();
		
		/* Laying out all the Label fields */
		gc.anchor=GridBagConstraints.LINE_END;
		gc.insets=new Insets(5,5,5,5);
		gc.weightx=0.5;
		gc.weighty=0.5;
		
		gc.gridx=0;
		gc.gridy=0;
		add(labelID,gc);
		
		gc.gridy=1;
		add(labelAge,gc);
		
		gc.gridy=2;
		add(labelGender,gc);
		
		gc.gridy=3;
		add(labelEthinicity,gc);
		
		gc.gridy=4;
		add(labelOccupation,gc);
		
		gc.gridy=5;
		add(labelCountry,gc);
		
		gc.gridy=6;
		add(labelOrigin,gc);
		
		gc.gridy=7;
		add(labelEducation,gc);
		
		/* Laying out all the Text fields */
		
		gc.anchor=GridBagConstraints.LINE_START;
		gc.fill=GridBagConstraints.NONE;
		gc.weightx=1.0;
		gc.weighty=0.5;
		gc.gridwidth=2;
		
		gc.gridx=1;
		gc.gridy=0;
		add(fieldID,gc);
		
		gc.gridy=1;
		add(fieldAge,gc);
		
		gc.gridy=2;
		add(fieldGender,gc);
		
		gc.gridy=3;
		add(fieldEthinicity,gc);
		
		gc.gridy=4;
		add(fieldOccupation,gc);
		
		gc.gridy=5;
		add(fieldCountry,gc);
		
		gc.gridy=6;
		add(fieldOrigin,gc);
		
		gc.gridy=7;
		add(fieldEducation,gc);
		
		
		/* Laying out all the Buttons  */
		gc.anchor=GridBagConstraints.FIRST_LINE_END;
		gc.fill=GridBagConstraints.NONE;
		gc.weightx=0.5;
		gc.gridwidth=1;
		gc.weighty=10.0;
		
		gc.gridx=1;
		gc.gridy=8;
		
		add(saveButton,gc);
		
		gc.anchor=GridBagConstraints.FIRST_LINE_START;
		gc.fill=GridBagConstraints.NONE;
		gc.weightx=5;
		gc.weighty=8;
		
		gc.gridx=2;
		gc.gridy=8;
		add(cancelButton,gc);
		
		
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		if (e.getActionCommand().equals("save")){
			bindFormFields(participant);
			this.fireFormSaveEvent(new FormSaveEvent(this, "formDeatils"));
		}
		else if (e.getActionCommand().equals("view"))
			populateForm(participant);
		int row=table.getSelectedRow();
		int col=table.getSelectedColumn();
		
		for (int i=0 ;i<8;i++){
			((AbstractTableModel)table.getModel()).fireTableCellUpdated(row,i);
		}
		
		if (participant.getId()==0){
			((MyModel)table.getModel()).addRecord(participant);
		}
		
		
	}
	
	public void bindFormFields(Participant p)
	{
		if (p.id==0){
			p.setAge(Integer.parseInt(fieldAge.getText()));
			p.setGender(fieldGender.getSelectedValue());
			p.setCountry(fieldCountry.getText());
			p.setEducation(fieldEducation.getText());
			p.setEthnicity(fieldEthinicity.getText());
			p.setOccupation(fieldOccupation.getText());
			p.setOrigin(fieldOrigin.getText());	
			
		}
		else{
			
			p.setAge(Integer.parseInt(fieldAge.getText()));
			p.setGender(fieldGender.getSelectedValue());
			p.setCountry(fieldCountry.getText());
			p.setEducation(fieldEducation.getText());
			p.setEthnicity(fieldEthinicity.getText());
			p.setOccupation(fieldOccupation.getText());
			p.setOrigin(fieldOrigin.getText());	
		}
		
		System.out.println(p);
		
	}
	
	public void populateForm(Participant p){
		if (p.getId()!=0){
			participant=p;
			fieldID.setText(Integer.toString(p.getId()));
			fieldAge.setText(Integer.toString(p.getAge()));
			fieldEthinicity.setText(p.getEthnicity());
			fieldOccupation.setText(p.getOccupation());
			fieldCountry.setText(p.getCountry());
			fieldOrigin.setText(p.getOrigin());
			fieldEducation.setText(p.getEducation());
		}
		else{
			participant=p;
			fieldID.setText("");
			fieldAge.setText("");
			fieldEthinicity.setText("");
			fieldOccupation.setText("");
			fieldCountry.setText("");
			fieldOrigin.setText("");
			fieldEducation.setText("");

		}
			
		
	}
	
	public void setTable(JTable table){
		this.table=table;
	}
	
	public void fireFormSaveEvent(FormSaveEvent event){
		Object[] listeners=listenersList.getListenerList();
		System.out.println("Listeners count= "+listenersList.getListenerCount());
		System.out.println("Listeners count= "+listeners.length);
		for (int i=0;i<listeners.length;i +=2){
			if (listeners[i]==FormSaveListener.class){
				((FormSaveListener)listeners[i+1]).FormSaveOccured(event);
			}
			
		}
	}
	
	public void addFormSaveListener(FormSaveListener listener){
		listenersList.add(FormSaveListener.class, listener);
		System.out.println("Listeners count= "+listenersList.getListenerCount());
	}
	
	public void removeFormSaveListener(FormSaveListener listener){
		listenersList.remove(FormSaveListener.class, listener);
	}
	
}
