/*******************************************************************************
 * Copyright (c) 2000, 2016 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.compare.internal;

import java.io.IOException;
import java.io.InputStream;
import java.util.ResourceBundle;

import org.eclipse.compare.CompareConfiguration;
import org.eclipse.compare.CompareEditorInput;
import org.eclipse.compare.CompareUI;
import org.eclipse.compare.IStreamContentAccessor;
import org.eclipse.compare.ITypedElement;
import org.eclipse.compare.structuremergeviewer.ICompareInput;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.PlatformUI;

import com.ibm.icu.text.MessageFormat;

/**
 * A simple compare viewer for binary files.
 * Shows the position of the first non-matching byte.
 */
public class BinaryCompareViewer extends AbstractViewer {

	private static final String BUNDLE_NAME = "org.eclipse.compare.internal.BinaryCompareViewerResources"; //$NON-NLS-1$

	private static final int EOF = -1;
	private ICompareInput fInput;
	private ResourceBundle fBundle;

	private Composite fComposite;
	private Label fMessage;
	private CompareConfiguration compareConfiguration;

	public BinaryCompareViewer(Composite parent, final CompareConfiguration cc) {

		if(PlatformUI.isWorkbenchRunning()) {
			PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, ICompareContextIds.BINARY_COMPARE_VIEW);
		}

		fBundle= ResourceBundle.getBundle(BUNDLE_NAME);

		fComposite= new Composite(parent, SWT.NONE);
		RowLayout rowLayout = new RowLayout();
		rowLayout.type = SWT.VERTICAL;
		fComposite.setLayout(rowLayout);

		fMessage= new Label(fComposite, SWT.WRAP);
		fComposite.setData(CompareUI.COMPARE_VIEWER_TITLE, Utilities.getString(fBundle, "title")); //$NON-NLS-1$

		compareConfiguration = cc != null ? cc : new CompareConfiguration();

		if (compareConfiguration.getContainer() instanceof CompareEditorInput) {
			Label compareAsTextLabel = new Label(fComposite, SWT.WRAP);
			compareAsTextLabel.setText(Utilities.getString(fBundle, "compareAsText")); //$NON-NLS-1$
		}
	}

	@Override
	public Control getControl() {
		return fComposite;
	}

	@Override
	public void setInput(Object input) {
		if (fComposite != null && input instanceof ICompareInput) {
			fInput= (ICompareInput) input;

			InputStream left= null;
			InputStream right= null;

			String message= null;
			try {
				left= getStream(fInput.getLeft());
				right= getStream(fInput.getRight());

				if (left != null && right != null) {
					int pos= 0;
					while (true) {
						int l= left.read();
						int r= right.read();
						if (l != r) {
							String format= Utilities.getString(fBundle, "diffMessageFormat"); //$NON-NLS-1$
							message= MessageFormat.format(format, Integer.toString(pos) );
							break;
						}
						if (l == EOF)
							break;
						pos++;
					}
				} else if (left == null && right == null) {
					message= Utilities.getString(fBundle, "deleteConflictMessage"); //$NON-NLS-1$
				} else if (left == null) {
					message= Utilities.getString(fBundle, compareConfiguration.isMirrored() ?
							"addedMessage" : "deletedMessage"); //$NON-NLS-1$ //$NON-NLS-2$
				} else if (right == null) {
					message= Utilities.getString(fBundle, compareConfiguration.isMirrored() ?
							"deletedMessage" : "addedMessage"); //$NON-NLS-1$ //$NON-NLS-2$
				}
			} catch (CoreException | IOException ex) {
				message = Utilities.getString(fBundle, "errorMessage"); //$NON-NLS-1$
				CompareUIPlugin.log(ex);
			} finally {
				Utilities.close(left);
				Utilities.close(right);
			}
			if (message != null)
				fMessage.setText(message);
			fComposite.layout();
		}
	}

	@Override
	public Object getInput() {
		return fInput;
	}

	private InputStream getStream(ITypedElement input) throws CoreException {
		if (input instanceof IStreamContentAccessor)
			return ((IStreamContentAccessor)input).getContents();
		return null;
	}
}
