importPackage(com.ebasetech.xi.api);
importPackage(com.ebasetech.xi.services);





function readMail ()
{
	var session = Session.getDefaultInstance(properties);
	// session.setDebug(true);

      try 
      {
         // Get a Store object and connect to the current host
         var store = session.getStore("pop3");
         store.connect(host, user,pwd);//change the user and password accordingly

         var folder = store.getFolder("inbox");
         if (!folder.exists()) 
         {
           log("inbox not found");
           return;
         }
         folder.open(Folder.READ_ONLY);

         var reader = new BufferedReader(new InputStreamReader(System.in));

         var messages = folder.getMessages();
         if (messages.length != 0) 
         {
            for (var i = 0, n = messages.length; i < n; i++) 
            {
               var message = messages[i];
								var json = processEmail(message);
								var parameters = {
									emailJsonObj:json
								};
							var jobId = system.workflow.openJob('test', parameters)
							log(JSON.stringify(json, null, 5));              
            } //end of for loop
						log("");
						log("############ ALL EMAILS PROCESSED ###############");
						log("");
         } 
         else 
         {
            log("There is no msg....");
         }

      } 
      catch (e) 
      {
         log(e);
      }
}



function sendRequestorEmail(fromEmail, toEmail, subject, bodyText, responses, attachments, signature)
{
	log("#--> functions: sendRequestorEmail : start");

//      try 
//      {
	      var session = Session.getDefaultInstance(properties, null);
	    	var message = new MimeMessage(session);  			
				
	      /* -----------------------------------------
	      	Format the body of the email depending on
	      	what has been passed in
	      ------------------------------------------*/
				message.setFrom(new InternetAddress(fromEmail));
				message.addRecipient(Message.RecipientType.TO, new InternetAddress(toEmail));
				message.setSubject(subject);
	      
	      var multipart = new MimeMultipart("related")
	      var emailBody = '';
	      
	      if(bodyText != null)
	      {
	      	log("@==> adding body text");
	      	emailBody += bodyText;
	      }
				emailBody += '<br />';
	      if(responses.length >0)
	      {
	      	log("@==> adding responses");
	      	for(var r=0; r<responses.length; r++)
	      	{
	      		emailBody += responses[r];
	      	}
	      }
				emailBody += '<br /><br /><br />';
	      if(signature != null)
	      {
	      	log("@==> adding signature");
	      	emailBody += signature;
	      }

      	var emailBodyPart = new MimeBodyPart();
      	emailBodyPart.setText(emailBody, "UTF-8", "html");
        multipart.addBodyPart(emailBodyPart);
	      
		    if(attachments.length != 0)
		    {
		    	log("@==> adding attachments");
		    	for(var i=0; i<attachments.length; i++) 
		    	{
						var fileName = attachments[i].replace(/^.*[\\\/]/, '');
						var attachmentBodyPart = new MimeBodyPart();
						var source = new FileDataSource(attachments[i]);
						attachmentBodyPart.setDataHandler(new DataHandler(source));
						attachmentBodyPart.setFileName(fileName);
						multipart.addBodyPart(attachmentBodyPart);	    		
		    	}
		    }
				
				message.setContent(multipart);
				/* --------------------------------
					Get the message id of this email
				--------------------------------*/
				message.saveChanges();
				var new_message_id = message.getMessageID();
				var transport = session.getTransport("smtp");
				transport.connect(host, user, password)
				transport.sendMessage(message, message.getAllRecipients());
//      } 
//      catch (e) 
//      {
//					log("#--> functions: sendRequestorEmail : error");
//         	log(e);
//      }
	return new_message_id;
}

function sendGenericEmail(fromEmail, toEmail, subject, content)
{

//      try {
         // Create a default MimeMessage object.
	      var session = Session.getDefaultInstance(properties, null);
	    	var message = new MimeMessage(session);  			
				var multipart = new MimeMultipart("related")
				
         // Set From: header field of the header.
         message.setFrom(new InternetAddress(fromEmail));

         // Set To: header field of the header.
         message.addRecipient(Message.RecipientType.TO, new InternetAddress(toEmail));

         // Set Subject: header field
         message.setSubject(subject);

         // Now set the actual message
        	var emailBodyPart = new MimeBodyPart();
	      	emailBodyPart.setText(content, "UTF-8", "html");
	        multipart.addBodyPart(emailBodyPart);
         	message.setContent(multipart);
  
         // Send message
         var transport = session.getTransport("smtp");
         transport.connect(host, user, password)
         transport.sendMessage(message,message.getAllRecipients());
         log("Sent generic message successfully....");
//      } catch (e) {
//         log(e);
//      }

}

