
package project;

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.DisplayMode;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import javax.swing.*;
import javax.swing.border.Border;
import javax.swing.border.EtchedBorder;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableModel;
import javax.swing.text.Document;


public class TestPadFrame  extends JFrame implements ActionListener,ListSelectionListener,TableModelListener {
	
	Repository repos=new Repository();
    int index=0;
    ParticipantsForm participantPanel;
    RelationshipsForm  relationshipPanel;
    Participant p;
    Relationships r;
    Interests interest;
    JTable table;
    FormConfiguration formConfigurator1;
    FormConfiguration formConfigurator2;
    FormConfiguration formConfigurator3;
    GenericForm3 form1;
    Map<String,GenericForm3> forms;
    JPanel contentPanel=null;
	
	public TestPadFrame(String title){
		super(title);
		setLayout(new BorderLayout());
		setJMenuBar(createMenuBar());
        //Set up the content pane.
        Container c= getContentPane();
       // c.setBackground(Color.gray);
        JPanel framePanel=new JPanel();
        framePanel.setBorder(BorderFactory.createEmptyBorder(7,5,7,5));
      //  contentPanel.getInsets().set(10, 10, 10, 10);
        framePanel.setBackground(new Color(186,219,241));
        framePanel.setLayout(new BorderLayout(4,4));
        c.add(framePanel,BorderLayout.CENTER);
        
        createTable1(framePanel);
      
	}
	
