/*******************************************************************************
 * Copyright (c) 2000, 2006 IBM Corporation and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.ui.examples.propertysheet;


import java.util.ArrayList;

import org.eclipse.ui.views.properties.IPropertyDescriptor;
import org.eclipse.ui.views.properties.IPropertySource;
import org.eclipse.ui.views.properties.PropertyDescriptor;

/**
 * Example IPropertySource is editable and whose childern properties are itself not editable.
 * The values of "userid" and "mailserver" are parsed from setting "email"
 */
public class EmailAddress implements IPropertySource {

	//Property-Value
	private String userid;

	private String domain;

	//Default Property-Value
	private static final String USERID_DEFAULT = MessageUtil
			.getString("unknownUser"); //$NON-NLS-1$

	private static final String DOMAIN_DEFAULT = MessageUtil
			.getString("unknownDomain"); //$NON-NLS-1$

	//Property unique keys
	public static final String P_ID_USERID = "EmailAddress.userid"; //$NON-NLS-1$

	public static final String P_ID_DOMAIN = "EmailAddress.domain"; //$NON-NLS-1$

	//Property display keys
	public static final String P_USERID = MessageUtil.getString("userid"); //$NON-NLS-1$

	public static final String P_DOMAIN = MessageUtil.getString("domain"); //$NON-NLS-1$

	//Property-Descriptors
	private static ArrayList<PropertyDescriptor> descriptors;

	static {
		descriptors = new ArrayList<>();
		//non-editable child properties --> provide no editors
		descriptors.add(new PropertyDescriptor(P_ID_USERID, P_USERID));
		descriptors.add(new PropertyDescriptor(P_ID_DOMAIN, P_DOMAIN));
	}

	/**
	 * EmailAddress Default Constructor
	 */
	public EmailAddress() {
		super();
	}

	/**
	 * Convience EmailAddress constructor.
	 * Calls setEmailAddress() to parse emailAddress
	 * @param emailAddress java.lang.String, in the form userid@domain
	 * @throws java.lang.IllegalArgumentException if does not subscribe to form
	 */
	public EmailAddress(String emailAddress) throws IllegalArgumentException {
		super();
		setEmailAddress(emailAddress);

	}

	/**
	 * Returns the descriptors
	 */
	private static ArrayList<PropertyDescriptor> getDescriptors() {
		return descriptors;
	}

	/**
	 * Returns the domain
	 */
	private String getDomain() {
		if (domain == null)
			domain = DOMAIN_DEFAULT;
		return domain;
	}

	@Override
	public Object getEditableValue() {
		return this.toString();
	}

	@Override
	public IPropertyDescriptor[] getPropertyDescriptors() {
		return getDescriptors().toArray(
				new IPropertyDescriptor[getDescriptors().size()]);
	}

	/**
	 * The <code>EmailAddress</code> implementation of this
	 * <code>IPropertySource</code> method returns the following properties
	 *
	 * 	1) P_USERID returns String, values before "@"
	 *	2) P_DOMAIN returns String, values after "@"
	 *
	 * Observe the available properties must always equal those listed
	 * in the property descriptors
	 */
	@Override
	public Object getPropertyValue(Object propKey) {
		if (propKey.equals(P_ID_USERID))
			return getUserid();
		if (propKey.equals(P_ID_DOMAIN))
			return getDomain();
		return null;
	}

	/**
	 * Returns the userid
	 */
	private String getUserid() {
		if (userid == null)
			userid = USERID_DEFAULT;
		return userid;
	}

	@Override
	public boolean isPropertySet(Object property) {
		return false;
	}

	@Override
	public void resetPropertyValue(Object property) {
		return;
	}

	/**
	 * Sets the domain
	 */
	private void setDomain(java.lang.String newDomain) {
		domain = newDomain;
	}

	/**
	 * Parses emailAddress into domain and userid. Throws SetPropertyVetoException
	 * if emailAddress does not contain an userid and domain seperated by '@'.
	 *
	 * @param emailAddress the email address
	 * @throws IllegalArgumentException
	 */
	private void setEmailAddress(String emailAddress)
			throws IllegalArgumentException {
		if (emailAddress == null)
			throw new IllegalArgumentException(MessageUtil
					.getString("emailaddress_cannot_be_set_to_null")); //$NON-NLS-1$
		int index = emailAddress.indexOf('@');
		int length = emailAddress.length();
		if (index > 0 && index < length) {
			setUserid(emailAddress.substring(0, index));
			setDomain(emailAddress.substring(index + 1));
			return;
		}
		throw new IllegalArgumentException(
				MessageUtil
						.getString("invalid_email_address_format_should_have_been_validated")); //$NON-NLS-1$
	}

	/**
	 * The <code>Address</code> implementation of this
	 * <code>IPropertySource</code> method
	 * defines the following Setable properties
	 *
	 *	1) P_USERID, expects String
	 *	2) P_DOMAIN, expects String
	 */
	@Override
	public void setPropertyValue(Object name, Object value) {
		if (name.equals(P_ID_USERID)) {
			setUserid((String) value);
			return;
		}
		if (name.equals(P_ID_DOMAIN)) {
			setDomain((String) value);
			return;
		}
	}

	/**
	 * Sets the userid
	 */
	private void setUserid(String newUserid) {
		userid = newUserid;
	}

	/**
	 * The value as displayed in the Property Sheet.
	 * @return java.lang.String
	 */
	@Override
	public String toString() {
		StringBuilder strbuffer = new StringBuilder(getUserid());
		strbuffer.append('@');
		strbuffer.append(getDomain());
		return strbuffer.toString();
	}
}
