import AutoPlace from 'diagram-js/lib/features/auto-place/AutoPlace';

export default function CustomAutoPlace(eventBus, modeling) {
    AutoPlace.call(this, eventBus, modeling, 3000);

    eventBus.on('autoPlace', 3000, function (context) {
        const shape = context.shape;
        const source = context.source;

        return getNewCustomShapePosition(source, shape);
    });

    this.append = function (source, shape, hints) {
        eventBus.fire('autoPlace.start', {
            source: source,
            shape: shape
        });

        // allow others to provide the position
        var position = eventBus.fire('autoPlace', {
            source: source,
            shape: shape
        });

        console.log('hints', hints, 'position', position);

        var newShape = modeling.appendShape(source, shape, position, source.parent, hints);

        eventBus.fire('autoPlace.end', {
            source: source,
            shape: newShape
        });

        return newShape;
    };
}

export function asTRBL(bounds) {
    return {
        top: bounds.y,
        right: bounds.x + (bounds.width || 0),
        bottom: bounds.y + (bounds.height || 0),
        left: bounds.x
    };
}

export function roundPoint(point) {
    return {
        x: Math.round(point.x),
        y: Math.round(point.y)
    };
}

export function getMid(bounds) {
    return roundPoint({
        x: bounds.x + (bounds.width || 0) / 2,
        y: bounds.y + (bounds.height || 0) / 2
    });
}

export function getNewCustomShapePosition(source, element, hints) {
    if (!hints) {
        hints = {};
    }

    var distance = hints.defaultDistance || 50;

    var sourceMid = getMid(source);
    var sourceTrbl = asTRBL(source);

    // simply put element right next to source
    return {
        x: sourceMid.x,
        y: sourceTrbl.bottom + distance + element.height / 2
    };
}

const F = function () {
}; // 核心，利用空对象作为中介；
F.prototype = AutoPlace.prototype; // 核心，将父类的原型赋值给空对象F；
CustomAutoPlace.prototype = new F(); // 核心，将 F的实例赋值给子类；
CustomAutoPlace.prototype.constructor = AutoPlace; // 修复子类CustomRenderer的构造器指向，防止原型链的混乱；
