/*******************************************************************************
 * Copyright (c) 2013, 2014 Ericsson
 * 
 * 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:
 *   Francois Chouinard - Initial implementation
 *   Marc-Andre Laperle - Add Topic to dashboard
 *   Marc-Andre Laperle - Add Status to dashboard
 ******************************************************************************/

package org.eclipse.mylyn.gerrit.dashboard.core;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Map;

import org.eclipse.mylyn.gerrit.dashboard.Messages;
import org.eclipse.mylyn.internal.gerrit.core.GerritQueryResultSchema;
import org.eclipse.mylyn.internal.gerrit.core.GerritTaskSchema;
import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
import org.eclipse.mylyn.tasks.core.data.TaskData;

/**
 * A Dashboard Gerrit review task
 * 
 * @author Francois Chouinard
 * @version 0.1
 */
@SuppressWarnings("restriction")
public class GerritTask extends AbstractTask {

	// -------------------------------------------------------------------------
	// Constants
	// -------------------------------------------------------------------------

	/**
	 * Mylyn Task ID
	 */
	public static final String TASK_ID = "dashboard.mylyn.task.id"; //$NON-NLS-1$

	/**
	 * Gerrit Review shortened Change-Id
	 */
	public static final String SHORT_CHANGE_ID = TaskAttribute.TASK_KEY;

	/**
	 * Gerrit Review Change-Id
	 */
	public static final String CHANGE_ID = GerritQueryResultSchema.getDefault().CHANGE_ID.getKey();

	/**
	 * Gerrit Review subject
	 */
	public static final String SUBJECT = TaskAttribute.SUMMARY;

	/**
	 * Gerrit Review status
	 */
	public static final String STATUS = GerritTaskSchema.getDefault().STATUS.getKey();

	/**
	 * Gerrit Review owner
	 */
	public static final String OWNER = GerritTaskSchema.getDefault().OWNER.getKey();

	/**
	 * Gerrit Review project
	 */
	public static final String PROJECT = TaskAttribute.PRODUCT;

	/**
	 * Gerrit Review branch
	 */
	public static final String BRANCH = GerritTaskSchema.getDefault().BRANCH.getKey();

	/**
	 * Gerrit Review topic
	 */
	public static final String TOPIC = GerritTaskSchema.getDefault().TOPIC.getKey();

	/**
	 * Gerrit Review creation date
	 */
	public static final String DATE_CREATION = TaskAttribute.DATE_CREATION;

	/**
	 * Gerrit Review last modification date
	 */
	public static final String DATE_MODIFICATION = TaskAttribute.DATE_MODIFICATION;

	/**
	 * Gerrit Review completion date
	 */
	public static final String DATE_COMPLETION = TaskAttribute.DATE_COMPLETION;

	/**
	 * Gerrit Review flags
	 */
	public static final String IS_STARRED = GerritTaskSchema.getDefault().IS_STARRED.getKey();

	public static final String REVIEW_STATE = GerritTaskSchema.getDefault().REVIEW_STATE.getKey();

	public static final String VERIFY_STATE = GerritTaskSchema.getDefault().VERIFY_STATE.getKey();

	/**
	 * Date format
	 */
	private static SimpleDateFormat FORMAT_HOUR = new SimpleDateFormat("h:mm a"); //$NON-NLS-1$

	private static SimpleDateFormat FORMAT_MONTH = new SimpleDateFormat("MMM d"); //$NON-NLS-1$

	private static SimpleDateFormat FORMAT_FULL = new SimpleDateFormat("MMM d, yyyy"); //$NON-NLS-1$

	// -------------------------------------------------------------------------
	// Attributes
	// -------------------------------------------------------------------------

	// The connector kind
	private final String fConnectorKind;

	// -------------------------------------------------------------------------
	// Constructor
	// -------------------------------------------------------------------------

	/**
	 * Construct an GerritTask from a Gerrit query result. Some fields may be missing from the task data.
	 * 
	 * @param taskData
	 *            the Gerrit task data
	 */
	public GerritTask(final TaskData taskData) {
		super(taskData.getRepositoryUrl(), taskData.getTaskId(), taskData.getRoot()
				.getAttribute(TaskAttribute.SUMMARY)
				.getValue()
				+ " [" + taskData.getRoot().getAttribute(TaskAttribute.TASK_KEY).getValue() + "]"); //$NON-NLS-1$ //$NON-NLS-2$

		fConnectorKind = taskData.getConnectorKind();

		TaskAttribute root = taskData.getRoot();
		Map<String, TaskAttribute> attributes = root.getAttributes();

		setAttribute(TASK_ID, taskData.getTaskId());
		setAttribute(SHORT_CHANGE_ID, getValue(attributes.get(SHORT_CHANGE_ID)));
		setAttribute(CHANGE_ID, getValue(attributes.get(CHANGE_ID)));
		setAttribute(SUBJECT, getValue(attributes.get(SUBJECT)));
		setAttribute(STATUS, getValue(attributes.get(STATUS)));

		setAttribute(OWNER, taskData.getAttributeMapper().getValueLabel(attributes.get(OWNER)));
		setAttribute(PROJECT, getValue(attributes.get(PROJECT)));
		setAttribute(BRANCH, getValue(attributes.get(BRANCH)));
		setAttribute(TOPIC, getValue(attributes.get(TOPIC)));

		setAttribute(DATE_CREATION, getValue(attributes.get(DATE_CREATION)));
		setAttribute(DATE_MODIFICATION, getValue(attributes.get(DATE_MODIFICATION)));
		setAttribute(DATE_COMPLETION, getValue(attributes.get(DATE_COMPLETION)));

		setAttribute(IS_STARRED, getValue(attributes.get(IS_STARRED)));
		setAttribute(REVIEW_STATE, getValue(attributes.get(REVIEW_STATE)));
		setAttribute(VERIFY_STATE, getValue(attributes.get(VERIFY_STATE)));
	}

