/*
 * Copyright (C) 2010 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.mock;

import static org.easymock.EasyMock.capture;
import static org.easymock.EasyMock.createMock;
import static org.easymock.EasyMock.createNiceMock;
import static org.easymock.EasyMock.eq;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.expectLastCall;
import static org.easymock.EasyMock.isA;
import static org.easymock.EasyMock.replay;

import com.android.io.IAbstractFolder;
import com.android.io.IAbstractResource;

import org.easymock.Capture;
import org.easymock.EasyMock;
import org.easymock.IAnswer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;

import java.util.Map;

public class Mocks {
    public static IJavaProject createProject(IClasspathEntry[] entries, IPath outputLocation)
            throws Exception {
        IJavaProject javaProject = createMock(IJavaProject.class);
        final Capture<IClasspathEntry[]> capturedEntries = new Capture<IClasspathEntry[]>();
        Capture<IPath> capturedOutput = new Capture<IPath>();
        capturedEntries.setValue(entries);
        capturedOutput.setValue(outputLocation);

        IProject project = createProject();
        expect(javaProject.getProject()).andReturn(project).anyTimes();
        expect(javaProject.getOutputLocation()).andReturn(capturedOutput.getValue()).anyTimes();

        expect(javaProject.getRawClasspath()).andAnswer(new IAnswer<IClasspathEntry[]>() {
            @Override
            public IClasspathEntry[] answer() throws Throwable {
                return capturedEntries.getValue();
            }
        }).anyTimes();

        javaProject.setRawClasspath(capture(capturedEntries), isA(IProgressMonitor.class));
        expectLastCall().anyTimes();

        javaProject.setRawClasspath(capture(capturedEntries), capture(capturedOutput),
                isA(IProgressMonitor.class));
        expectLastCall().anyTimes();

        final Capture<String> capturedCompliance = new Capture<String>();
        capturedCompliance.setValue("1.4");
        final Capture<String> capturedSource = new Capture<String>();
        capturedSource.setValue("1.4");
        final Capture<String> capturedTarget = new Capture<String>();
        capturedTarget.setValue("1.4");

        expect(javaProject.getOption(JavaCore.COMPILER_COMPLIANCE, true)).andAnswer(
                new IAnswer<String>() {
                    @Override
                    public String answer() throws Throwable {
                        return capturedCompliance.getValue();
                    }
                });
        expect(javaProject.getOption(JavaCore.COMPILER_SOURCE, true)).andAnswer(
                new IAnswer<String>() {
                    @Override
                    public String answer() throws Throwable {
                        return capturedSource.getValue();
                    }
                });
        expect(javaProject.getOption(JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM, true)).andAnswer(
                new IAnswer<String>() {
                    @Override
                    public String answer() throws Throwable {
                        return capturedTarget.getValue();
                    }
                });

        javaProject.setOption(eq(JavaCore.COMPILER_COMPLIANCE), capture(capturedCompliance));
        expectLastCall().anyTimes();
        javaProject.setOption(eq(JavaCore.COMPILER_SOURCE), capture(capturedSource));
        expectLastCall().anyTimes();
        javaProject.setOption(eq(JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM),
                capture(capturedTarget));
        expectLastCall().anyTimes();

        replay(javaProject);

        return javaProject;
    }

    /**
     * Creates a mock implementation of {@link IFile}.
     * <p/>
     * Supported methods:
     * <ul>
     * <li>IFile#getName()</li>
     * <li>IFile#getLocation()</li>
     * </ul>
     */
    public static IFile createFile(String fileName) {
        IFile file = createNiceMock(IFile.class);
        expect(file.getName()).andReturn(fileName).anyTimes();
        expect(file.getLocation()).andReturn(new Path(fileName)).anyTimes();
        replay(file);
        return file;
    }

    /**
     * Creates a mock implementation of {@link IFolder}.
     * <p/>
     * Supported methods:
     * <ul>
     * <li>{@link IFolder#getName()}</li>
     * <li>{@link IFolder#members()}</li>
     * </ul>
     */
    public static IFolder createFolder(String name, IResource[] members) throws Exception {
        IFolder file = createNiceMock(IFolder.class);
        expect(file.getName()).andReturn(name).anyTimes();
        // expect(file.getLocation()).andReturn(new Path(name)).anyTimes();
        expect(file.members()).andReturn(members).anyTimes();
        replay(file);
        return file;
    }

    public static IAbstractFolder createAbstractFolder(String name, IAbstractResource[] members) {
        IAbstractFolder folder = createNiceMock(IAbstractFolder.class);
        expect(folder.getName()).andReturn(name).anyTimes();
        // expect(file.getLocation()).andReturn(new Path(name)).anyTimes();
        expect(folder.listMembers()).andReturn(members).anyTimes();
        replay(folder);

        return folder;
    }

    /**
     * Mock implementation of {@link IProject}.
     * <p/>
     * Supported methods:
     * <ul>
     * <li>{@link IProject#build(int kind, IProgressMonitor monitor)}</li>
     * <li>
     * {@link IProject#build(int kind, String builderName, Map args, IProgressMonitor monitor)}
     * </li>
     * </ul>
     */
    public static IProject createProject() {
        IProject project = EasyMock.createNiceMock(IProject.class);
        replay(project);
        return project;
    }

    /**
     * Creates a mock implementation of an {@link IClasspathEntry}, which supports
     * {@link IClasspathEntry#getEntryKind} and {@link IClasspathEntry#getPath}.
     */
    public static IClasspathEntry createClasspathEntry(IPath path, int kind) {
        IClasspathEntry entry = createNiceMock(IClasspathEntry.class);
        expect(entry.getEntryKind()).andReturn(kind).anyTimes();
        expect(entry.getPath()).andReturn(path).anyTimes();
        replay(entry);
        return entry;
    }
}
