/*******************************************************************************
 * Copyright (c) 2019 Dirk Fauth.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Dirk Fauth <dirk.fauth@googlemail.com> - initial API and implementation
 ******************************************************************************/
package org.eclipse.nebula.widgets.nattable.group.performance.command;

import java.util.List;

import org.eclipse.nebula.widgets.nattable.group.performance.GroupModel.Group;
import org.eclipse.nebula.widgets.nattable.layer.ILayer;
import org.eclipse.nebula.widgets.nattable.layer.IUniqueIndexLayer;
import org.eclipse.nebula.widgets.nattable.reorder.command.MultiRowReorderCommand;

/**
 * Specialization of the {@link MultiRowReorderCommand} that ensures on
 * conversion that the toPosition is between two groups.
 *
 * @since 1.6
 */
public class GroupMultiRowReorderCommand extends MultiRowReorderCommand {

    private Group groupToTop;
    private Group groupToBottom;

    /**
     *
     * @param layer
     *            The layer to which the row positions match.
     * @param fromRowPositions
     *            The row positions to reorder.
     * @param toRowPosition
     *            The target row position to reorder to.
     * @since 2.0
     */
    public GroupMultiRowReorderCommand(ILayer layer, List<Integer> fromRowPositions, int toRowPosition) {
        this(layer,
                fromRowPositions,
                toRowPosition < layer.getRowCount() ? toRowPosition : toRowPosition - 1,
                toRowPosition < layer.getRowCount());
    }

    /**
     *
     * @param layer
     *            The layer to which the row positions match.
     * @param fromRowPositions
     *            The row positions to reorder.
     * @param toRowPosition
     *            The target row position to reorder to.
     * @param reorderToTopEdge
     *            <code>true</code> if the reorder operation should be done on
     *            the top edge of the toRowPosition, <code>false</code> if it
     *            should be reordered to the bottom edge.
     * @since 2.0
     */
    public GroupMultiRowReorderCommand(
            ILayer layer,
            List<Integer> fromRowPositions,
            int toRowPosition,
            boolean reorderToTopEdge) {

        super(layer, fromRowPositions, toRowPosition, reorderToTopEdge);
    }

    /**
     * Clone constructor.
     *
     * @param command
     *            The command to clone.
     */
    protected GroupMultiRowReorderCommand(GroupMultiRowReorderCommand command) {
        super(command);
        this.groupToTop = command.groupToTop;
        this.groupToBottom = command.groupToBottom;
    }

    @Override
    public boolean convertToTargetLayer(ILayer targetLayer) {
        if (super.convertToTargetLayer(targetLayer)) {
            // check if we need to update the toPosition which could be
            // necessary in case rows at the group beginning are hidden
            if (this.groupToBottom != null) {
                if (isReorderToTopEdge() && targetLayer instanceof IUniqueIndexLayer) {
                    int groupStartPosition = ((IUniqueIndexLayer) targetLayer).getRowPositionByIndex(this.groupToBottom.getStartIndex());
                    if (groupStartPosition >= 0 && groupStartPosition < getToRowPosition()) {
                        this.toRowPositionCoordinate.rowPosition = groupStartPosition;
                    }
                }
            } else if (this.groupToTop != null) {
                // check if there are positions for the group members that would
                // be more to the right. this could happen e.g. if rows at
                // the group end are hidden
                if (!isReorderToTopEdge() && targetLayer instanceof IUniqueIndexLayer) {
                    int groupEndPosition = this.groupToTop.getGroupEndPosition((IUniqueIndexLayer) targetLayer);
                    if (groupEndPosition >= 0 && groupEndPosition > getToRowPosition()) {
                        this.toRowPositionCoordinate.rowPosition = groupEndPosition;
                    }
                }
            }
            return true;
        }
        return false;
    }

    /**
     *
     * @param groupToTop
     *            The {@link Group} that is on top of the toRowPosition. Needed
     *            to calculate the correct position to the bottom edge of a
     *            group in case of hidden rows.
     * @since 2.0
     */
    public void setGroupToTop(Group groupToTop) {
        this.groupToTop = groupToTop;
    }

    /**
     *
     * @param groupToBottom
     *            The {@link Group} that is at the toRowPosition. Needed to
     *            calculate the correct position to the top edge of a group in
     *            case of hidden rows.
     * @since 2.0
     */
    public void setGroupToBottom(Group groupToBottom) {
        this.groupToBottom = groupToBottom;
    }

    @Override
    public GroupMultiRowReorderCommand cloneCommand() {
        return new GroupMultiRowReorderCommand(this);
    }

}
