

public class AppointmentBook {
	
	// this attribute is created to store the period + minute
	// availability/reserve information
	boolean[][] book;
	
	public AppointmentBook()
	{
		book = new boolean[8][60];// for 8 periods and 60 minutes
		for (int i=0; i < 8; i++)
		{
			for (int j=0; j < 60; j++)
			{
				book[i][j] = true;// by default all slots are available
			}
		}
	}

	private boolean isMinuteFree(int period, int minute)
	{
		return book[period-1][minute];
	}
	
	public void reserveBlock(int period, int startMinute, int duration)
	{
		int endMinute = startMinute + duration -1;
		
			for (int j=startMinute; j <= endMinute; j++)
			{
				book[period-1][j] = false;
			}
	}
	
	public int findFreeBlock(int period, int duration)
	{
		int blockStart=-1;
		int blockEnd = -1;
		boolean available= true;

		for (int i=0; (i< 60); i++)
		{
			blockStart = i;
			blockEnd = blockStart + duration -1;
			
			// expected duration is larger than available time in the period
			if (blockEnd > 59) return -1;
			
			available= true;

				for (int j =i; (j<= blockEnd); j++)
				{
					if (!isMinuteFree(period,j)) available = false;
				}
			if (available) return blockStart;
		}
		return -1;
	}
	

	public boolean makeAppointment(int startPeriod, int endPeriod, int duration)
	{
		int blockStartMinute =0;
		for (int i= startPeriod; i <= endPeriod; i++)
		{
			blockStartMinute = findFreeBlock(i, duration);
			
			if (blockStartMinute != -1)
			{	//reserve block
				reserveBlock(i, blockStartMinute, duration);
				return true;
			}
		}
		return false;
	}

}
