/*
 * Copyright (C) 2012 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.eclipse.adt.internal.refactorings.core;

import com.android.annotations.NonNull;
import com.android.annotations.Nullable;

/**
 * A result from a renaming operation
 */
public class RenameResult {
    private boolean mCanceled;
    private boolean mUnavailable;
    private @Nullable String mName;
    private boolean mClear;

    /**
     * Constructs a new rename result
     */
    private RenameResult() {
    }

    /**
     * Creates a new blank {@linkplain RenameResult}
     * @return a new result
     */
    @NonNull
    public static RenameResult create() {
        return new RenameResult();
    }

    /**
     * Creates a new {@linkplain RenameResult} for a user canceled renaming operation
     * @return a canceled operation
     */
    @NonNull
    public static RenameResult canceled() {
        return new RenameResult().setCanceled(true);
    }

    /**
     * Creates a {@linkplain RenameResult} for a renaming operation that was
     * not available (for example because the field attempted to be renamed
     * does not yet exist (or does not exist any more)
     *
     * @return a new result
     */
    @NonNull
    public static RenameResult unavailable() {
        return new RenameResult().setUnavailable(true);
    }

    /**
     * Creates a new {@linkplain RenameResult} for a successful renaming
     * operation to the given name
     *
     * @param name the new name
     * @return a new result
     */
    @NonNull
    public static RenameResult name(@Nullable String name) {
        return new RenameResult().setName(name);
    }

    /**
     * Marks this result as canceled
     *
     * @param canceled whether the result was canceled
     * @return this, for constructor chaining
     */
    @NonNull
    public RenameResult setCanceled(boolean canceled) {
        mCanceled = canceled;
        return this;
    }

    /**
     * Marks this result as unavailable
     *
     * @param unavailable whether this result was unavailable
     * @return this, for constructor chaining
     */
    @NonNull
    public RenameResult setUnavailable(boolean unavailable) {
        mUnavailable = unavailable;
        return this;
    }

    /**
     * Sets the new name of the renaming operation
     *
     * @param name the new name
     * @return this, for constructor chaining
     */
    @NonNull
    public RenameResult setName(@Nullable String name) {
        mName = name;
        return this;
    }

    /**
     * Marks this result as clearing the name (reverting it back to the default)
     *
     * @param clear whether the name was cleared
     * @return this, for constructor chaining
     */
    @NonNull
    public RenameResult setCleared(boolean clear) {
        mClear = clear;
        return this;
    }

    /**
     * Returns whether this result represents a canceled renaming operation
     *
     * @return true if the operation was canceled
     */
    public boolean isCanceled() {
        return mCanceled;
    }

    /**
     * Returns whether this result represents an unavailable renaming operation
     *
     * @return true if the operation was not available
     */
    public boolean isUnavailable() {
        return mUnavailable;
    }

    /**
     * Returns whether this result represents a renaming back to the default (possibly
     * clear) name. In this case, {@link #getName()} will return {@code null}.
     *
     * @return true if the name should be reset
     */
    public boolean isCleared() {
        return mClear;
    }

    /**
     * Returns the new name.
     *
     * @return the new name
     */
    @Nullable
    public String getName() {
        return mName;
    }
}