import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

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

public class RTSPTest implements ActionListener{
	// GUI
	private JFrame mainFrame;
	private JButton setupButton;
	private JButton playButton;
	private JButton pauseButton;
	private JButton optionsButton;
	private JButton describeButton;
	private JButton teardownButton;
	private JTextField textField;

	// Panel to place our push buttons
	private JPanel buttonPanel;

	// Panel to place our text field panel
	private JPanel textPanel;

	// Panel to place all of our objects in one
	private JPanel mainPanel;

	// Our RTSP Object
	private RTSPControl rtspControl;

	private String hostName;
	private int portNumber;
	private String videoFile;

	public RTSPTest() {
		// Set up our GUI elements
		mainFrame = new JFrame("RTSP Test");

		setupButton = new JButton("Setup");
		playButton = new JButton("Play");
		pauseButton = new JButton("Pause");
		optionsButton = new JButton("Options");
		describeButton = new JButton("Describe");
		teardownButton = new JButton("Teardown");
		textField = new JTextField("rtsp://184.72.239.149/vod/mp4:BigBuckBunny_115k.mov");

		buttonPanel = new JPanel();
		textPanel = new JPanel();
		mainPanel = new JPanel();

		// Set up buttons
		buttonPanel.setLayout(new GridLayout(1,0));
		buttonPanel.add(describeButton);
		buttonPanel.add(optionsButton);
		buttonPanel.add(setupButton);
		buttonPanel.add(playButton);
		buttonPanel.add(pauseButton);
		buttonPanel.add(teardownButton);

		setupButton.addActionListener(this);
		playButton.addActionListener(this);
		pauseButton.addActionListener(this);
		optionsButton.addActionListener(this);
		describeButton.addActionListener(this);
		teardownButton.addActionListener(this);
		textField.addActionListener(this);

		// Set up text field
		textPanel.setLayout(new GridLayout(1,0));
		textPanel.add(textField);

		// Set main panel
		mainPanel.setLayout(null);
		mainPanel.add(textPanel);
		mainPanel.add(buttonPanel);
		textPanel.setBounds(0, 0, 450, 25);
		buttonPanel.setBounds(0, 25, 450, 50);

		// Add listener so that we quit we close the window
	    mainFrame.addWindowListener(new WindowAdapter() {
	        public void windowClosing(WindowEvent e) {
	        	// Teardown the connection when we close the window
	        	if (rtspControl != null) {
	        		rtspControl.RTSPTeardown();
	        		rtspControl.resetParameters(); // Just in case
	        	}
	        	System.exit(0);
	        }
	     });

		// Set up connection to default RTSP url before we even show GUI
		//hostName = "184.72.239.149";
		//portNumber = 554;
		//videoFile = "vod/mp4:BigBuckBunny_115k.mov";
		//rtspControl = new RTSPControl(hostName, portNumber, videoFile);

		// Create frame and show
		mainFrame.getContentPane().add(mainPanel, BorderLayout.CENTER);
		mainFrame.setSize(new Dimension(450, 100));
		mainFrame.setVisible(true);
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		if (e.getSource() == setupButton) {
			System.out.println("Setup Button Pressed!");
			if (rtspControl == null) {
				System.out.println("RTSP Object has not been created!");
				return;
			}
			// Keep issuing setup commands as long as there are tracks
			// to set up
			while (rtspControl.RTSPSetup() > 0);
			//int numberTracksLeft = rtspControl.RTSPSetup();
			//if (numberTracksLeft > 0)
			//	System.out.println("There are " + numberTracksLeft + " tracks left to set up");
		}
		else if (e.getSource() == describeButton) {
			System.out.println("Describe Button Pressed!");
			if (rtspControl == null) {
				System.out.println("RTSP Object has not been created!");
				return;
			}
			rtspControl.RTSPDescribe();
		}
		else if (e.getSource() == optionsButton) {
			System.out.println("Options Button Pressed!");
			if (rtspControl == null) {
				System.out.println("RTSP Object has not been created!");
				return;
			}
			rtspControl.RTSPOptions();
		}
		else if (e.getSource() == playButton) {
			System.out.println("Play Button Pressed!");
			if (rtspControl == null) {
				System.out.println("RTSP Object has not been created!");
				return;
			}
			rtspControl.RTSPPlay();
		}
		else if (e.getSource() == pauseButton) {
			System.out.println("Pause Button Pressed!");
			if (rtspControl == null) {
				System.out.println("RTSP Object has not been created!");
				return;
			}
			rtspControl.RTSPPause();
		}
		else if (e.getSource() == teardownButton) {
			System.out.println("Teardown Button Pressed!");
			if (rtspControl == null) {
				System.out.println("RTSP Object has not been created!");
				return;
			}
			rtspControl.RTSPTeardown();
		}
		else if (e.getSource() == textField) {
			// Grab the text from the field
			String rtspURL = textField.getText();
			System.out.println("String entered in text field: " + rtspURL);

			rtspControl = new RTSPControl(rtspURL);

			hostName = rtspControl.getRTSPURL();
			System.out.println("URL: " + hostName);
			portNumber = rtspControl.getServerPort();
			System.out.println("Port Number: " + portNumber);
			videoFile = rtspControl.getVideoFilename();
			System.out.println("Video Filename: " + videoFile);
		}
	}

	public static void main(String[] args) {
		new RTSPTest();
	}
}