/*******************************************************************************
 * Copyright (c) 2010, 2015 Tasktop Technologies 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:
 *     Tasktop Technologies - initial API and implementation
 *******************************************************************************/

package org.eclipse.mylyn.internal.commons.notifications.feed;

import java.util.Date;

import org.eclipse.core.runtime.Platform;
import org.eclipse.mylyn.commons.notifications.core.AbstractNotification;

/**
 * @author Robert Elves
 */
public class ServiceMessage extends AbstractNotification {

	private Date date;

	private String description;

	private String eTag;

	private String id = "0"; //$NON-NLS-1$

	private String image;

	private String lastModified;

	private String title;

	private String url;

	public ServiceMessage(String eventId) {
		super(eventId);
	}

	public int compareTo(ServiceMessage o) {
		return -getId().compareTo(o.getId());
	}

	public Object getAdapter(@SuppressWarnings("rawtypes") Class adapter) {
		return Platform.getAdapterManager().getAdapter(this, adapter);
	}

	@Override
	public Date getDate() {
		return date;
	}

	@Override
	public String getDescription() {
		return description;
	}

	public String getETag() {
		return eTag;
	}

	public String getId() {
		return id;
	}

	public String getImage() {
		return image;
	}

	@Override
	public String getLabel() {
		return getTitle();
	}

	public String getLastModified() {
		return lastModified;
	}

	public String getTitle() {
		return title;
	}

	public String getUrl() {
		return url;
	}

	public boolean isValid() {
		return id != null && title != null && description != null && image != null;
	}

	public void setDate(Date date) {
		this.date = date;
	}

	public void setDescription(String description) {
		this.description = description;
	}

	public void setETag(String eTag) {
		this.eTag = eTag;
	}

	public void setId(String id) {
		this.id = id;
	}

	public void setImage(String image) {
		this.image = image;
	}

	public void setLastModified(String lastModified) {
		this.lastModified = lastModified;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public void setUrl(String url) {
		this.url = url;
	}

	@Override
	public String toString() {
		StringBuilder builder = new StringBuilder();
		builder.append("ServiceMessage [id="); //$NON-NLS-1$
		builder.append(id);
		builder.append(", title="); //$NON-NLS-1$
		builder.append(title);
		builder.append(", description="); //$NON-NLS-1$
		builder.append(description);
		builder.append(", url="); //$NON-NLS-1$
		builder.append(url);
		builder.append(", image="); //$NON-NLS-1$
		builder.append(image);
		builder.append(", eTag="); //$NON-NLS-1$
		builder.append(eTag);
		builder.append(", lastModified="); //$NON-NLS-1$
		builder.append(lastModified);
		builder.append(", date="); //$NON-NLS-1$
		builder.append(date);
		builder.append("]"); //$NON-NLS-1$
		return builder.toString();
	}

	/**
	 * Called when the user clicks a link in the message.
	 * 
	 * @return whether the message should be closed when the link is clicked
	 */
	public boolean openLink(String link) {
		return false;
	}

}
