/**
 * Copyright 2010 JBoss Inc
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.guvnor.tools.properties;

import java.net.MalformedURLException;
import java.net.URL;
import java.text.MessageFormat;
import java.util.Map;

import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.swt.widgets.TabItem;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.views.properties.IPropertyDescriptor;
import org.eclipse.ui.views.properties.IPropertySource;
import org.eclipse.ui.views.properties.TextPropertyDescriptor;
import org.guvnor.tools.Activator;
import org.guvnor.tools.Messages;
import org.guvnor.tools.utils.PlatformUtils;
import org.guvnor.tools.views.model.TreeObject;
/**
 * Shows properties for a Guvnor repository element.
 * @author jgraham
 */
public class RepositoryElementPropsDialog extends TitleAreaDialog {
	
	private static final int INITIAL_WIDTH = 780;
	private static final int INITIAL_HEIGHT = 400;
	
	private TreeObject node;
	private Text unField;
	private Text pwField;
	
	public RepositoryElementPropsDialog(Shell parentShell, TreeObject node) {
		super(parentShell);
		super.setShellStyle(getShellStyle() | SWT.RESIZE);
		this.node = node;
	}
	
	@Override
	protected Control createDialogArea(Composite parent) {
		super.setTitle(Messages.getString("guvnor.repository.element")); //$NON-NLS-1$
		super.setMessage(MessageFormat.format(Messages.getString("guvnor.resource.properties"), //$NON-NLS-1$ 
				                              new Object[] { node.getName() })); 
		super.setTitleImage(Activator.getImageDescriptor(Activator.IMG_GUVREPWIZBAN).createImage());
		
		TabFolder folder = new TabFolder(parent, SWT.TOP);
		folder.setLayoutData(new GridData(GridData.FILL_BOTH));
		TabItem tab = new TabItem(folder, SWT.NONE);
		tab.setText(Messages.getString("properties.basic")); //$NON-NLS-1$
		Composite composite = PlatformUtils.createComposite(folder, 2);
		tab.setControl(composite);
		addElementProperties(composite);
		
		tab = new TabItem(folder, SWT.NONE);
		tab.setText(Messages.getString("properties.security")); //$NON-NLS-1$
		composite = PlatformUtils.createComposite(folder, 2);
		tab.setControl(composite);
		addSecurityProperties(composite);
		
		return super.createDialogArea(parent);
	}
	
	private void addElementProperties(Composite composite) {
		IPropertySource ps = (IPropertySource)node.getAdapter(IPropertySource.class);
		if (ps == null) {
			return;
		}
		IPropertyDescriptor[] desc = ps.getPropertyDescriptors();
		for (int i = 0; i < desc.length; i++) {
			if (desc[i] instanceof TextPropertyDescriptor) {
				TextPropertyDescriptor oneDesc = (TextPropertyDescriptor)desc[i];
				new Label(composite, SWT.NONE).
						setText(MessageFormat.format(Messages.getString("guvnor.resource.property"), //$NON-NLS-1$
								new Object[] { oneDesc.getDisplayName() })); 
				String val = ps.getPropertyValue(oneDesc.getId()) != null?
								(String)ps.getPropertyValue(oneDesc.getId()):""; //$NON-NLS-1$
				new Label(composite, SWT.NONE).setText(val);
			}
		}
	}
	
	private void addSecurityProperties(Composite composite) {
		new Label(composite, SWT.NONE).setText(Messages.getString("user.name")); //$NON-NLS-1$
		unField = new Text(composite, SWT.SINGLE | SWT.BORDER | SWT.READ_ONLY);
		unField.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
		unField.setEditable(false);
		unField.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
		
		new Label(composite, SWT.NONE).setText(Messages.getString("password")); //$NON-NLS-1$
		pwField = new Text(composite, SWT.SINGLE | SWT.BORDER | SWT.PASSWORD  | SWT.READ_ONLY);
		pwField.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
		pwField.setEditable(false);
		pwField.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));

		populateSecuritySettings();
	}
	
	@SuppressWarnings("unchecked")
	private void populateSecuritySettings() {
		try {
			Map info = Platform.getAuthorizationInfo(
					new URL(node.getGuvnorRepository().getLocation()), "", "basic"); //$NON-NLS-1$ //$NON-NLS-2$
			if (info == null) {
				return;
			}
			String un = (String)info.get("username"); //$NON-NLS-1$
			if (un != null) {
				unField.setText(un);
			}
			String pw = (String)info.get("password"); //$NON-NLS-1$
			if (pw != null) {
				pwField.setText(pw);
			}
		} catch (MalformedURLException e) {
			Activator.getDefault().writeLog(IStatus.ERROR, e.getMessage(), e);
		}
	}
	
	@Override
	protected Point getInitialSize() {
		// Try to set a reasonable default size.
		return new Point(INITIAL_WIDTH, INITIAL_HEIGHT);
	}

	@Override
	protected void configureShell(Shell newShell) {
		super.configureShell(newShell);
		newShell.setText(Messages
				.getString("guvnor.resource.properties.title")); //$NON-NLS-1$
	}

}
