/*******************************************************************************
 * Copyright (c) 2014, 2015, 2017 Profactor GbmH, fortiss GmbH
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *   Gerhard Ebenhofer, Alois Zoitl
 *     - initial API and implementation and/or initial documentation
 *******************************************************************************/
package org.eclipse.fordiac.ide.gef.figures;

import org.eclipse.draw2d.FigureUtilities;
import org.eclipse.draw2d.Graphics;
import org.eclipse.draw2d.PolylineConnection;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.geometry.PointList;
import org.eclipse.draw2d.geometry.Rectangle;

public class HideableConnection extends PolylineConnection {

	public static final int BEND_POINT_BEVEL_SIZE = 5;

	private boolean hidden = false;
	private String label = ""; //$NON-NLS-1$
	private Rectangle moveRect = new Rectangle();
	private org.eclipse.fordiac.ide.model.libraryElement.Connection model;

	public void setModel(org.eclipse.fordiac.ide.model.libraryElement.Connection newModel) {
		model = newModel;
	}

	public org.eclipse.fordiac.ide.model.libraryElement.Connection getModel() {
		return model;
	}

	public String getLabel() {
		return label;
	}

	public void setLabel(String label) {
		this.label = label;
	}

	public boolean isHidden() {
		return hidden;
	}

	public void setHidden(boolean hidden) {
		this.hidden = hidden;
	}

	@Override
	protected void outlineShape(Graphics g) {
		if (isHidden()) {

			int[] startLine = new int[] { getStart().x, getStart().y, getStart().x + 20, getStart().y };
			int[] endLine = new int[] { getEnd().x, getEnd().y, getEnd().x - 20, getEnd().y };
			g.drawPolyline(startLine);
			g.drawPolyline(endLine);

			Dimension dim = FigureUtilities.getTextExtents(label, g.getFont());
			g.drawText(label, new Point(getEnd().x - dim.width - 25, getEnd().y - dim.height / 2));
			moveRect.x = getEnd().x - dim.width - 25;
			moveRect.y = getEnd().y - dim.height / 2;
			moveRect.width = 5;
			moveRect.height = 5;
		} else {
			drawBeveledPolyline(g);
		}
	}

	private void drawBeveledPolyline(Graphics g) {
		PointList beveledPoints = new PointList();

		beveledPoints.addPoint(getPoints().getFirstPoint());

		for (int i = 1; i < getPoints().size() - 1; i++) {
			Point bevore = getPoints().getPoint(i - 1);
			Point after = getPoints().getPoint(i + 1);

			int verDistance = Math.abs(bevore.y - after.y);
			int horDistance = Math.abs(bevore.y - after.y);
			int bevelSize = BEND_POINT_BEVEL_SIZE;
			if (verDistance < 2 * BEND_POINT_BEVEL_SIZE) {
				bevelSize = verDistance / 2;
			}
			if (horDistance < 2 * BEND_POINT_BEVEL_SIZE) {
				bevelSize = horDistance / 2;
			}

			beveledPoints.addPoint(calcualtedBeveledPoint(getPoints().getPoint(i), bevore, bevelSize));
			beveledPoints.addPoint(calcualtedBeveledPoint(getPoints().getPoint(i), after, bevelSize));
		}

		beveledPoints.addPoint(getPoints().getLastPoint());

		g.drawPolyline(beveledPoints);
	}

	private static Point calcualtedBeveledPoint(Point refPoint, Point otherPoint, int bevelSize) {
		if (0 == (refPoint.x - otherPoint.x)) {
			return new Point(refPoint.x, refPoint.y + (((refPoint.y - otherPoint.y) > 0) ? -bevelSize : bevelSize));
		}
		return new Point(refPoint.x + (((refPoint.x - otherPoint.x) > 0) ? -bevelSize : bevelSize), refPoint.y);
	}

}
