package framePackage;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;

import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.DefaultCellEditor;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.KeyStroke;
import javax.swing.SpringLayout;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableColumn;

import componentPackage.VComponentType;

import backupPackage.AdjustUndoList;
import backupPackage.Edit;
import backupPackage.ParamUndoList;
import basicPackage.FlowType;
import basicPackage.VRoom;

import assistPackage.AdjustData;
import assistPackage.AdjustRoom;
import assistPackage.NumberField;

public class AdjustPanel extends TabPanel{
	private JPanel _tablePanel;
	private FlowType _flowType;
	private JScrollPane _scrollPane;
	private AdjustTable _table1, _table2, _table4, _table3;
//	private boolean _rigidArea2to3;
	private int _selectedTabel;
	private JButton _btNextStep, _btPreviousStep; 
	private int _step;
	private JLabel _lbInfo;
	public static final int NO_SELECTIE = 0;
	
	public AdjustPanel(FlowType flowType){
		super();
		_undoList = new AdjustUndoList(this);
//		_undoList.setParent(this);

		setLayout(new BorderLayout());
		_flowType = flowType;
		_step = 0;
		
		JPanel buttonPanel = new JPanel();//new SpringLayout());
		buttonPanel.setLayout(new FlowLayout(FlowLayout.RIGHT, 20, 10));
//		buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.LINE_AXIS));
//		buttonPanel.setMaximumSize(new Dimension(1000, 50));
		int margin = 200;//Program.getFrame().getPreferredSize().width - 1000;
		System.out.println("AdjustPanel.initializePanel(): width=" + margin);
		buttonPanel.add(Box.createRigidArea(new Dimension(margin/2, 0)));
		_lbInfo = new JLabel("Klik op 'Initializeer' om de ventielen en debieten in te vullen");
		buttonPanel.add(_lbInfo);
		
		Action action = new AbstractAction() {
			@Override
			public void actionPerformed(ActionEvent arg0) {
				if (_step == 0){	
					addTable1And2(true);		//haal ventielgegevens op
				}
				else if (_step == 1){	//vul ventilator1 in
					showNextStep(1);
				}
				else if (_step == 2){	//vul meetgegevens in
					addTable3And4();			//maak tabel 3 en 4 aan, zet ventielen in juiste volgorde
				}
				else if (_step == 3){	//stel ventielen in praktijk af
					if (Program.getVentilatie().getAdjustData(_flowType).getVentilatorFlow() <= 0){
						JOptionPane.showMessageDialog(null, 
								"Het ventilatorinstelling 'uw keuze (1)' is niet ingevuld", 
								"Maak je keuze vooraleer verder te gaan",JOptionPane.ERROR_MESSAGE);
					}
					else {
						_table3.calculateVentilator1();//bereken ventilator2
						showNextStep(1);	//_step=4
					}
				}
				else if (_step == 4){	//vul ventilator(2) in					
					showNextStep(1);	//_step=5
				}
				else if (_step == 5){	//vul meetgegvens2 in
					_table4.calculateVentilator2();//bereken ventilator3
					showNextStep(1);	//_step=6
				}
				else if (_step == 6){	//vul ventilator(3) in
					showNextStep(1);	//_step=7	
				}
				else if (_step == 7){	//vul specifiek debiet in van ventiel met laagste ratio
					int notOK = _table4.getBadRatio(false, false);
					if (notOK > 0){
						int option = JOptionPane.showConfirmDialog(null, 
								"Wil je toch doorgaan naar de volgende stap?", 
								"Het ventiel voldoet niet aan eis/ontwerp", JOptionPane.YES_NO_CANCEL_OPTION);
						if (option == JOptionPane.YES_OPTION) showNextStep(1);
					}						
					else showNextStep(1);	//_step=8
				}
				else if (_step == 8){	//vul de overige debieten in
					int notOK = _table4.getBadRatio(false, true);
					if (notOK > 0){
						int option = JOptionPane.showConfirmDialog(null, 
								"Wil je toch doorgaan naar de volgende stap?", 
								"Niet alle ventielen voldoen aan eis/ontwerp", JOptionPane.YES_NO_CANCEL_OPTION);
						if (option == JOptionPane.YES_OPTION) showNextStep(1);
					}						
					else showNextStep(1);	//_step=9
				}
			}
		};
		_btNextStep = new JButton(action);
		_btNextStep.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0), "init");
		_btNextStep.getActionMap().put("init", action);
		_btNextStep.setText("Initializeer");
		buttonPanel.add(_btNextStep);
		_btNextStep.setEnabled(true);

		_btPreviousStep = new JButton("Vorige stap");
		_btPreviousStep.addActionListener(new ActionListener() {		
			@Override
			public void actionPerformed(ActionEvent arg0) {
				if (_step == 1){
					_table1.setVisible(false);
					_table2.setVisible(false);
					_table2.getTableHeader().setVisible(false);
					_scrollPane.setViewportView(_tablePanel);
				}
				else if (_step == 3){
					_table3.setVisible(false);
					_table4.setVisible(false);
					_table4.getTableHeader().setVisible(false);
//					_tablePanel.remove(_table3);
//					_tablePanel.remove(_table4.getTableHeader());
//					_tablePanel.remove(_table4);
					_scrollPane.setViewportView(_tablePanel);
				}
				showNextStep(-1);
			}
		});
		buttonPanel.add(_btPreviousStep);
		_btPreviousStep.setEnabled(false);

		this.add(buttonPanel, BorderLayout.NORTH);
		buttonPanel.add(Box.createRigidArea(new Dimension(margin/2, 0)));
