/*******************************************************************************
 * Copyright (c) 2004, 2014 Tasktop Technologies and others.
 * 
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0 which is available at
 * https://www.eclipse.org/legal/epl-2.0
 * 
 * SPDX-License-Identifier: EPL-2.0
 *
 *     Eike Stepper - initial API and implementation
 *     Tasktop Technologies - improvements
 *******************************************************************************/

package org.eclipse.mylyn.internal.team.ui.templates;

import java.net.URL;
import java.util.Date;
import java.util.List;
import java.util.Locale;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
import org.eclipse.mylyn.tasks.core.ITask;
import org.eclipse.mylyn.tasks.core.ITaskMapping;
import org.eclipse.mylyn.tasks.core.TaskRepository;
import org.eclipse.mylyn.tasks.core.data.TaskData;
import org.eclipse.mylyn.tasks.ui.TasksUi;
import org.eclipse.mylyn.team.ui.AbstractCommitTemplateVariable;

/**
 * @author Eike Stepper
 * @author Mik Kersten
 * @author Steffen Pingel
 */
public class CommitTemplateVariables {

	private static String implode(List<String> list, String separator) {
		if (list == null) {
			return null;
		}
		StringBuilder builder = new StringBuilder();
		for (String cc : list) {
			if (builder.length() != 0) {
				builder.append(separator);
			}

			builder.append(cc);
		}

		return builder.toString();
	}

	public static class ConnectorTaskPrefix extends AbstractCommitTemplateVariable {

		@Override
		public String getValue(ITask task) {
			if (task != null) {
				AbstractRepositoryConnector connector = TasksUi.getRepositoryManager().getRepositoryConnector(
						task.getConnectorKind());
				if (connector != null) {
					return connector.getTaskIdPrefix();
				}
			}
			return null;
		}

	}

	public static class RepositoryKind extends AbstractCommitTemplateVariable {
		@Override
		public String getValue(ITask task) {
			if (task != null) {
				return task.getConnectorKind();
			}
			return null;
		}
	}

	public static class RepositoryUrl extends AbstractCommitTemplateVariable {
		@Override
		public String getValue(ITask task) {
			if (task != null) {
				return task.getRepositoryUrl();
			}

			return null;
		}
	}

	public static class TaskProduct extends AbstractCommitTemplateVariable {
		@Override
		public String getValue(ITask task) {
			ITaskMapping taskMapping = getTaskMapping(task);
			if (taskMapping != null) {
				return taskMapping.getProduct();
			}
			return null;
		}
	}

	public static class TaskAssignee extends AbstractCommitTemplateVariable {
		@Override
		public String getValue(ITask task) {
			ITaskMapping taskMapping = getTaskMapping(task);
			if (taskMapping != null) {
				return taskMapping.getOwner();
			}
			return null;
		}
	}

	public static class TaskReporter extends AbstractCommitTemplateVariable {
		@Override
		public String getValue(ITask task) {
			ITaskMapping taskMapping = getTaskMapping(task);
			if (taskMapping != null) {
				return taskMapping.getReporter();
			}
			return null;
		}
	}

	public static class TaskResolution extends AbstractCommitTemplateVariable {
		@Override
		public String getValue(ITask task) {
			ITaskMapping taskMapping = getTaskMapping(task);
			if (taskMapping != null) {
				return taskMapping.getResolution();
			}
			return null;
		}
	}

	public static class TaskStatus extends AbstractCommitTemplateVariable {
		@Override
		public String getValue(ITask task) {
			ITaskMapping taskMapping = getTaskMapping(task);
			if (taskMapping != null) {
				String status = taskMapping.getTaskStatus();
				if (status != null) {
					return status.toUpperCase(Locale.ENGLISH);
				}
			}
			if (task != null) {
				if (task.isCompleted()) {
					return Messages.CommitTemplateVariables_Complete;
				} else {
					return Messages.CommitTemplateVariables_Incomplete;
				}
			}
			return null;
		}
	}

	public static class TaskCc extends AbstractCommitTemplateVariable {
		@Override
		public String getValue(ITask task) {
			ITaskMapping taskMapping = getTaskMapping(task);
			if (taskMapping != null) {
				List<String> list = taskMapping.getCc();
				return implode(list, ", "); //$NON-NLS-1$
			}
			return null;
		}
	}