function processEmail(message)
{
 	var messageJson = 
 	{
 		"messageId" : "",
 		"inReplyTo" : "",
 		"sender" : "",
 		"from" : "",
 		"replyTo" : "",
 		"recipient": "",
 		"subject" : "",
 		"sent" : "",
 		"fullContent" : "",
 		"latestReply" : "",
 		"processed":"false"
 	}
    // process the email message
    var messageId = message.getHeader("Message-Id")[0].toString();
    var inReplyTo = "";
    try{
    	inReplyTo = message.getHeader("In-Reply-To")[0].toString();
    }
    catch(e)
    {
    	inReply="";
    	log("## not a reply email"); 
    }
   
    var sent = message.getSentDate();
    var from = InternetAddress.toString(message.getFrom());
    var sender = from.split("<")[0];
    var reply = InternetAddress.toString(message.getReplyTo());
    var recipient = InternetAddress.toString(message.getRecipients(Message.RecipientType.TO));
    var subject = message.getSubject();
    var fullContent = getEmailBody(message);
    log("");
    log("### FULL CONTENT ###");
    log(fullContent);
    log("");
    var latestReply = "";
		if (fullContent.indexOf("From")!=-1)
    {
    	latestReply = fullContent.substring(0, fullContent.indexOf("From")).trim();
    }
    else
    {
    	latestReply = fullContent.trim();
    }    
    
    messageJson.messageId = messageId;
    messageJson.inReplyTo = inReplyTo;
    messageJson.from = from;
    messageJson.sender =sender;
    messageJson.replyTo = reply;
    messageJson.recipient = recipient;
    messageJson.subject = subject;
    messageJson.sent =  sent;
    messageJson.fullContent = fullContent;
    messageJson.latestReply = latestReply;
    	
	return JSON.stringify(messageJson);	
}


function getEmailBody(message)
{
   var result = '';
    if ( message.isMimeType("text/plain") ) {
               // plain text
       result = message.getContent().toString();
    } 
    else if (message.isMimeType("text/html"))
    {
    	var html = message.getContent();
    	result = Jsoup.parse(html).text();
    }
    else {
       if (message.isMimeType("multipart/*")) {
          // multi-part, so drilldown
          var mimeMultipart = message.getContent();
          result = getTextFromMimeMultipart(mimeMultipart);
       }
    }	
	return result;
}

function getTextFromMimeMultipart(mimeMultipart) 
{

	var result = '';
   // get the number of body parts
  var count = mimeMultipart.getCount();
  // loop through each body part
  for (var i = 0; i < count; i++) {
     var bodyPart = mimeMultipart.getBodyPart(i);
     // plain text        
     if (bodyPart.isMimeType("text/plain")) {
        result = result + "\n" + bodyPart.getContent();
     }
     else {
                // html
        if (bodyPart.isMimeType("text/html")) {
           var html = bodyPart.getContent();
           result = result + "\n" + Jsoup.parse(html).text();
        } 
        else {
                 // a mime multi-part then, so we must recurse
                   if (bodyPart.getContent().getClass() == 'class javax.mail.internet.MimeMultipart') 
                   {
              			result = result + getTextFromMimeMultipart(bodyPart.getContent());
                   }
        }
     }
}
   // return the result var
   return result;
}

function checkIfReply(json)
{
	var isReply = false;
	var stmt = "select count(*) as isReply from emails where message_id = '" + json.inReplyTo + "'";
	log("## checkIfReply ##");
	log(stmt);
	services.database.executeSelectStatement(dbsource, stmt, function(data)
	{
		if(data.isReply > 1)
		{
			isReply=true;
		}
	});
	log("## after checkIfReply");
	return isReply;
}


function writeEmailToDatabase(json)
{
	var stmt = "";
	stmt += "insert into emails(";
	stmt += "message_id,";
	stmt += "in_reply_to,";
	stmt += "sent,";
	stmt += "from_email,";
	stmt += "subject,";
	stmt += "content,";
	stmt += "actioned,";
	stmt += "has_workflow,";
	stmt += "accepted,";
	stmt += "closed";
	stmt += ") values (";
	stmt += "'" + json.messageId + "', ";
	stmt += "'" + json.inReplyTo + "', ";
	stmt += "'" + json.sent +"',";
	stmt += "'" + json.from	+"', ";
	stmt += "'" + json.subject +"',";
	stmt += "'', ";//"'"  + JSON.stringify(json.content) + "',";
	stmt += false + ",";
	stmt += false + ",";
	stmt += false + ",";
	stmt += false;
	stmt += ")";
	log("");
	log("## writeEmail ##");
	log(stmt);
	log("");
	services.database.executeGenericUpdateStatement(dbsource, stmt) ;
}

function createNewMimeMessage()
{
	var message = new JavaAdapter(MimeMessage, {
   updateMessageID: function () {
       if (getHeader("Message-ID") == null)
       {
        	super.updateMessageID();
       }
   }
},message);

}