//		buttonPanel.add(Box.createHorizontalGlue());

		this.repaint();
	}
	public void initializePanel(){
//		this.removeAll();
		if (_table1 != null) _table1.setVisible(false);
		if (_table2 != null) {
			_table2.getTableHeader().setVisible(false);
			_table2.setVisible(false);
		}
		if (_table3 != null) _table3.setVisible(false);
		if (_table4 != null) {
			_table4.getTableHeader().setVisible(false);
			_table4.setVisible(false);
		}
		_step = 0;
		showNextStep(-10);
	}
	/**
	 * De ventielgegevens worden opgehaald
	 * @param setAdjustRooms: de adjustRooms moeten nog worden ingesteld
	 */
	private void addTable1And2(boolean setAdjustRooms){
		if (Program.getVentilatie().getFlowValves(_flowType).size() == 0){
			JOptionPane.showMessageDialog(null, "Er zijn nog geen ventielen gedefinieerd");
		}
		else {
			if (setAdjustRooms && Program.getVentilatie().getAdjustData(_flowType) != null)
				_undoList.addUndo(Edit.ADJUSTDATA, _flowType);
			if (setAdjustRooms) Program.getVentilatie().setAdjustData(_flowType);
			if (_tablePanel != null) {
				if (_table1 != null) _table1.setVisible(true);
				if (_table2 != null) {
					_table2.setData2();
					_table2.setVisible(true);
					_table2.getTableHeader().setVisible(true);
				}
			}
			else {
				_tablePanel = new JPanel();
				_tablePanel.setLayout(new BoxLayout(_tablePanel, BoxLayout.Y_AXIS));

				_table1 = new AdjustTable(this, 1);
				_tablePanel.add(_table1);
				_tablePanel.add(Box.createRigidArea(new Dimension(0,15)));

				_table2 = new AdjustTable(this, 2);
				_table2.setData2();
				JTableHeader header = _table2.getTableHeader();
				for (int i = 0; i < header.getColumnModel().getColumnCount(); i++) {
					header.getColumnModel().getColumn(i).setHeaderRenderer(_table2.getHeaderRenderer());
				}
				_tablePanel.add(header);
				_tablePanel.add(_table2);

				_scrollPane = new JScrollPane(_tablePanel);
				this.add(_scrollPane, BorderLayout.CENTER);
			}
			_scrollPane.setViewportView(_tablePanel);
			showNextStep(1);//step = 1
		}
	}
	/**
	 * stap van 2 naar 3: voeg tabel 3 en 4 toe
	 */
	private void addTable3And4(){
		if (_table3 == null) {
			_tablePanel.add(Box.createRigidArea(new Dimension(0,30)));
			_table3 = new AdjustTable(AdjustPanel.this, 3);
			_tablePanel.add(_table3);
			_tablePanel.add(Box.createRigidArea(new Dimension(0,15)));
			_table4 = new AdjustTable(AdjustPanel.this, 4);
			JTableHeader header = _table4.getTableHeader();
			for (int i = 0; i < header.getColumnModel().getColumnCount(); i++) {
				header.getColumnModel().getColumn(i).setHeaderRenderer(_table4.getHeaderRenderer());
			}
			_tablePanel.add(header);
			_tablePanel.add(_table4);
			header.revalidate();
			_scrollPane.setViewportView(_tablePanel);
		}
		else if (_table3 != null && !_table3.isVisible()){
			_table3.setVisible(true);
			_table4.setVisible(true);
			_table4.getTableHeader().setVisible(true);
		}
		_table4.setData4(_table2.getData());
		_table4.calculateAdjustmentFlow();
		showNextStep(1);//_step=3
	}
	/**
	 * Verhoogt of verlaagt de stap en toont tekst voor label en button
	 * Zorgt ook dat de tabellen hertekend worden
	 * @param nextStep: normaal 1 of -1
	 */
	private void showNextStep(int nextStep){
		AdjustData adjustData = Program.getVentilatie().getAdjustData(_flowType);
		_step += nextStep;
		if (_step < 0) _step = 0;		
		if (_step == 0) {
			_lbInfo.setText("Klik op 'Initializeer' om de ventielen en debieten op te halen");
			_btNextStep.setEnabled(true);
			_btNextStep.setText("Initializeer");
			_btPreviousStep.setEnabled(false);
		}
		else if (_step == 1) {
			_lbInfo.setText("Stap 1: stel de ventilator in (1) in % of m³/h");
			if (adjustData.getVentilatorFlow() > 0)  _btNextStep.setEnabled(true);
			else _btNextStep.setEnabled(false);
			_btNextStep.setText("Volgende stap");
			_btPreviousStep.setEnabled(true);
		}
		else if (_step == 2) {
			_lbInfo.setText("Stap 2: meet de debieten met de ventielen in open stand");
			if (adjustData.checkMetering(0))  _btNextStep.setEnabled(true);
			else _btNextStep.setEnabled(false);
		}
		else if (_step == 3) _lbInfo.setText("Stap 3: stel de ventielen op de installatie af in de juiste volgorde");
		else if (_step == 4) {
			_lbInfo.setText("Stap 4: stel de ventilator opnieuw in (2)");
			if (adjustData.getVentilatorMeter1() > 0)  _btNextStep.setEnabled(true);
			else _btNextStep.setEnabled(false);
		}
		else if (_step == 5) {
			_lbInfo.setText("Stap 5: meet de debieten met de nieuwe instellingen'");
			if (adjustData.checkMetering(1))  _btNextStep.setEnabled(true);
			else _btNextStep.setEnabled(false);
		}
		else if (_step == 6) {
			_lbInfo.setText("Stap 6: stel de ventilator (3) verder bij (fijnstelling)");
			if (adjustData.getVentilatorMeter2() > 0)  _btNextStep.setEnabled(true);
			else _btNextStep.setEnabled(false);
		}
		else if (_step == 7) {
			_lbInfo.setText("Stap 7: meet het debiet van het meest kritische ventiel " +
					"herhaal stap 6 en 7 tot OK");
			if (_table4.isRowLowestRatioMetered())  _btNextStep.setEnabled(true);
			else _btNextStep.setEnabled(false);
		}
		else if (_step == 8) {
			_lbInfo.setText("Stap 8: meet de debieten van alle overige ventielen");
			if (adjustData.checkMetering(2))  _btNextStep.setEnabled(true);
			else _btNextStep.setEnabled(false);
			_btNextStep.setText("Volgende stap");
		}
		else if (_step == 9) {
			_lbInfo.setText("Stap 9: draag het meetrapport over naar ... ");
			_btNextStep.setText("Overdracht meetrapport");
			_btNextStep.setEnabled(false);
			_btPreviousStep.setEnabled(true);
		}
		
		if (_table1 != null) _table1.fireTableDataChanged();
		if (_table2 != null) _table2.fireTableDataChanged();
		if (_table3 != null) _table3.fireTableDataChanged();
		if (_table4 != null) _table4.fireTableDataChanged();
	}