	private void createGUI1(Container c){
		
		final JTextArea textArea=new JTextArea();
        JButton button=new JButton("Button");
        TestPanel testPanel=new TestPanel();
        
        //c.add(textArea, BorderLayout.CENTER);
       // c.add(button,BorderLayout.SOUTH);
        c.add(testPanel,BorderLayout.CENTER);
        
        button.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				//textArea.append("Hello World \n");
				
			}
		});
	}
	
	private void createGUIForForms(Container c){
		
        RelationshipsForm  relationshipPanel=new RelationshipsForm();
       
        
        JScrollPane scrollPane=new JScrollPane(relationshipPanel);
        //c.add(button,BorderLayout.SOUTH);
        c.add(scrollPane,BorderLayout.CENTER);
	}
	
	private void createTabsForForms(Container c){
		
		 
		relationshipPanel=new RelationshipsForm();
		participantPanel=new ParticipantsForm(repos.getParticipant(index));
		//ParticipantsForm participantPanel=new ParticipantsForm();
        JTabbedPane tabbedPane=new JTabbedPane();
       
        
        JScrollPane scrollPane1=new JScrollPane(relationshipPanel);
        JScrollPane scrollPane2=new JScrollPane(participantPanel);
        tabbedPane.addTab("Participant", scrollPane2);
        tabbedPane.addTab("RelationShip", scrollPane1);
        tabbedPane.addTab("Interests", new JPanel());
        
        
        //c.add(button,BorderLayout.SOUTH);
        c.add(tabbedPane,BorderLayout.CENTER);
        
        JPanel headerPanel=new BorderPanel();
		headerPanel.setPreferredSize(new Dimension(200,30));
		headerPanel.setBackground(Color.white);
		
		JButton nextButton=new JButton("Next");
		nextButton.addActionListener(this);
		JButton previousButton=new JButton("Previous");
		previousButton.addActionListener(this);
		headerPanel.add(nextButton);
		headerPanel.add(previousButton);
		c.add(headerPanel, BorderLayout.NORTH);
	}
	
	public void   createTable(Container c) {
		
		
		
		JPanel  titlePanel=new JPanel();
		titlePanel.setPreferredSize(new Dimension(200,50));
		titlePanel.setBackground(Color.LIGHT_GRAY);
		titlePanel.setBorder(BorderFactory.createLineBorder(Color.black,1));
		titlePanel.setLayout(new BoxLayout(titlePanel, BoxLayout.LINE_AXIS));
		titlePanel.add(Box.createRigidArea(new Dimension(20,0)));
		//titlePanel.add(Box.createRigidArea(new Dimension(0,5)));
		JLabel label=new JLabel("Please Enter Search Text");
		titlePanel.add(label);
		titlePanel.add(Box.createRigidArea(new Dimension(5,0)));
		
	final	JTextField searchField=new JTextField(200);
		searchField.setPreferredSize(new Dimension(100,20));
		searchField.setMaximumSize(new Dimension(100,20));
		JTextArea textArea=new JTextArea(2,100);
		JScrollPane sPane1=new JScrollPane(textArea,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
		        JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
		titlePanel.add(sPane1);
		
		
		titlePanel.add(Box.createRigidArea(new Dimension(20,0)));
		JButton searchButton=new JButton("Search");
		titlePanel.add(searchButton);
		titlePanel.add(Box.createRigidArea(new Dimension(20,0)));
		
		c.add(titlePanel, BorderLayout.NORTH);
		
		
		//c.add(title, BorderLayout.NORTH);
	
		Border emptyBorder=BorderFactory.createEmptyBorder(2, 2, 2, 2);
		Border lineBorder=BorderFactory.createLineBorder(Color.white, 1, true);
		Border etchBorder=BorderFactory.createEtchedBorder(EtchedBorder.RAISED);
		Border compoundBorder=BorderFactory.createCompoundBorder( emptyBorder,lineBorder);
		
		JPanel  navPanel=new JPanel();
		navPanel.setPreferredSize(new Dimension(200,200));
		navPanel.setBorder(BorderFactory.createLineBorder(Color.black,1));
		Dimension dim=new Dimension(10,200);
		JButton uploadButton=new JButton("Batch Upload");
		JButton viewAllButton=new JButton("Show All Pariticipants");
		//viewAllButton.setBorder(emptyBorder);
		JButton viewTop5Button=new JButton("Show Top5 Pariticipants");
		JButton viewTop10Button=new JButton("Show Top10 Pariticipants");
		JButton viewBottom5Button=new JButton("Show Bottom5 Pariticipants");
		JButton viewBottom10Button=new JButton("Show Bottom10 Pariticipants");
		JButton addParticipantButton=new JButton("ADD New Participant");
		addParticipantButton.setActionCommand("add");
		JButton removeParticipantButton=new JButton("Remove Participant");
		removeParticipantButton.setActionCommand("remove");
		
		
		navPanel.setLayout(new BoxLayout(navPanel, BoxLayout.Y_AXIS));
		navPanel.add(Box.createRigidArea(new Dimension(20,0)));
		navPanel.add(Box.createRigidArea(new Dimension(0,5)));
		navPanel.add(uploadButton);
		navPanel.add(Box.createRigidArea(new Dimension(0,5)));
		navPanel.add(viewAllButton);
		navPanel.add(Box.createRigidArea(new Dimension(0,5)));
		navPanel.add(viewTop5Button);
		navPanel.add(Box.createRigidArea(new Dimension(0,5)));
		navPanel.add(viewTop10Button);
		navPanel.add(Box.createRigidArea(new Dimension(0,5)));
		navPanel.add(viewBottom5Button);
		navPanel.add(Box.createRigidArea(new Dimension(0,5)));
		navPanel.add(viewBottom10Button);
		navPanel.add(Box.createRigidArea(new Dimension(0,5)));
		navPanel.add(addParticipantButton);
		addParticipantButton.addActionListener(this);
		navPanel.add(Box.createRigidArea(new Dimension(0,5)));
		navPanel.add(removeParticipantButton);
		removeParticipantButton.addActionListener(this);
		
		navPanel.setBackground(new Color(225,232,237));
		c.add(navPanel, BorderLayout.WEST);
		
		
		
		
		
		TableView view=new TableView(repos.getParticipants(), repos.getParticipantsAttributes());
		String[] headers=repos.getParticipantsAttributes();
		 table=view.renderTable();
		 table.getModel().addTableModelListener(this);
		 ListSelectionModel listSelectionModel=table.getSelectionModel();
		 listSelectionModel.addListSelectionListener(this);
		JScrollPane sPane=new JScrollPane(table);
		table.setFillsViewportHeight(true);
		table.setPreferredScrollableViewportSize(new Dimension(750,200));
	//	table.setBackground(Color.YELLOW);
		
		 relationshipPanel=new RelationshipsForm();
		//participantPanel=new ParticipantsForm(repos.getParticipant(index));
		participantPanel=new ParticipantsForm();
		participantPanel.addFormSaveListener(new FormSaveListener() {
			
			@Override
			public void FormSaveOccured(FormSaveEvent event) {
				System.out.println("Formsave "+event.getFormDetails());
				
			}
		});
		
		participantPanel.setTable(table);
        JTabbedPane tabbedPane=new JTabbedPane();
        GenericForm1 genForm=new GenericForm1();
        
       // JScrollPane scrollPane1=new JScrollPane(relationshipPanel);
        JScrollPane scrollPane1=new JScrollPane(genForm);
        JScrollPane scrollPane2=new JScrollPane(participantPanel);
        tabbedPane.addTab("Participant", scrollPane2);
        tabbedPane.addTab("RelationShip", scrollPane1);
        tabbedPane.addTab("Interests", new JPanel());
        
		
		
		
		JPanel tablePanel=new JPanel();
		tablePanel.setPreferredSize(new Dimension(800,400));
		tablePanel.setBorder(BorderFactory.createLineBorder(Color.black,1));
		
		
		JPanel contentPanel=new JPanel();
		contentPanel.setBorder(BorderFactory.createLineBorder(Color.black,1));
		c.add(contentPanel, BorderLayout.CENTER);
		contentPanel.setLayout(new BoxLayout(contentPanel, BoxLayout.Y_AXIS));
		
		contentPanel.add(tabbedPane);
		tablePanel.add(sPane);
		
		contentPanel.add(Box.createVerticalGlue());
		
		contentPanel.add(tablePanel); 
		
		formConfigurator2=FormFactoryV2.getFormConfigurator2("project.Relationships",2);
		formConfigurator1=FormFactoryV2.getFormConfigurator1("project.Participant",1);
		formConfigurator3=FormFactoryV2.getFormConfigurator3("project.Interests",2);
		formConfigurator1.setRepository(repos);
		formConfigurator3.setRepository(repos);
		
		p=repos.getParticipant(1);
		r=repos.getRelationship(1);
		interest=repos.getInterests(1);
		
		//formConfigurator2.setFormData(r);
		//formConfigurator1.setFormData(p);
		form1=new GenericForm3(formConfigurator3);
	//	form1.addFormSaveListener(formConfigurator3);
		//formConfigurator2.bindForm(formPanel);
		//formConfigurator1.bind(p, formPanel);
		form1.bind(null);
		
		JScrollPane scrollFormPane1=new JScrollPane(form1);
		//contentPanel.add(scrollFormPane1);
		//contentPanel.add(new GenericForm1());
		
		
		JPanel footerPanel=new JPanel();
		footerPanel.setBackground(Color.blue);
		footerPanel.setPreferredSize(new Dimension(300,50));
		footerPanel.setBackground(new Color(64,128,255));
		footerPanel.setBorder(compoundBorder);
		JButton next=new JButton("NEXT");
		next.addActionListener(this);
		next.setActionCommand("next");
		JButton prev=new JButton("PREV");
		prev.setActionCommand("prev");
		prev.addActionListener(this);
		footerPanel.add(next);
		footerPanel.add(prev);
		
		
		c.add(footerPanel,BorderLayout.SOUTH);
		
		try {
			repos.TestReflection();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
	
public void   createTable1(Container c) {
		
		Border emptyBorder=BorderFactory.createEmptyBorder(5, 5, 5, 5);
		Border compoundBorder=BorderFactory.createCompoundBorder(new CustomBorder(2, Color.BLUE), emptyBorder);
		contentPanel=new JPanel();
		contentPanel.setBackground(new Color(186,219,241));
		//contentPanel.setLayout(new BoxLayout(contentPanel, BoxLayout.Y_AXIS));
		contentPanel.setLayout(new CardLayout(0, 0));
		contentPanel.setBorder(compoundBorder);
		
		JPanel contentPanel1=new JPanel();
		contentPanel1.setBackground(new Color(186,219,241));
		contentPanel1.setLayout(new BoxLayout(contentPanel1, BoxLayout.Y_AXIS));
		
		table=UIFactory.createTable(this, this, repos);
		JScrollPane sPane=new JScrollPane(table);
		
		FormFactory formFactory=new FormFactory(repos);
		forms=formFactory.getForms();
		JTabbedPane tabbedPane=UIFactory.createTabbedFormPanel1(forms);
		GenericForm3 tableForm=forms.get("Participant");
		tableForm.setTable(table);
		ImageIcon logo = new ImageIcon("logo.jpg");
		JLabel logoLabel = new JLabel(logo);
		
		contentPanel1.add(tabbedPane);
		contentPanel1.add(sPane);
		
		contentPanel.add(logoLabel,"home");
		contentPanel.add(contentPanel1,"FormTable");
		
		
		
		
		c.add(UIFactory.createTitlePanel(), BorderLayout.NORTH);
		c.add(UIFactory.createNavigationPanel(this), BorderLayout.WEST);
		c.add(UIFactory.createFooterPanel(this),BorderLayout.SOUTH);
		c.add(contentPanel, BorderLayout.CENTER);
		
		
		try {
			repos.TestReflection();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
	
	
	
	private JMenuBar createMenuBar(){
		JMenuBar menuBar=new JMenuBar();
		JMenu file=new JMenu("File");
		menuBar.add(file);
		JMenuItem newParticipant=new JMenuItem("New Participant");
		JMenuItem removeParticipant=new JMenuItem("Remove Participant");
		JMenuItem viewAll=new JMenuItem("Show All");
		JMenuItem upload=new JMenuItem("Batch Upload");
		JMenuItem exit=new JMenuItem("Exit");
		file.add(newParticipant);
		file.addSeparator();
		file.add(removeParticipant);
		file.addSeparator();
		file.add(viewAll);
		file.addSeparator();
		file.add(upload);
		file.addSeparator();
		file.add(exit);
		
		JMenu help=new JMenu("Help");
		menuBar.add(help);
		JMenuItem appHelp=new JMenuItem("Application Help");
		help.add(appHelp);
		
	
		
		return menuBar;
	}
	
	private void createTestPanel(Container c){
		
		Border emptyBorder=BorderFactory.createEmptyBorder(5, 5, 5, 5);
		Border lineBorder=BorderFactory.createLineBorder(Color.red, 5, true);
		Border etchBorder=BorderFactory.createEtchedBorder(EtchedBorder.RAISED);
		Border compoundBorder=BorderFactory.createCompoundBorder( emptyBorder,lineBorder);
		//Border compoundBorder1=BorderFactory.createCompoundBorder( compoundBorder,emptyBorder);
		
		JPanel panel1=new BorderPanel();
		panel1.setBorder(compoundBorder);
		panel1.setPreferredSize(new Dimension(200,200));
		FlowLayout flow=new FlowLayout();
		flow.setAlignment(FlowLayout.LEFT);
		panel1.setLayout(flow);
		RadioButtons panel3=new RadioButtons(new String[]{"1","2","3"},1);
		panel1.add(panel3,FlowLayout.LEFT);
		
		c.add(panel1,BorderLayout.CENTER);
		
		JPanel panel2=new BorderPanel();
		panel2.setPreferredSize(new Dimension(200,200));
		panel2.setBackground(Color.white);
		
		final JTextField field=new JTextField(10);
		JButton button=new JButton("Save");
		button.addActionListener( new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				field.setText(String.valueOf(panel3.getSelectedValue()));
				
			}
		});
		panel2.add(field);
		panel2.add(button);
		
		c.add(panel2,BorderLayout.SOUTH);
		
		
		
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		String command=e.getActionCommand();
		if (command.equals("AddParticipant")){
			MyModel model=(MyModel)table.getModel();
			model.setTableData(repos.getParticipants());
			CardLayout cLayout=(CardLayout)contentPanel.getLayout();
			cLayout.show(contentPanel, "FormTable");
			for (String formName : forms.keySet()){
				forms.get(formName).bind(null);
			}
		}
		if (command.equals("RemoveParticipant")){
			MyModel model=(MyModel)table.getModel();
			model.setTableData(repos.getParticipants());
			int selectedRow=table.getSelectedRow();
			int id=(Integer) table.getModel().getValueAt(selectedRow, 0);
			p=repos.getParticipant(id);
			model=(MyModel)table.getModel();
			model.removeRecord(p,selectedRow);
			repos.deleteRecords(forms);
			for (String formName : forms.keySet()){
				forms.get(formName).bind(null);
			}
			
		}
		else if (command.equals("home")){
			CardLayout cLayout=(CardLayout)contentPanel.getLayout();
			cLayout.show(contentPanel, "home");
		}
		else if (command.equals("Show All")){
			MyModel model=(MyModel)table.getModel();
			model.setTableData(repos.getParticipants());
			TableModelEvent event=new TableModelEvent(model, -1);
			model.fireTableChanged(event);
			CardLayout cLayout=(CardLayout)contentPanel.getLayout();
			cLayout.show(contentPanel, "FormTable");
			table.setRowSelectionInterval(0, 0);
		}
		else if (command.equals("next") || command.equals("prev")){
				int rowCount=table.getRowCount();
				System.out.println("rowcount="+rowCount);
				if (table.getSelectedRow()!=-1){
					index=table.getSelectedRow();
					System.out.println("selectedrow="+index);
					if (command.equals("next")){
						index=(index==rowCount-1)?index:++index;
					}
					else{
						index=(index==0)?index:--index;
					}
				}
				else index=0 ;
				int id=(Integer) table.getModel().getValueAt(index, 0);
				p=repos.getParticipant(id);
				r=repos.getRelationship(id);
				interest=repos.getInterests(id);
				if (p==null){
					index=0;
				}
				else{
					forms.get("Participant").bind(p);
					forms.get("Relationship").bind(r);
					forms.get("Interests").bind(interest);
					table.setRowSelectionInterval(index, index);
				}
		}
		else if (command.contains("Top")  || command.contains("Bottom")){
			String topOrBottom=command.contains("Top")?"Top":"Bottom";
			int noOfParticipants=command.contains("10")?10:5;
			List<Participant> participantList=RelatioshipRatingService.getNParticipants(repos,topOrBottom, noOfParticipants);
			MyModel model=(MyModel)table.getModel();
			model.setTableData(participantList);
			TableModelEvent event=new TableModelEvent(model, -1);
			//event.notify();
			model.fireTableChanged(event);
			index=0;
			forms.get("Participant").bind(p);
			forms.get("Relationship").bind(r);
			forms.get("Interests").bind(interest);
			table.setRowSelectionInterval(index, index);
			CardLayout cLayout=(CardLayout)contentPanel.getLayout();
			cLayout.show(contentPanel, "FormTable");
			
			
		}
			

	}

	@Override
	public void valueChanged(ListSelectionEvent e) {
		System.out.println(table.getSelectedRow()+1);
		int row=table.getSelectedRow();
		if (row!=-1){
			int id=(Integer) table.getModel().getValueAt(row, 0);
			//p=repos.getParticipant(row+1);
			//int id=p.getId();
			index=id;
			//participantPanel.populateForm(p);
			//relationshipPanel.populateForm(repos.getRelationship(table.getSelectedRow()+1));
			r=repos.getRelationship(id);
			p=repos.getParticipant(id);
			interest=repos.getInterests(id);
			forms.get("Participant").bind(p);
			forms.get("Relationship").bind(r);
			forms.get("Interests").bind(interest);
		}
		
	}



	public void createTestPanel1(Container c){
		

		Border emptyBorder=BorderFactory.createEmptyBorder(15, 15, 15,15);
		Border lineBorder=BorderFactory.createLineBorder(Color.blue, 1, false);
		Border compoundBorder=BorderFactory.createCompoundBorder( new CustomBorder(1,Color.blue),emptyBorder);
		
		FlowLayout flowLayout=new FlowLayout(FlowLayout.LEFT);
		JPanel centerPanel=new JPanel();
		centerPanel.setBackground(new Color(186,219,241));
		centerPanel.setLayout(flowLayout);
		
		JPanel leftPanel=new JPanel();
		//leftPanel.setBackground(new Color(64,128,255));
		leftPanel.setBackground(new Color(186,219,241));
		leftPanel.setPreferredSize(new Dimension(200,100));
		leftPanel.setBorder(compoundBorder);
		
		JPanel topPanel=new JPanel();
		topPanel.setBackground(new Color(57,88,153));
		//topPanel.setPreferredSize(new Dimension(200,50));
		topPanel.setBackground(new Color(255,255,255));
		topPanel.setLayout(new FlowLayout(FlowLayout.RIGHT, 5,0));
		topPanel.setBorder(compoundBorder);
		
		JPanel footerPanel=new JPanel();
		footerPanel.setBackground(Color.blue);
		footerPanel.setPreferredSize(new Dimension(400,50));
		footerPanel.setBackground(new Color(64,128,255));
		footerPanel.setBorder(compoundBorder);
		
		
		//textField.setBorder(compoundBorder);
		Font fieldFont = new Font("Arial", Font.PLAIN, 12);
        
		
		JLabel label=new JLabel("This is Label");
		
		JButton button=new JButton("Test");
		RoundedTextField textField1=new RoundedTextField("Jeya",20);
		RoundedTextField textField2=new RoundedTextField("Jeya",20);
		topPanel.add(textField2);
		
		centerPanel.add(textField1);
		centerPanel.add(button);
		
		centerPanel.setBorder( compoundBorder);
		
		formConfigurator1=FormFactoryV2.getFormConfigurator1("project.Participant",2);
		//contentPanel.add(new GenericForm3(formConfigurator));
		
		GenericForm3 formPanel=new GenericForm3(formConfigurator1);
		formPanel.addFormSaveListener(new FormSaveListener() {
			
			@Override
			public void FormSaveOccured(FormSaveEvent event) {
				System.out.println("I am Clicked");
				
			}
		});
		formPanel.setBorder(compoundBorder);
		JScrollPane scrollPane1=new JScrollPane(formPanel);
		
		c.add(scrollPane1,BorderLayout.CENTER);
		//c.add(centerPanel,BorderLayout.CENTER);
		c.add(leftPanel,BorderLayout.WEST);
		c.add(topPanel,BorderLayout.NORTH);
		c.add(footerPanel,BorderLayout.SOUTH);
		
	}

	@Override
	public void tableChanged(TableModelEvent e) {
		
		System.out.println("Table Changed");
		System.out.println(e.getFirstRow());
		System.out.println("col="+e.getColumn());
		
		
		
	}
	
	
	

	
	

}
