/*
 * Copyright (c) 2008 Keith A. Jaska
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 */
package geriatricassistant.utils;

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.CardLayout;
import java.awt.Component;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.Panel;
import java.awt.Toolkit;
import java.io.File;
import java.io.FileFilter;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.osgi.service.log.LogService;

import com.buglabs.bug.base.pub.ITimeProvider;
import com.buglabs.bug.module.gps.pub.IPositionProvider;
import com.buglabs.bug.module.gps.pub.LatLon;

/**
 * The Class GeriatricAssistantGUI. This class generates the GUI associated with
 * the Geriatric Assistant application.
 * 
 * @author Keith A. Jaska
 */
public class GeriatricAssistantGUI {

	private Button btnPlay;
	private Component compImages;
	private Component compMain;
	private MenuBar mbMain;
	private MenuItem miImageViewer;
	private MenuItem miMain;
	private Menu mnuSwitchPerspective;
	private Panel pnlMain;
	private Panel pnlViewer;
	private Panel pnlViewerControls;
	private Frame fraMain = new Frame();
	private CardLayout cardLayout;
	private Image mainImage = Toolkit.getDefaultToolkit().getImage(
			GeriatricAssistantGUI.class.getResource("/main.jpg"));
	private Image viewerImage = Toolkit.getDefaultToolkit().getImage(
			GeriatricAssistantGUI.class.getResource("/main.jpg"));
	private Menu mnuSimulateFall;
	private MenuItem miFall;
	private ITimeProvider timeProvider;
	private IPositionProvider positionProvider;
	private LogService logService;

	public GeriatricAssistantGUI(Frame frame, ITimeProvider timeProvider,
			IPositionProvider positionProvider, LogService logService) {
		this.timeProvider = timeProvider;
		this.positionProvider = positionProvider;
		this.logService = logService;
		fraMain = frame;
		createGUI();
	}

	private void createGUI() {

		cardLayout = new CardLayout();
		fraMain.setLayout(cardLayout);
		createMenu();
		createMainPanel();
		createViewerPanel();
		cardLayout.first(fraMain);
		fraMain.show();
	}

	private void createMainPanel() {
		pnlMain = new Panel();
		compMain = new Component() {
			public void paint(Graphics g) {
				g.drawImage(mainImage, 0, 0, getWidth(), getHeight(), null);
			}
		};

		pnlMain.setName("Main Panel");
		pnlMain.setLayout(new BorderLayout());

		compMain.setName("Main Canvas");
		pnlMain.add(compMain, BorderLayout.CENTER);

		fraMain.add(pnlMain, "MainScreen");
	}

	private void createViewerPanel() {
		pnlViewer = new Panel();
		compImages = new Component() {
			public void paint(Graphics g) {
				g.drawImage(viewerImage, 0, 0, getWidth(), getHeight(), null);
			}

		};
		pnlViewerControls = new Panel();
		btnPlay = new Button();

		pnlViewer.setName("Viewer Panel");
		pnlViewer.setLayout(new BorderLayout());

		compImages.setName("Image Canvas");
		pnlViewer.add(compImages, BorderLayout.CENTER);

		pnlViewerControls.setName("Control Panel");

		btnPlay.setLabel(">");
		btnPlay.setName("Play");
		btnPlay.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent evt) {
				logService.log(LogService.LOG_INFO, "Beginning image display.");

				SimpleDateFormat sdf = new SimpleDateFormat();
				sdf.applyPattern("yyyyMMdd");
				String directory = sdf.format(new Date()) + File.separator;

				File dir = new File(directory);

				File[] files = dir.listFiles();

				FileFilter fileFilter = new FileFilter() {
					public boolean accept(File file) {
						return file.getName().endsWith(".jpg");
					}
				};
				files = dir.listFiles(fileFilter);
				logService.log(LogService.LOG_INFO, files.length
						+ " images will be displayed.");
				for (int i = 0; i < files.length; i++) {
					File file = files[i];
					viewerImage = Toolkit.getDefaultToolkit().getImage(
							file.getAbsolutePath());
					compImages.repaint();
					try {
						// This should allow a user to watch an entire day in 12
						// minutes.
						Thread.sleep(250);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}

				}
				logService.log(LogService.LOG_INFO, "Image display finished.");

			}
		});
		pnlViewerControls.add(btnPlay);

		pnlViewer.add(pnlViewerControls, BorderLayout.SOUTH);

		fraMain.add(pnlViewer, "ImageViewer");
	}

	private void createMenu() {
		mbMain = new MenuBar();
		mnuSwitchPerspective = new Menu();
		miMain = new MenuItem();
		miImageViewer = new MenuItem();
		mnuSimulateFall = new Menu();
		miFall = new MenuItem();

		mbMain.setName("Main Menu");

		mnuSwitchPerspective.setLabel("Switch Perspective");
		mnuSwitchPerspective.setName("mnuSwitchPerspective");

		miMain.setLabel("Main");
		miMain.setName("Main Menu Item");
		miMain.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent evt) {
				cardLayout.first(fraMain);
			}
		});
		mnuSwitchPerspective.add(miMain);

		miImageViewer.setLabel("Image Viewer");
		miImageViewer.setName("Image Viewer Menu Item");
		miImageViewer.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent evt) {
				cardLayout.last(fraMain);
			}
		});

		mnuSwitchPerspective.add(miImageViewer);

		mbMain.add(mnuSwitchPerspective);

		mnuSimulateFall.setLabel("Simulate Fall");
		mnuSimulateFall.setName("mnuSimulateFall");

		miFall.setLabel("Fall");
		miFall.setName("Fall Menu Item");
		miFall.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent evt) {
				LatLon position = positionProvider.getLatitudeLongitude();
				logService.log(LogService.LOG_INFO,
						"Requesting a map image from Yahoo! Maps API using the following coordinates: "
								+ position.latitude + "," + position.longitude
								+ ".");
				String imageUrl = WSUtilities.generateYahooMap(
						position.latitude, position.longitude);
				WSUtilities.postImageToTumblr(imageUrl, position.latitude,
						position.longitude, timeProvider.getTime());
				logService.log(LogService.LOG_INFO, "Posted to tumblr.");
			}
		});

		mnuSimulateFall.add(miFall);

		mbMain.add(mnuSimulateFall);

		fraMain.setMenuBar(mbMain);
	}

}