/*
 * Copyright (C) 2011 The Android Open Source Project
 *
 * Licensed under the Eclipse Public License, Version 1.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.eclipse.org/org/documents/epl-v10.php
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.android.ide.common.layout.relative;

import static com.android.SdkConstants.ATTR_ID;
import static com.android.SdkConstants.VALUE_TRUE;


import com.android.SdkConstants;
import static com.android.SdkConstants.ANDROID_URI;
import com.android.ide.common.api.Segment;

/** A match is a potential pairing of two segments with a given {@link ConstraintType}. */
class Match {
    /** the edge of the dragged node that is matched */
    public final Segment with;

    /** the "other" edge that the dragged edge is matched with */
    public final Segment edge;

    /** the signed distance between the matched edges */
    public final int delta;

    /** the type of constraint this is a match for */
    public final ConstraintType type;

    /** whether this {@link Match} results in a cycle */
    public boolean cycle;

    /** The associated {@link GuidelineHander} which performed the match */
    private final GuidelineHandler mHandler;

    /**
     * Create a new match.
     *
     * @param handler the handler which performed the match
     * @param edge the "other" edge that the dragged edge is matched with
     * @param with the edge of the dragged node that is matched
     * @param type the type of constraint this is a match for
     * @param delta the signed distance between the matched edges
     */
    public Match(GuidelineHandler handler, Segment edge, Segment with,
            ConstraintType type, int delta) {
        mHandler = handler;

        this.edge = edge;
        this.with = with;
        this.type = type;
        this.delta = delta;
    }

    /**
     * Returns the XML constraint attribute value for this match
     *
     * @param generateId whether an id should be generated if one is missing
     * @return the XML constraint attribute value for this match
     */
    public String getConstraint(boolean generateId) {
        if (type.targetParent) {
            return type.name + '=' + VALUE_TRUE;
        } else {
            String id = edge.id;
            if (id == null || id.length() == -1) {
                if (!generateId) {
                    // Placeholder to display for the user during dragging
                    id = "<generated>";
                } else {
                    // Must generate an id on the fly!
                    // See if it's been set by a different constraint we've already applied
                    // to this same node
                    id = edge.node.getStringAttr(ANDROID_URI, ATTR_ID);
                    if (id == null || id.length() == 0) {
                        id = mHandler.getRulesEngine().getUniqueId(edge.node.getFqcn());
                        edge.node.setAttribute(ANDROID_URI, ATTR_ID, id);
                    }
                }
            }
            return type.name + '=' + id;
        }
    }

    @Override
    public String toString() {
        return "Match [type=" + type + ", delta=" + delta + ", edge=" + edge
                + "]";
    }
}
