package cs372.lab1.student;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import cs372.lab1.driver.*;

public class FCFS implements IScheduler {
	
	private List ready_q = new ArrayList();
	private Integer current_pid = null;
	private HashMap all_pcb = new HashMap();

	/* (non-Javadoc)
	 * @see IScheduler#getPCB(java.lang.Integer)
	 */
	public PCB getPCB(Integer pid) {
		// TODO Auto-generated method stub
		
		return (PCB)all_pcb.get( current_pid );
	}

	/* (non-Javadoc)
	 * @see IScheduler#processStarted(PCB)
	 */
	public void processStarted(PCB pcb) {
		// TODO Auto-generated method stub
		pcb.setQuantum( Integer.MAX_VALUE );
		ready_q.add( pcb.getPID() );
		all_pcb.put( pcb.getPID(), pcb );
	}

	/* (non-Javadoc)
	 * @see IScheduler#quantumExpired(java.lang.Integer, ICPU, int)
	 */
	public void quantumExpired(Integer pid, ICPU cpu, int ticks_given) {
		// TODO Auto-generated method stub
	}

	/* (non-Javadoc)
	 * @see IScheduler#schedule(ICPU)
	 */
	public Integer schedule(ICPU cpu) {
		if (ready_q.size() == 0)
			current_pid = null;
		else
			current_pid = (Integer)ready_q.remove(0);
		
		return current_pid;
	}

	/* (non-Javadoc)
	 * @see IScheduler#getCurrentPID()
	 */
	public Integer getCurrentPID() {
		// TODO Auto-generated method stub
		return current_pid;
	}

	/* (non-Javadoc)
	 * @see IScheduler#processExited(java.lang.Integer)
	 */
	public void processExited(Integer pid) {
		// TODO Auto-generated method stub
		all_pcb.remove( pid );
		current_pid = null;
	}

	/* (non-Javadoc)
	 * @see IScheduler#processBlocked(java.lang.Integer, ICPU, int)
	 */
	public void processBlocked(Integer pid, ICPU cpu, int burst_given) {
		// TODO Auto-generated method stub
		current_pid = null;
	}

	/* (non-Javadoc)
	 * @see IScheduler#unblocked(java.lang.Integer)
	 */
	public void unblocked(Integer pid) {
		// TODO Auto-generated method stub
		ready_q.add( pid );
	}

	/* (non-Javadoc)
	 * @see IScheduler#quantumInterrupted(java.lang.Integer, CPU, int)
	 */
	public void quantumInterrupted(Integer pid, CPU cpu, int ticks_given) {
		// TODO Auto-generated method stub

	}
}
