import java.io.*;
import java.util.*;

public class Assign3
{
	static public void main (String args[])
	{
		String fileLine;
		
		createDirectories();
		
		File inMsgFile = new File(args[0]);
		MailMessage msg = new MailMessage(inMsgFile);

		msg.moveMessage();		
	}

	private static void createDirectories()
	{
		File messageDir = new File("C:\\SMTP\\Messages");
		File incomingDir = new File("C:\\SMTP\\Incoming");
		File outgoingDir = new File("C:\\SMTP\\Outgoing");

		messageDir.mkdirs();
		incomingDir.mkdirs();
		outgoingDir.mkdirs();		
	}
}

/////////////////////////////////////////////////
// This MailMessage class is modified from the MailMessage
// class developed by Dr. Doug Harris of Marquette University
//////////////////////////////////////////////////

class MailMessage
{
	protected String returnAddress;
	protected Vector recipientList=new Vector();
	protected String filename;
	protected File origFile;
	private String sendingServer;
	private String receiveID;
	private Date receiveTime;

	public MailMessage(File x)
	{
		BufferedReader msgReader=null;
		String fileLine;
		boolean outgoing = false, success = false;
		StringTokenizer tk=null;
			
		origFile = x;
		receiveID = generateReceiveID();
		receiveTime = new Date(System.currentTimeMillis());
		
		try
		{
			msgReader=new BufferedReader(new FileReader(x));
		} catch(IOException z)
		{
			System.out.println(z.getMessage());
		}
		
		boolean receivedFill = false;
		
		try
		{
			while(null != (fileLine = msgReader.readLine()))
			{			
				if(fileLine.startsWith("From:"))
				{
					returnAddress = fileLine.substring(5).trim();
				}
				else if(fileLine.startsWith("Received:") && receivedFill == false)
				{
					receivedFill = true;
					fileLine = " " + fileLine;
					while(fileLine.charAt(0) == ' ' || fileLine.charAt(0) == '\t')
					{
						tk=new StringTokenizer(fileLine);
						while(tk.hasMoreTokens())
						{
							String curtoken = tk.nextToken();
							if(curtoken.equals("by"))
								sendingServer = tk.nextToken();
							if(curtoken.equals("for"))
							{
								String name = tk.nextToken().trim();
								if(name.charAt(name.length() - 1) == ';')
									name = name.substring(0, name.length() - 1);								
								if(name.charAt(0) == '<')
									name = name.substring(1, name.length() - 1);
								recipientList.add(name);
							}
						}
					fileLine = msgReader.readLine();
					}
				}
			}
			msgReader.close();
		}catch(IOException z)
		{
			System.out.println("Premature end");
			System.out.println(z.getMessage());
		}
	}

	public void moveMessage()
	{
		String fileLine;
		
		String user = (String)recipientList.elementAt(0);
		StringTokenizer tk = new StringTokenizer(user, "@");
		String username = tk.nextToken().trim();
		if(username.charAt(0) == '<')
			username = username.substring(1);
		
		File createDir = new File("C:\\SMTP\\Incoming\\" + username);
		createDir.mkdirs();		
		
		File msgCopy = new File("C:\\SMTP\\Incoming\\" + username + "\\" + filename + ".msg");
		while(msgCopy.exists())
		{
			generateReceiveID();
			msgCopy = new File("C:\\SMTP\\Incoming\\" + username + "\\" + filename + ".msg");
		}			
		
		try
		{
			BufferedWriter outfile = new BufferedWriter(new FileWriter(msgCopy));
			BufferedReader infile = new BufferedReader(new FileReader(origFile));		

			outfile.write("Received:  from " + sendingServer);
			outfile.newLine();
			outfile.write("\tby mailgate.home.com with SMTP id " + receiveID);
			outfile.newLine();
			outfile.write("\tfor <" + user + ">; " + receiveTime.toString());
			outfile.newLine();
			outfile.write("Return-Path: " + returnAddress);
			outfile.newLine();
			
			while(null != (fileLine = infile.readLine()))
			{
				outfile.write(fileLine);
				outfile.newLine();
			}
			outfile.close();
			infile.close();
		}	catch (IOException z)
		{
			System.out.println(z.getMessage() + "  Message Copy Failed");
		}
	}
	
	private String generateReceiveID()
	{
		String curtime = String.valueOf(System.currentTimeMillis());
		String id = "HME" + curtime.substring(curtime.length() - 5);
		filename = id;
		
		return id;
	}		

	public String getFilename()
	{
		return filename;
	}
	
	public void setReturnAddress(String returnAddress)
	{
		this.returnAddress=returnAddress;
	}

	public String getReturnAddress()
	{
		return returnAddress;
	}

	public void setRecipients(Vector v)
	{
		recipientList=v;
	}

	public void addRecipient(String s)
	{
		recipientList.addElement(s);
	}

	public Enumeration elements()
	{
		return recipientList.elements();
	}
}