import java.lang.*;
import java.util.*;

public class DataCollection
{
	private long TypeAResidence = 0;
	private long TypeBResidence = 0;
	private long TypeCResidence = 0;
	
	private long G1WaitTime = 0;
	private long G2WaitTime = 0;
	private long G3WaitTime = 0;
	private long G4WaitTime = 0;
	private long G5WaitTime = 0;
	private long StWaitTime = 0;
	private long StOverflowTime = 0;
	
	private int numA = 0, numB = 0, numC = 0;
		
	private int G1WQ = 0, G2WQ = 0, G3WQ=0, G4WQ=0, G5WQ=0, StWQ=0, StOQ=0;
	
	private long StartTime, EndTime;
	
	private System rightNow;

	public DataCollection()
	{
		StartTime = rightNow.currentTimeMillis();
	}
	
	//methods to get residence time
	public synchronized void getAR(long t)
	{
		TypeAResidence += t;
		numA++;
	}
	
	public synchronized void getBR(long t)
	{
		TypeBResidence += t;
		numB++;
	}
	
	public synchronized void getCR(long t)
	{
		TypeCResidence += t;
		numC++;
	}
	
	//methods to get waiting time and queue
	public synchronized void getG1WT(long t)
	{
		G1WaitTime += t;
	}
	public synchronized void getG1WQ()
	{		
		G1WQ++;
	}
	
	public synchronized void getG2WT(long t)
	{
		G2WaitTime += t;
	}
	public synchronized void getG2WQ()
	{		
		G2WQ++;
	}
	
	public synchronized void getG3WT(long t)
	{
		G3WaitTime += t;
	}
	public synchronized void getG3WQ()
	{		
		G3WQ++;
	}	
	
	public synchronized void getG4WT(long t)
	{
		G4WaitTime += t;
	}
	public synchronized void getG4WQ()
	{		
		G4WQ++;
	}
	
	public synchronized void getG5WT(long t)
	{
		G5WaitTime += t;
	}
	public synchronized void getG5WQ()
	{		
		G5WQ++;
	}
	
	public synchronized void getStWT(long t)
	{
		StWaitTime += t;
	}
	public synchronized void getStWQ()
	{		
		StWQ++;
	}
	//Storage overflowing waitings
	public synchronized void getStOQ()
	{		
		StOQ++;
	}
	
	public synchronized void getStOT(long t)
	{
		StOverflowTime += t;		
	}
	
	public synchronized void Report()
	{
		EndTime = rightNow.currentTimeMillis();
        System.out.println("Simulation Time = " + ((EndTime - StartTime) / 1000) + " " + "Start Time = " + StartTime/1000 + " " + "End Time = " + EndTime/1000);
        
        System.out.println(" " );
        
        System.out.println("The average residence time for Type 1 = " + (TypeAResidence / numA / 1000) + " " + (TypeAResidence / 1000) + " " + numA);
        System.out.println("The average residence time for Type 2 = " + (TypeBResidence / numB / 1000) + " " + (TypeBResidence / 1000) + " " + numB);
		System.out.println("The average residence time for Type 3 = " + (TypeCResidence / numC / 1000) + " " + (TypeCResidence / 1000) + " " + numC);
		
		System.out.println(" " );
		
		System.out.println("The average unitilization rate for group1 = " + ((double)(numA*600+numB*800+numC*700) / 600000));
		System.out.println("The average unitilization rate for group2 = " + ((double)(numA*850+numC*1200) / 400000));
		System.out.println("The average unitilization rate for group3 = " + ((double)(numA*500+numB*500+numC*1000) / 800000));
		System.out.println("The average unitilization rate for group4 = " + ((double)(numB*1100+numC*900) / 600000));
		System.out.println("The average unitilization rate for group5 = " + ((double)(numA*500+numC*250) / 200000));
		
		System.out.println(" " );
		
		System.out.println("The average waiting time for Group 1 = " + ((double)G1WaitTime / G1WQ / 3 /1000));
		System.out.println("The average waiting time for Group 2 = " + ((double)G2WaitTime / G2WQ / 2 /1000));
		System.out.println("The average waiting time for Group 3 = " + ((double)G3WaitTime / G3WQ / 4 /1000));
		System.out.println("The average waiting time for Group 4 = " + ((double)G4WaitTime / G4WQ / 3 /1000));
		System.out.println("The average waiting time for Group 5 = " + ((double)G5WaitTime / G5WQ / 1 /1000));
		System.out.println("The waiting time for Storage is = " + StWaitTime /1000);
		System.out.println("The average waiting time for Storage Overflowing = " + ((double)StOverflowTime / StOQ /1000));
		
		System.out.println(" " );
		
		System.out.println("The average waitings for Group 1 = " + (G1WQ / 3));
		System.out.println("The average waitings for Group 2 = " + (G2WQ / 2));
		System.out.println("The average waitings for Group 3 = " + (G3WQ / 4));
		System.out.println("The average waitings for Group 4 = " + (G4WQ / 3));
		System.out.println("The average waitings for Group 5 = " + (G5WQ / 1));
		System.out.println("The waitings for Intermediate products = " + StWQ );
		System.out.println("The waitings for Stroage overflowing = " + StOQ );
	}
}
