package JessInAction.part5.fuzzy;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class SimulatorGUI implements Runnable{
    private Simulator m_simulator;
    private JLabel[][] m_labels;
	private JTextField m_outdoorField = new JTextField();
	private JTextField m_setpointField = new JTextField();
    private int m_nFloors;
    public SimulatorGUI(Simulator s) {
        m_simulator = s;
        m_nFloors = m_simulator.getNumberOfHeatPumps()*3;
            
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        JPanel panel = new JPanel();
        panel.setLayout(new GridLayout(m_nFloors, 3));
        m_labels = new JLabel[m_nFloors][3];
        for (int i=0; i<m_nFloors; ++i)
            for (int j=0; j<3; ++j) {
                m_labels[i][j] = new JLabel();
                panel.add(m_labels[i][j]);
            }
        
		String text =
			String.valueOf(m_simulator.m_outdoor);
		m_outdoorField.setText(text);  

		m_outdoorField.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent ae) {
					double value =
						Double.parseDouble(m_outdoorField.getText());
					m_simulator.m_outdoor = value;
				}
			});

		text =
			String.valueOf(m_simulator.m_setpoint);
		m_setpointField.setText(text);   

		m_setpointField.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent ae) {
					double value =
						Double.parseDouble(m_setpointField.getText());
					Thermometer.SetThermometerFVTerms(value);
					m_simulator.m_setpoint = value;
				}
			});

        Container content = frame.getContentPane();
        content.setLayout(new BorderLayout());
        content.add(panel, BorderLayout.NORTH);
		content.add(m_outdoorField, BorderLayout.CENTER);
		content.add(m_setpointField, BorderLayout.SOUTH);

        new Thread(this).start();

        frame.pack();
        frame.setVisible(true);        
    }        

    public void run() {
        while(true) {
            for (int i=0; i<m_nFloors; ++i) {
                int hpState = m_simulator.getHeatPumpState(i/3+1);
                m_labels[i][0].setText(State.heatpump(hpState));
                
                double ventState = m_simulator.getVentState(i+1);
                m_labels[i][1].setText(String.valueOf(ventState));

                double temperature = m_simulator.getTemperature(i+1);
                m_labels[i][2].setText(String.valueOf(temperature));
            }
            try {
                Thread.sleep(1000);
            } catch (InterruptedException ie) {
                return;
            }
        }
    }

    public static void main(String[] argv) {
        Simulator s = new Simulator(9, 70);
        SimulatorGUI gui = new SimulatorGUI(s);
    }
}
