/*******************************************************************************
 * Copyright (c) 2011, 2014 Tasktop Technologies.
 * 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.identity.ui;

import java.io.ByteArrayInputStream;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;

import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.resource.ImageRegistry;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.mylyn.commons.identity.core.Account;
import org.eclipse.mylyn.commons.identity.core.IIdentity;
import org.eclipse.mylyn.commons.identity.core.IProfile;
import org.eclipse.mylyn.commons.identity.core.IProfileImage;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.internal.WorkbenchImages;

/**
 * @author Steffen Pingel
 */
public class PersonLabelProvider extends LabelProvider {

	private static final int IMAGE_SIZE = 16;

	ImageRegistry registry = new ImageRegistry();

	@Override
	public void dispose() {
		registry.dispose();
		super.dispose();
	}

	@Override
	public Image getImage(Object object) {
		if (object instanceof PeopleCategory) {
			return WorkbenchImages.getImage(ISharedImages.IMG_OBJ_FOLDER);
		} else if (object instanceof IIdentity) {
			IIdentity identity = (IIdentity) object;
			Image image = registry.get(identity.getId().toString());
			if (image == null) {
				Future<IProfileImage> result = identity.requestImage(IMAGE_SIZE, IMAGE_SIZE);
				if (result.isDone()) {
					try {
						IProfileImage profileImage = result.get(0, TimeUnit.SECONDS);
						if (profileImage != null) {
							ImageData data = new ImageData(new ByteArrayInputStream(profileImage.getData()));
							if (data.width != IMAGE_SIZE || data.height != IMAGE_SIZE) {
								data = data.scaledTo(IMAGE_SIZE, IMAGE_SIZE);
							}
							registry.put(identity.getId().toString(), ImageDescriptor.createFromImageData(data));
							image = registry.get(identity.getId().toString());
						}
					} catch (Exception e) {
						// ignore
					}
				}
			}
			return image;
		}
		return null;
	}

	@Override
	public String getText(Object object) {
		if (object instanceof IIdentity) {
			IIdentity identity = (IIdentity) object;
			Future<IProfile> result = identity.requestProfile();
			if (result.isDone()) {
				try {
					IProfile profile = result.get(0, TimeUnit.SECONDS);
					if (profile.getName() != null) {
						return profile.getName();
					} else if (profile.getEmail() != null) {
						return profile.getEmail();
					}
				} catch (Exception e) {
					// ignore
				}
			}
			//return identity.getAccounts()[0].getId();
			return identity.getId().toString();
		} else if (object instanceof Account) {
			Account account = (Account) object;
			if (account.getName() != null) {
				return account.getName() + " <" + account.getId() + ">"; //$NON-NLS-1$ //$NON-NLS-2$
			} else {
				return account.getId();
			}
		}
		return null;
	}

}
