import java.io.*;
import java.util.*;

public class TranscriptIO
{
	private Scanner fileScan;
	private File file;
	private String[] args;
	private Transcript t;
	
	public TranscriptIO(String [] a)
	{
		args = a;
	}
	
	public boolean makeFile()
	{
		boolean flagA = hasArg();
		boolean flagE = exists();
		boolean flagO = opens();
		boolean flagH = hasHeader();
		boolean flag = false;
		
		
		if (flagA && flagE && flagO && flagH)
		{
			flag = buildTranscript();
		}
		return flag;
		
	}
	
	public void printTranscript()
	{
		System.out.println(t.getTranscript());
	}
	
	private boolean buildTranscript()
	{
		String line;
		int number = 0;
		boolean flag = true;
		
		line = fileScan.nextLine();
		t = new Transcript(Header.makeHeader(line));
				
		while (fileScan.hasNext() && number == 0)
		{	
			line = fileScan.next();  // get line type

			if(line.equals("D1"))
			{
				line = fileScan.nextLine();
				number = D1.checkD1(line);
				if (number == 0)
					t.addCourse(D1.makeD1(line));
				else
				{
					System.out.println(getMessage(number, line));
					flag = false;
				}
			}
			else if(line.equals("D2"))
			{
				line = fileScan.nextLine();
				number = D2.checkD2(line);
				if (number == 0)
					t.addCourse(D2.makeD2(line));
				else
				{
					System.out.println(getMessage(number, line));
					flag = false;
				}
			}
			else if(line.equals("D3"))
			{
				line = fileScan.nextLine();
				number = D3.checkD3(line);
				if (number == 0)
					t.addCourse(D3.makeD3(line));
				else
				{
					System.out.println(getMessage(number, line));
					flag = false;
				}
			}
			else 
			{
				System.out.println(getMessage(6, line + fileScan.nextLine()));
				flag = false;
			}
					
		} // end while

		return flag;
	}  // end makeTranscript
	
	private boolean exists()
	{	
		boolean flag;
		
		if (file.exists())
			flag = true;
		else
		{
			System.out.println(getMessage(2));
		 	flag = false;
		}
			return flag;
	}
	
	private boolean opens()
	{
		boolean flag;
		try 
		{
			fileScan = new Scanner(file);
			fileScan.useDelimiter("[\n\r,]");
			flag = true;
		}
		catch(Exception E)
		{
			System.out.println(getMessage(3));
			flag = false;
		}
				
		return flag;		
	}
	
	private boolean hasHeader()
	{
		boolean flag = true;
		String token;
		
		if(fileScan.hasNext())
		{
			token = fileScan.next();

			if (token.length() == 1 && token.equals("H"))
				flag = true;
			else
				flag = false;
		}
		else 
			flag = false;
		
		if(!flag)
			System.out.println(getMessage(4));
					
		return flag;
	}
	
	private boolean hasArg()
	{  
		boolean flag;
	
		if (args.length > 0)
		{
			file = new File(args[0]);
			flag = true;
		}
		else 
		{
			System.out.println(getMessage(1));
			flag = false;
		}

		return flag;
	}
	
	private String getMessage(int num)
	{
		String s;
		
		switch (num)
		{
			case 1: s = "Missing file name"; break;
			case 2: s = "File " + file + " does not exist."; break;
			case 3: s = "File " + file + " cannot be opened."; break;
			case 4: s = "Missing header."; break;
			default: s = " BAD MESSAGE";
		}
		
		return s;
	}
	
	private String getMessage(int num, String line)
	{
		String s;
		
		switch(num)
		{
			case 6: s = "Bad row: " + line; break;
			case 7: s = "Wrong format: " + line; break;
			case 8: s = "Invalid numeric values: " + line; break;
			case 9: s = "Invalid hours: " + line; break;
			case 10: s = "Bad grade: " + line; break;
			default: s = "BAD MESSAGE"; break;
		}
		return s;
	}
}