	/*
	 * Extract the first value from the specified task attributes list.
	 * 
	 * @param taskAttribute
	 * 
	 * @return the first value in the list (if any)
	 */
	private String getValue(TaskAttribute taskAttribute) {
		if (taskAttribute != null) {
			List<String> values = taskAttribute.getValues();
			if (values != null && values.size() > 0) {
				return values.get(0);
			}
		}
		return null;
	}

	// -------------------------------------------------------------------------
	// Getters and Setters
	// -------------------------------------------------------------------------

	/**
	 * Format the requested Gerrit Review attribute as a date string. As in the Gerrit web UI, the output format depends
	 * on the date relation with 'today': Same day: 'hh:mm am/pm' Same year, different day: 'Mon DD' Different year:
	 * 'Mon DD, YYYY' (not implemented)
	 * 
	 * @param key
	 *            one of { DATE_CREATION, DATE_MODIFICATION, DATE_COMPLETION }
	 * @return
	 */
	public String getAttributeAsDate(String key) {
		// Validate the supplied key
		if (!key.equals(DATE_CREATION) && !key.equals(DATE_MODIFICATION) && !key.equals(DATE_COMPLETION)) {
			return ""; //$NON-NLS-1$
		}

		// Retrieve the date
		String rawDate = getAttribute(key);
		if (rawDate == null) {
			return ""; //$NON-NLS-1$
		}

		// Format the date
		Date date = new Date(Long.parseLong(rawDate));
		if (isToday(date)) {
			return FORMAT_HOUR.format(date);
		}
		if (isThisYear(date)) {
			return FORMAT_MONTH.format(date);
		}
		return FORMAT_FULL.format(date);
	}

	/**
	 * Indicates if a date is 'today'
	 * 
	 * @param date
	 *            the date to check against 'today'
	 * @return true if 'today'
	 */
	private boolean isToday(Date date) {
		Calendar cal1 = Calendar.getInstance(); // today
		Calendar cal2 = Calendar.getInstance();
		cal2.setTime(date);

		boolean sameDay = (cal1.get(Calendar.YEAR) == cal2.get(Calendar.YEAR) && (cal1.get(Calendar.DAY_OF_YEAR) == cal2.get(Calendar.DAY_OF_YEAR)));

		return sameDay;
	}

	/**
	 * Indicates if a date is 'this year'
	 * 
	 * @param date
	 *            the date to check
	 * @return true if same year as today
	 */
	private boolean isThisYear(Date date) {
		Calendar cal1 = Calendar.getInstance(); // today
		Calendar cal2 = Calendar.getInstance();
		cal2.setTime(date);

		return cal1.get(Calendar.YEAR) == cal2.get(Calendar.YEAR);
	}

	// -------------------------------------------------------------------------
	// AbstractTask
	// -------------------------------------------------------------------------

	@Override
	public boolean isLocal() {
		return false;
	}

	@Override
	public String getConnectorKind() {
		return fConnectorKind;
	}

	// -------------------------------------------------------------------------
	// Object
	// -------------------------------------------------------------------------

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		StringBuffer buffer = new StringBuffer();
		buffer.append(Messages.GerritTask_taskID).append(getAttribute(GerritTask.TASK_ID)).append('\n');
		buffer.append(Messages.GerritTask_shortID).append(getAttribute(GerritTask.SHORT_CHANGE_ID)).append('\n');
		buffer.append(Messages.GerritTask_changeID).append(getAttribute(GerritTask.CHANGE_ID)).append('\n');
		buffer.append(Messages.GerritTask_subject).append(getAttribute(GerritTask.SUBJECT)).append('\n');
		buffer.append(Messages.GerritTask_status).append(getAttribute(GerritTask.STATUS)).append('\n');
		buffer.append(Messages.GerritTask_owner).append(getAttribute(GerritTask.OWNER)).append('\n');
		buffer.append(Messages.GerritTask_project).append(getAttribute(GerritTask.PROJECT)).append('\n');
		buffer.append(Messages.GerritTask_branch).append(getAttribute(GerritTask.BRANCH)).append('\n');
		buffer.append(Messages.GerritTask_topic).append(getAttribute(GerritTask.TOPIC)).append('\n');
		buffer.append(Messages.GerritTask_updated)
				.append(getAttributeAsDate(GerritTask.DATE_MODIFICATION))
				.append('\n');
		buffer.append(Messages.GerritTask_star).append(getAttribute(GerritTask.IS_STARRED)).append(", CRVW = ") //$NON-NLS-1$
				.append(getAttribute(GerritTask.REVIEW_STATE))
				.append(", VRIF = ") //$NON-NLS-1$
				.append(getAttribute(GerritTask.VERIFY_STATE))
				.append("\n"); //$NON-NLS-1$
		return buffer.toString();
	}

}
