import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public class SwingGUI extends JFrame implements GUI, ActionListener {
	private Machine behavior;
	private Map<JCheckBox, String> outBoxes;

	public SwingGUI(Machine behavior) {
		this.behavior = behavior;
		JPanel inputs = new JPanel();
		for (String inp : behavior.getInputs()) {
			JButton btn = new JButton(inp);
			btn.addActionListener(this);
			inputs.add(btn);
		}
		this.add(inputs, BorderLayout.NORTH);

		JPanel outputs = new JPanel();
		outBoxes = new HashMap<JCheckBox, String>();
		for (String out : behavior.getOutputs()) {
			JCheckBox chk = new JCheckBox(out);
			chk.setSelected(false);
			chk.setEnabled(false);
			outBoxes.put(chk, out);
			outputs.add(chk);
		}
		this.add(outputs, BorderLayout.SOUTH);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setVisible(true);
		this.setSize(this.getMinimumSize());
		behavior.setGUI(this);
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		behavior.react(e.getActionCommand());
	}

	@Override
	public void setOutputs(List<String> outputs) {
		for (JCheckBox chk : outBoxes.keySet()) {
			chk.setSelected(outputs.contains(outBoxes.get(chk)));
		}
	}
}
