/*
 * Author: Jasper Slaff
 * Date: 4/21/17
*/

package demo;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.HashSet;
import java.util.Iterator;

import javax.swing.Timer;

public class Controller implements KeyListener, ActionListener {

	// When this timer goes off, it is time to refresh the animation
	private Timer refreshTimer;

	// The game display
	private Display display;

	// all objs
	private DemoObjState state;

	// set containing all the keys that are currently pressed
	private HashSet<Integer> keys = new HashSet<Integer>();

	public Controller() {

		state = new DemoObjState();

		// Set up the refresh timer.
		refreshTimer = new Timer(30, this);

		// Record the display object
		display = new Display(this);

		// Bring up the splash screen and start the refresh timer
		display.setVisible(true);
		refreshTimer.start();
		init();
	}

	public void initialSetup() {
		// Start listening to events (but don't listen twice)
		display.removeKeyListener(this);
		display.addKeyListener(this);

		// Give focus to the game screen
		display.requestFocusInWindow();
		// Refresh the display
		display.refresh();
	}

	public void placeObjs() {
		for (int i = 10; i <= 800; i += 50) {
			addObj(new Oct(i));
		}
	}

	private void addObj(DemoObj obj) {
		state.addObj(obj);
	}

	private void init() {
		state.clear();
		placeObjs();
		// Start listening to events (but don't listen twice)
		display.removeKeyListener(this);
		display.addKeyListener(this);
		display.requestFocusInWindow();
		display.refresh();
	}

	public Iterator<DemoObj> getObjs() {
		return state.getObjs();
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		if (e.getSource() == refreshTimer) {
			if (keys.contains(KeyEvent.VK_E)) {
				state.rotateObjsRight();
			}
			if(keys.contains(KeyEvent.VK_Q)){
				state.rotateObjsLeft();
			}
			if(keys.contains(KeyEvent.VK_W)){
				state.moveObjsUp();
			}
			if(keys.contains(KeyEvent.VK_S)){
				state.moveObjsDown();
			}
			if(keys.contains(KeyEvent.VK_A)){
				state.moveObjsLeft();
			}
			if(keys.contains(KeyEvent.VK_D)){
				state.moveObjsRight();
			}
			if(keys.contains(KeyEvent.VK_R)){
				state.shrinkObjs();
			}
			if(keys.contains(KeyEvent.VK_F)){
				state.growObjs();
			}
		}
		display.refresh();
	}

	/**
	 * If a key of interest is pressed, add it to the keys set and perform some
	 * actions.
	 */
	@Override
	public void keyPressed(KeyEvent e) {
		keys.add(e.getKeyCode());
	}

	/**
	 * if a key is released remove it from the set
	 */
	@Override
	public void keyReleased(KeyEvent e) {
		keys.remove(e.getKeyCode());
	}

	@Override
	public void keyTyped(KeyEvent arg0) {}
}
