/*
 * 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 static com.android.SdkConstants.PREFIX_RESOURCE_REF;

import com.android.annotations.NonNull;
import com.android.annotations.Nullable;
import com.android.ide.eclipse.adt.AdtConstants;
import com.android.ide.eclipse.adt.internal.resources.ResourceNameValidator;
import com.android.resources.ResourceType;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.ltk.core.refactoring.Change;
import org.eclipse.ltk.core.refactoring.RefactoringStatus;
import org.eclipse.ltk.core.refactoring.participants.CheckConditionsContext;
import org.eclipse.ltk.core.refactoring.participants.ParticipantManager;
import org.eclipse.ltk.core.refactoring.participants.RefactoringParticipant;
import org.eclipse.ltk.core.refactoring.participants.RenameArguments;
import org.eclipse.ltk.core.refactoring.participants.RenameProcessor;
import org.eclipse.ltk.core.refactoring.participants.SharableParticipants;

/**
 * A rename processor for Android resources.
 */
public class RenameResourceProcessor extends RenameProcessor {
    private IProject mProject;
    private ResourceType mType;
    private String mCurrentName;
    private String mNewName;
    private boolean mUpdateReferences = true;
    private ResourceNameValidator mValidator;
    private RenameArguments mRenameArguments;

    /**
     * Creates a new rename resource processor.
     *
     * @param project the project containing the renamed resource
     * @param type the type of the resource
     * @param currentName the current name of the resource
     * @param newName the new name of the resource, or null if not known
     */
    public RenameResourceProcessor(
            @NonNull IProject project,
            @NonNull ResourceType type,
            @NonNull String currentName,
            @Nullable String newName) {
        mProject = project;
        mType = type;
        mCurrentName = currentName;
        mNewName = newName != null ? newName : currentName;
        mUpdateReferences= true;
        mValidator = ResourceNameValidator.create(false, mProject, mType);
    }

    /**
     * Returns the project containing the renamed resource
     *
     * @return the project containing the renamed resource
     */
    @NonNull
    public IProject getProject() {
        return mProject;
    }

    /**
     * Returns the new resource name
     *
     * @return the new resource name
     */
    @NonNull
    public String getNewName() {
        return mNewName;
    }

    /**
     * Returns the current name of the resource
     *
     * @return the current name of the resource
     */
    public String getCurrentName() {
        return mCurrentName;
    }

    /**
     * Returns the type of the resource
     *
     * @return the type of the resource
     */
    @NonNull
    public ResourceType getType() {
        return mType;
    }

    /**
     * Sets the new name
     *
     * @param newName the new name
     */
    public void setNewName(@NonNull String newName) {
        mNewName = newName;
    }

    /**
     * Returns {@code true} if the refactoring processor also updates references
     *
     * @return {@code true} if the refactoring processor also updates references
     */
    public boolean isUpdateReferences() {
        return mUpdateReferences;
    }

    /**
     * Specifies if the refactoring processor also updates references. The
     * default behavior is to update references.
     *
     * @param updateReferences {@code true} if the refactoring processor should
     *            also updates references
     */
    public void setUpdateReferences(boolean updateReferences) {
        mUpdateReferences = updateReferences;
    }

    /**
     * Checks the given new potential name and returns a {@link RefactoringStatus} indicating
     * whether the potential new name is valid
     *
     * @param name the name to check
     * @return a {@link RefactoringStatus} with the validation result
     */
    public RefactoringStatus checkNewName(String name) {
        String error = mValidator.isValid(name);
        if (error != null) {
            return RefactoringStatus.createFatalErrorStatus(error);
        }

        return new RefactoringStatus();
    }

    @Override
    public RefactoringStatus checkInitialConditions(IProgressMonitor pm) throws CoreException {
        return new RefactoringStatus();
    }

    @Override
    public RefactoringStatus checkFinalConditions(IProgressMonitor pm,
            CheckConditionsContext context) throws CoreException {
        pm.beginTask("", 1);
        try {
            mRenameArguments = new RenameArguments(getNewName(), isUpdateReferences());
            return new RefactoringStatus();
        } finally {
            pm.done();
        }
    }

    @Override
    public Change createChange(IProgressMonitor pm) throws CoreException {
        pm.beginTask("", 1);
        try {
            // Added by {@link RenameResourceParticipant}
            return null;
        } finally {
            pm.done();
        }
    }

    @Override
    public Object[] getElements() {
        return new Object[0];
    }

    @Override
    public String getIdentifier() {
        return "com.android.ide.renameResourceProcessor"; //$NON-NLS-1$
    }

    @Override
    public String getProcessorName() {
        return "Rename Android Resource";
    }

    @Override
    public boolean isApplicable() {
        return true;
    }

    @Override
    public RefactoringParticipant[] loadParticipants(RefactoringStatus status,
            SharableParticipants shared) throws CoreException {
        String[] affectedNatures = new String[] { AdtConstants.NATURE_DEFAULT };
        String url = PREFIX_RESOURCE_REF + mType.getName() + '/' + mCurrentName;
        return ParticipantManager.loadRenameParticipants(status, this, url, mRenameArguments,
                null, affectedNatures, shared);
    }
}