	public static class TaskKeywords extends AbstractCommitTemplateVariable {
		@Override
		public String getValue(ITask task) {
			ITaskMapping taskMapping = getTaskMapping(task);
			if (taskMapping != null) {
				List<String> list = getTaskMapping(task).getKeywords();
				return implode(list, ", "); //$NON-NLS-1$
			}
			return null;
		}
	}

	public static class TaskLastModified extends CommitTemplateDate {
		@Override
		protected Date getDate(ITask task) {
			ITaskMapping taskMapping = getTaskMapping(task);
			if (taskMapping != null) {
				return taskMapping.getModificationDate();
			}
			return null;
		}
	}

	public static class TaskSummary extends AbstractCommitTemplateVariable {
		@Override
		public String getValue(ITask task) {
			ITaskMapping taskMapping = getTaskMapping(task);
			if (taskMapping != null) {
				return getTaskMapping(task).getSummary();
			}
			return ""; //$NON-NLS-1$
		}
	}

	public static class TaskDescription extends AbstractCommitTemplateVariable {
		@Override
		public String getValue(ITask task) {
			if (task != null) {
				return task.getSummary();
			}
			return ""; //$NON-NLS-1$
		}
	}

	public static class TaskId extends AbstractCommitTemplateVariable {
		@Override
		public String getValue(ITask task) {
			if (task != null) {
				return task.getTaskId();
			} else {
				return null;
			}
		}
	}

	public static class TaskKey extends AbstractCommitTemplateVariable {
		@Override
		public String getValue(ITask task) {
			if (task != null) {
				return task.getTaskKey();
			} else {
				return null;
			}
		}
	}

	public static class TaskNotes extends AbstractCommitTemplateVariable {
		@SuppressWarnings("restriction")
		@Override
		public String getValue(ITask task) {
			if (task instanceof AbstractTask) {
				return ((AbstractTask) task).getNotes();
			} else {
				return ""; //$NON-NLS-1$
			}
		}
	}

	public static class TaskPriority extends AbstractCommitTemplateVariable {
		@Override
		public String getValue(ITask task) {
			return task.getPriority();
		}
	}

	public static class TaskType extends AbstractCommitTemplateVariable {
		@Override
		public String getValue(ITask task) {
			return task.getTaskKind();
		}
	}

	public static class TaskURL extends AbstractCommitTemplateVariable {
		@Override
		public String getValue(ITask task) {
			AbstractRepositoryConnector connector = TasksUi.getRepositoryConnector(task.getConnectorKind());
			TaskRepository repository = TasksUiInternal.getRepository(task);
			if (repository != null) {
				URL url = connector.getBrowserUrl(repository, task);
				if (url != null) {
					return url.toString();
				}
			}
			return task.getUrl();
		}
	}

	public static ITaskMapping getTaskMapping(ITask task) {
		if (task != null) {
			TaskData taskData;
			try {
				taskData = TasksUi.getTaskDataManager().getTaskData(task);
				if (taskData != null) {
					AbstractRepositoryConnector connector = TasksUi.getRepositoryManager().getRepositoryConnector(
							task.getConnectorKind());
					return connector.getTaskMapping(taskData);
				}
			} catch (CoreException e) {
				// ignore
			}
		}
		return null;
	}

	/**
	 * @author Eike Stepper
	 */
	public static class TaskCompletion extends CommitTemplateDate {
		@Override
		protected Date getDate(ITask task) {
			return task.getCompletionDate();
		}
	}

	/**
	 * @author Eike Stepper
	 */
	public static class TaskCreation extends CommitTemplateDate {
		@Override
		protected Date getDate(ITask task) {
			return task.getCreationDate();
		}
	}

	/**
	 * @author Eike Stepper
	 */
	public static class TaskReminder extends CommitTemplateDate {
		@Override
		protected Date getDate(ITask task) {
//			 TODO: Hide this field?
			return ((AbstractTask) task).getScheduledForDate().getStartDate().getTime();
		}
	}

	/**
	 * @author Eike Stepper
	 */
	private static abstract class CommitTemplateDate extends AbstractCommitTemplateVariable {

		@Override
		public String getValue(ITask task) {
			java.util.Date date = getDate(task);
			return (date != null) ? formatDate(date) : null;
		}

		protected String formatDate(java.util.Date date) {
			return date.toString();
		}

		protected abstract java.util.Date getDate(ITask task);

	}

}
