/**
 * @author rfm1201
 */

function LatheGeometryPanel(editor, object) {

    var signals = editor.signals;

    var container = new UI.Row();

    var geometry = object.geometry;
    var parameters = geometry.parameters;

    // segments

    var segmentsRow = new UI.Row();
    var segments = new UI.Integer(parameters.segments).onChange(update);

    segmentsRow.add(new UI.Text('段数').setWidth('90px'));
    segmentsRow.add(segments);

    container.add(segmentsRow);

    // phiStart

    var phiStartRow = new UI.Row();
    var phiStart = new UI.Number(parameters.phiStart * 180 / Math.PI).onChange(update);

    phiStartRow.add(new UI.Text('φ开始 (°)').setWidth('90px'));
    phiStartRow.add(phiStart);

    container.add(phiStartRow);

    // phiLength

    var phiLengthRow = new UI.Row();
    var phiLength = new UI.Number(parameters.phiLength * 180 / Math.PI).onChange(update);

    phiLengthRow.add(new UI.Text('φ长度(°)').setWidth('90px'));
    phiLengthRow.add(phiLength);

    container.add(phiLengthRow);

    // points

    var lastPointIdx = 0;
    var pointsUI = [];

    var pointsRow = new UI.Row();
    pointsRow.add(new UI.Text('点').setWidth('90px'));

    var points = new UI.Span().setDisplay('inline-block');
    pointsRow.add(points);

    var pointsList = new UI.Div();
    points.add(pointsList);

    for (var i = 0; i < parameters.points.length; i++) {

        var point = parameters.points[i];
        pointsList.add(createPointRow(point.x, point.y));

    }

    var addPointButton = new UI.Button('+').onClick(function () {

        if (pointsUI.length === 0) {

            pointsList.add(createPointRow(0, 0));

        } else {

            var point = pointsUI[pointsUI.length - 1];

            pointsList.add(createPointRow(point.x.getValue(), point.y.getValue()));

        }

        update();

    });
    points.add(addPointButton);

    container.add(pointsRow);

    //

    function createPointRow(x, y) {

        var pointRow = new UI.Div();
        var lbl = new UI.Text(lastPointIdx + 1).setWidth('20px');
        var txtX = new UI.Number(x).setRange(0, Infinity).setWidth('40px').onChange(update);
        var txtY = new UI.Number(y).setWidth('40px').onChange(update);
        var idx = lastPointIdx;
        var btn = new UI.Button('-').onClick(function () {

            deletePointRow(idx);

        });

        pointsUI.push({ row: pointRow, lbl: lbl, x: txtX, y: txtY });
        lastPointIdx++;
        pointRow.add(lbl, txtX, txtY, btn);

        return pointRow;

    }

    function deletePointRow(idx) {

        if (!pointsUI[idx]) return;

        pointsList.remove(pointsUI[idx].row);
        pointsUI[idx] = null;

        update();

    }

    function update() {

        var points = [];
        var count = 0;

        for (var i = 0; i < pointsUI.length; i++) {

            var pointUI = pointsUI[i];

            if (!pointUI) continue;

            points.push(new THREE.Vector2(pointUI.x.getValue(), pointUI.y.getValue()));
            count++;
            pointUI.lbl.setValue(count);

        }

        editor.execute(new SetGeometryCommand(object, new THREE[geometry.type](
            points,
            segments.getValue(),
            phiStart.getValue() / 180 * Math.PI,
            phiLength.getValue() / 180 * Math.PI
        )));

    }

    return container;

};

export default LatheGeometryPanel;
