var PlainLink = require("./PlainLink");


module.exports = BoxArrowLink;

function BoxArrowLink(domain, range, property) {
	PlainLink.apply(this, arguments);
}

BoxArrowLink.prototype = Object.create(PlainLink.prototype);
BoxArrowLink.prototype.constructor = BoxArrowLink;


BoxArrowLink.prototype.draw = function (linkGroup, markerContainer) {
	var property = this.label().property();
	var inverse = this.label().inverse();

	createPropertyMarker(markerContainer, property);
	if (inverse) {
		createInverseMarker(markerContainer, inverse);
	}

	PlainLink.prototype.draw.apply(this, arguments);

	// attach the markers to the link
	linkGroup.attr("marker-start", "url(#" + property.markerId() + ")");
	if (inverse) {
		linkGroup.attr("marker-end", "url(#" + inverse.markerId() + ")");
	}
};


function createPropertyMarker(markerContainer, inverse) {
	var inverseMarker = appendBasicMarker(markerContainer, inverse);
	inverseMarker.attr("refX", -8);
	inverseMarker.append("path")
		.attr("d", "M0,-8L8,0L0,8L-8,0L0,-8L8,0")
		.classed(inverse.markerType(), true);

	inverse.markerElement(inverseMarker);
}

function createInverseMarker(markerContainer, property) {
	var marker = appendBasicMarker(markerContainer, property);
	marker.attr("refX", 8);
	marker.append("path")
		.attr("d", "M0,-8L8,0L0,8L-8,0L0,-8L8,0")
		.classed(property.markerType(), true);

	property.markerElement(marker);
}

function appendBasicMarker(markerContainer, property) {
	return markerContainer.append("marker")
		.datum(property)
		.attr("id", property.markerId())
		.attr("viewBox", "-10 -10 20 20")
		.attr("markerWidth", 20)
		.attr("markerHeight", 20)
		.attr("markerUnits", "userSpaceOnUse")
		.attr("orient", "auto");
}