//	private void addTable(AdjustTable table){
//		if (table != _table3 || !_rigidArea2to3)
//			_tablePanel.add(Box.createRigidArea(new Dimension(0,20)));
//		if (table == _table3) _rigidArea2to3 = true;
//		_tablePanel.add(table.getTableHeader());
//		_tablePanel.add(table);
//		_scrollPane.setViewportView(_tablePanel);
//	}
	public AdjustRoom[] getRoomData(){
		return _table2.getData();
	}
	/**
	 * Past de tabellen aan, aan de adjustData van de ventilatie, 
	 * vult alle mogelijke metingen in en doet alle mogelijke berekeningen
	 */
	public void updateAdjustTables(){
		AdjustData adjustData = Program.getVentilatie().getAdjustData(_flowType);
		addTable1And2(false);
		if (adjustData.getVentilatorFlow() > 0){
			showNextStep(1);	//_step=2;
			if (adjustData.checkMetering(0)){
				addTable3And4();		//_step=3
				if (adjustData.getVentilatorMeter1() > 0) {
					_table3.calculateVentilator1();
					showNextStep(2);	//_step=5
					if (adjustData.checkMetering(1)){
						_table4.calculateVentilator2();
						showNextStep(1);	//_step=6
						if (adjustData.getVentilatorMeter2() > 0) {
							showNextStep(1);	//_step = 7;
//							_table4.setRatio(false);
							if (_table4.getBadRatio(true, false) == 0){
								showNextStep(1);	//_step = 8;
//								_table4.setRatio(true);
								if (_table4.getBadRatio(true, true) == 0)
									showNextStep(1);	//_step = 9;
							}
						}					
					}
				}
			}
		}
	}
	public void setButtonNextEnabled(boolean enabled){
		_btNextStep.setEnabled(enabled);
	}
	public FlowType getFlowtype(){
		return _flowType;
	}
	public int getStep(){
		return _step;
	}
	/**
	 * geeft een tabel van het AdjustPanel
	 * @param index: 1, 2, 3 of 4
	 * @return
	 */
//	public AdjustTable getTable(int index){
//		if (index == 1) return _table1;
//		else if (index == 2) return _table2;
//		else if (index == 3) return _table3;
//		else if (index == 4) return _table4;
//		return null;
//	}
	public void fireTable3(){
		if (_table3 != null) _table3.fireTableDataChanged();
	}
	public boolean changeSelectedTabel(int selected){
		if (_selectedTabel == selected) return false;
		if (_selectedTabel == 1 && _table1 != null) _table1.clearSelection();
		else if (_selectedTabel == 2 && _table2 != null) _table2.clearSelection();
		else if (_selectedTabel == 3 && _table3 != null) _table3.clearSelection();
		else if (_selectedTabel == 4 && _table4 != null) _table4.clearSelection();
		_selectedTabel = selected;
		return true;
	}
	@Override
	protected void tabPanelShown() {
		// TODO Auto-generated method stub
		
	}
	@Override
	protected void tabPanelHidden() {
		// TODO Auto-generated method stub
		
	}
}
