/*
 * 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.wizards.templates;

import com.android.annotations.NonNull;
import com.android.ide.eclipse.adt.AdtPlugin;
import com.android.ide.eclipse.adt.AdtUtils;
import com.google.common.io.Closeables;
import com.google.common.io.Files;
import com.google.common.io.InputSupplier;

import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.ltk.core.refactoring.Change;
import org.eclipse.ltk.core.refactoring.RefactoringStatus;
import org.eclipse.ltk.core.refactoring.resource.ResourceChange;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.net.URI;

/** Change which lazily copies a file */
public class CreateFileChange extends ResourceChange {
    private String mName;
    private final IPath mPath;
    private final File mSource;

    CreateFileChange(@NonNull String name, @NonNull IPath workspacePath, File source) {
        mName = name;
        mPath = workspacePath;
        mSource = source;
    }

    @Override
    protected IResource getModifiedResource() {
      return ResourcesPlugin.getWorkspace().getRoot().getFile(mPath);
    }

    @Override
    public String getName() {
        return mName;
    }

    @Override
    public RefactoringStatus isValid(IProgressMonitor pm)
            throws CoreException, OperationCanceledException {
        RefactoringStatus result = new RefactoringStatus();
        IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(mPath);
        URI location = file.getLocationURI();
        if (location == null) {
            result.addFatalError("Unknown location " + file.getFullPath().toString());
            return result;
        }
        return result;
    }

    @SuppressWarnings("resource") // Eclipse doesn't know about Guava's Closeables.closeQuietly
    @Override
    public Change perform(IProgressMonitor pm) throws CoreException {
        InputSupplier<FileInputStream> supplier = Files.newInputStreamSupplier(mSource);
        InputStream is = null;
        try {
            pm.beginTask("Creating file", 3);
            IFile file = (IFile) getModifiedResource();

            IContainer parent = file.getParent();
            if (parent != null && !parent.exists()) {
                IFolder folder = ResourcesPlugin.getWorkspace().getRoot().getFolder(
                        parent.getFullPath());
                AdtUtils.ensureExists(folder);
            }

            is = supplier.getInput();
            file.create(is, false, new SubProgressMonitor(pm, 1));
            pm.worked(1);
        } catch (Exception ioe) {
            AdtPlugin.log(ioe, null);
        } finally {
            Closeables.closeQuietly(is);
            pm.done();
        }
        return null;
    }
}
