package edu.calpoly.csc480.Corral.Seer;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

public abstract class BaseToolbarView extends JToolBar
{
	public BaseToolbarView() {
      setFloatable(false);
	}
	
	public void setOwner(BaseSeerView view) {
		this.view = view;
		this.font = view.getFont();
	}
	
	public void setDocument(BaseSeer seer) {
		this.seer = seer;

		makeToolbarButtons();
		makeToolbarSlider();
		makeToolbar();
	}

	public void agentSelected() {
		updateButtons();
	}

	public void agentUnselected() {
		updateButtons();
	}

	public void stop() {
		updateButtons();
	}

	protected BaseSeer seer;
	protected BaseSeerView view;
	
	protected Font font;
	
	protected JButton flipButton, stepButton, stopButton;
	protected JPanel buttonPanel;
	
	protected JLabel delayLabel;
	protected JSlider delaySlider;
	protected JPanel delayPanel;

	protected void makeToolbarButtons() {
		final int insets = 4;
		
		Dimension buttonSize;
		
		buttonPanel = new JPanel(true);
		buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.X_AXIS));
		
		flipButton = new JButton("Pause");
		stepButton = new JButton("Step");
		stopButton = new JButton("Stop");

		flipButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent event) {
				seer.flip();
				updateButtons();
			}
		});
		flipButton.setFont(font);
		
		stepButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent event) {
				seer.step();
				updateButtons();
			}
		});
		stepButton.setFont(font);

		stopButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent event) {
				seer.stop();
				updateButtons();
			}
		});
		stopButton.setFont(font);

		buttonPanel.add(flipButton);
      buttonPanel.add(stepButton);
      buttonPanel.add(stopButton);

		flipButton.setText("Play");
	}
	
	protected void makeToolbarSlider() {
		final int xInset = 4, yInset = 2;
		final int sliderTicksPerDelay = 100;
		final int majorTickSpacing = 5;
		
		int minimumValue, maximumValue, currentValue;
		GridBagConstraints curb = new GridBagConstraints();
		
		delayPanel = new JPanel(new GridBagLayout(), true);
      delayPanel.setBorder(BorderFactory.createCompoundBorder(
		 BorderFactory.createLoweredBevelBorder(),
		 BorderFactory.createEmptyBorder(yInset, xInset, yInset, xInset)
		));
		
		minimumValue = 0;
		maximumValue = seer.getMaximumDelay() / sliderTicksPerDelay;
		currentValue = seer.getDelay() / sliderTicksPerDelay;
		
		delayLabel = new JLabel("Delay: ", JLabel.RIGHT);
		delayLabel.setFont(font);
      delayLabel.setVerticalAlignment(JLabel.CENTER);		

		delaySlider = new JSlider(minimumValue, maximumValue, currentValue);
		delaySlider.setMajorTickSpacing(majorTickSpacing);
		delaySlider.setMinorTickSpacing(1);
		delaySlider.setPaintTicks(true);
      delaySlider.setPaintTrack(true);

      delaySlider.addChangeListener(new ChangeListener() {
			final public void stateChanged(ChangeEvent event) {
				seer.setDelay(delaySlider.getValue() * sliderTicksPerDelay);
			}
		});
		
		delayPanel.add(delayLabel, curb);

		curb.anchor = GridBagConstraints.SOUTH;
		curb.fill = GridBagConstraints.HORIZONTAL;
      curb.gridwidth = GridBagConstraints.REMAINDER;
		curb.gridheight = 1;
      curb.weightx = 1.0;
		curb.weighty = 0.0;
		delayPanel.add(delaySlider, curb);
	}
	
	protected void makeToolbar() {
		GridBagConstraints curb = new GridBagConstraints();

      curb.anchor = GridBagConstraints.SOUTH;
		curb.fill = GridBagConstraints.NONE;
		curb.gridwidth  = 1;
		curb.gridheight = 1;
		curb.weightx = 0.0;
		curb.weighty = 0.0;
      add(buttonPanel, curb);
		
		addSeparator();
		addSeparator();
		
      curb.anchor = GridBagConstraints.SOUTH;
		curb.fill = GridBagConstraints.HORIZONTAL;
      curb.gridwidth = GridBagConstraints.REMAINDER;
		curb.gridheight = 1;
      curb.weightx = 1.0;
		curb.weighty = 0.0;
      add(delayPanel, curb);
	}

	protected void updateButtons() {
		boolean resting = seer.isResting();

		flipButton.setText(resting ? "Play" : "Pause");

		flipButton.setEnabled(seer.isRunnable());
		stepButton.setEnabled(seer.isRunnable() && resting);
		stopButton.setEnabled(seer.isStarted());
	}
}