/**
 * Copyright (c) 2011, 2012 Ericsson AB and others.
 * 
 * All rights reserved. This program and the accompanying materials are
 * made available under the terms of the Eclipse Public License v1.0 which
 * accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors:
 *    Ericsson AB - Initial implementation
 * 
 */
package org.eclipse.mylyn.reviews.vcalendar.core;

import java.text.SimpleDateFormat;
import java.util.Locale;
import java.util.TimeZone;

import org.eclipse.mylyn.reviews.notifications.core.IMeetingData;

/**
 * @author Jacques Bouthillier
 * @version $Revision: 1.0 $
 */
public class VCalendar {

	private long fTIME_ZONE_OFFSET = TimeZone.getDefault().getOffset(System.currentTimeMillis());

	private final String fNEW_LINE = "\n";

	private final String fGMT_TIME = "Z";

	private final SimpleDateFormat fDATE_FORMAT = new SimpleDateFormat("yyyyMMdd'T'HHmmss", new Locale("eng", "US"));

	public VCalendar() {
	}

	/**
	 * Build the VCalendar and return it as a String
	 * 
	 * @param aInfo
	 *            Meeting data information
	 * @param aMsgBody
	 * @param aFrom
	 *            Creator of the calendar
	 * @param aEmails
	 *            List of email's of the recipients
	 * @return
	 */
	public String createVCalendar(IMeetingData aInfo, String aFrom, String[] aEmails) {
		StringBuffer sb = new StringBuffer();
		sb.append("BEGIN:VCALENDAR");
		sb.append(fNEW_LINE);
		sb.append("PRODID:-//Microsoft Corporation//Outlook 11.0 MIMEDIR//EN");
		sb.append(fNEW_LINE);
		sb.append("VERSION:1.0");
		sb.append(fNEW_LINE);
		sb.append("BEGIN:VEVENT");
		sb.append(fNEW_LINE);
		sb.append("ATTENDEE:");
		sb.append(getAttendee(aEmails));
		sb.append(fNEW_LINE);
		sb.append("DTSTART:");
		sb.append(getStartDate(aInfo));
		sb.append(fGMT_TIME);
		sb.append(fNEW_LINE);
		sb.append("DTEND:");
		sb.append(getEndDate(aInfo));
		sb.append(fGMT_TIME);
		sb.append(fNEW_LINE);
		sb.append("LOCATION:");
		sb.append(aInfo.getLocation());
		sb.append(fNEW_LINE);

		sb.append("DESCRIPTION;ENCODING=QUOTED-PRINTABLE:");
		sb.append(reformatMessageBody(aInfo.getBody()));
		sb.append("=0D=0A");
		sb.append(fNEW_LINE);
		sb.append("SUMMARY;ENCODING=QUOTED-PRINTABLE:");
		sb.append(aInfo.getSubject());
		sb.append(fNEW_LINE);
		sb.append("PRIORITY:3");
		sb.append(fNEW_LINE);
		sb.append("END:VEVENT");
		sb.append(fNEW_LINE);
		sb.append("END:VCALENDAR");

		return sb.toString();

	}

	/**
	 * Reformat the content of the message to replace "\n" char by the appropriate value to be used in the vCalendar
	 * 
	 * @param aBody
	 *            String
	 * @return String
	 */
	private String reformatMessageBody(String aBody) {

		String lineSeparator = System.getProperty("line.separator");

		String str = aBody.trim().replaceAll(lineSeparator, "=0D=0A"); //line feed + carriage return 

		str = str.replaceAll("\n", "=0D=0A"); //new line 

		str = str.replaceAll("\r", "=0D=0A"); //CR

		return str;

	}

	/**
	 * Get the list of attendee email's to include in the Vcalendar
	 * 
	 * @return String
	 */
	private String getAttendee(String[] aEmails) {
		StringBuffer sb = new StringBuffer();
		int size = aEmails.length;

		for (int i = 0; i < size; i++) {
			sb.append("\"MAILTO:");
			sb.append(aEmails[i]);
			if (i < (size - 1)) {
				sb.append("\","); // Separator between attendees
			} else {
				sb.append('"'); // End quotes only
			}
		}
		return sb.toString();

	}

	/**
	 * Compute a date the decision meeting should take place
	 * 
	 * @return String
	 */
	private String getStartDate(IMeetingData aInfo) {
		return fDATE_FORMAT.format(aInfo.getStartTime() - fTIME_ZONE_OFFSET);
	}

	/**
	 * Compute the end meeting date and time
	 * 
	 * @return String
	 */
	private String getEndDate(IMeetingData aInfo) {
		Long timeDuration = (long) (aInfo.getDuration() * 60 * 1000); //convert minutes to millisec
		return fDATE_FORMAT.format(aInfo.getStartTime() + timeDuration - fTIME_ZONE_OFFSET);
	}

}
