/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
 *
 * 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 org.netbeans.modules.junit;

import org.netbeans.modules.junit.api.JUnitSettings;
import org.netbeans.modules.junit.api.JUnitTestUtil;
import java.net.URL;
import java.util.List;
import java.util.Map;
import org.netbeans.api.java.classpath.ClassPath;
import org.netbeans.api.java.queries.UnitTestForSourceQuery;
import org.netbeans.api.project.FileOwnerQuery;
import org.netbeans.api.project.Project;
import org.netbeans.modules.gsf.testrunner.plugin.CommonPlugin;
import org.netbeans.modules.gsf.testrunner.plugin.CommonPlugin.Location;
import org.netbeans.modules.junit.plugin.JUnitPlugin;
import org.netbeans.spi.java.classpath.support.ClassPathSupport;
import org.openide.filesystems.FileObject;

/**
 * Default IT plugin.
 */
public final class DefaultITPlugin extends JUnitPlugin {

    @Override
    protected Location getTestLocation(Location sourceLocation) {
        FileObject fileObj = sourceLocation.getFileObject();
        ClassPath srcCp;

        if ((srcCp = ClassPath.getClassPath(fileObj, ClassPath.SOURCE)) == null) {
            return null;
        }

        String baseResName = srcCp.getResourceName(fileObj, '/', false);
        if(baseResName == null) {
            return null;
        }
        String testResName = !fileObj.isFolder()
                             ? getTestResName(baseResName, fileObj.getExt())
                             : getSuiteResName(baseResName);
        assert testResName != null;
	Location oppositeLocation = getOppositeLocation(sourceLocation, srcCp, testResName, true);
        return oppositeLocation;
    }



    @Override
    protected Location getTestedLocation(Location testLocation) {
        FileObject fileObj = testLocation.getFileObject();
        ClassPath srcCp;

        if (fileObj.isFolder()
               || ((srcCp = ClassPath.getClassPath(fileObj, ClassPath.SOURCE)) == null)) {
            return null;
        }

        String baseResName = srcCp.getResourceName(fileObj, '/', false);
        if (baseResName == null) {
            return null;     //if the selectedFO is not within the classpath
        }
        String srcResName = getSrcResName(baseResName, fileObj.getExt());
        if (srcResName == null) {
            return null;     //if the selectedFO is not a test class (by name)
        }

        return getOppositeLocation(testLocation,
                                   srcCp,
                                   srcResName,
                                   false);
    }

    private static String getTestResName(String baseResName, String ext) {
        StringBuilder buf
                = new StringBuilder(baseResName.length() + ext.length() + 10);
	buf.append(baseResName).append("IT"); //NOI18N
        if (ext.length() != 0) {
            buf.append('.').append(ext);
        }
        return buf.toString();
    }

    /**
     */
    private static String getSuiteResName(String baseResName) {
        if (baseResName.length() == 0) {
            return JUnitSettings.getDefault().getRootSuiteClassName();
        }

        final String suiteSuffix = "Suite";                             //NOI18N

        String lastNamePart
                = baseResName.substring(baseResName.lastIndexOf('/') + 1);

        StringBuilder buf = new StringBuilder(baseResName.length()
                                              + lastNamePart.length()
                                              + suiteSuffix.length()
                                              + 6);
        buf.append(baseResName).append('/');
        buf.append(Character.toUpperCase(lastNamePart.charAt(0)))
           .append(lastNamePart.substring(1));
        buf.append(suiteSuffix);
        buf.append(".java");                                            //NOI18N

        return buf.toString();
    }

    /**
     */
    private static String getSrcResName(String testResName, String ext) {
        if (!testResName.endsWith("IT")) {  //NOI18N
            return null;
        }

        StringBuilder buf
                = new StringBuilder(testResName.length() + ext.length());
	buf.append(testResName.substring(0, testResName.length() - 2)); //NOI18N
        if (ext.length() != 0) {
            buf.append('.').append(ext);
        }
        return buf.toString();
    }

    private static Location getOppositeLocation(
	    final Location sourceLocation,
	    final ClassPath fileObjCp,
	    final String oppoResourceName,
	    final boolean sourceToTest) {
	FileObject fileObj = sourceLocation.getFileObject();
	FileObject fileObjRoot;

	if ((fileObjRoot = fileObjCp.findOwnerRoot(fileObj)) == null) {
	    return null;
	}

	URL[] oppoRootsURLs = sourceToTest
		? UnitTestForSourceQuery.findUnitTests(fileObjRoot)
		: UnitTestForSourceQuery.findSources(fileObjRoot);
	//if (sourceToTest && (oppoRootsURLs.length == 0)) {
	//    PENDING - offer creation of new unit tests root
	//}
	if ((oppoRootsURLs == null) || (oppoRootsURLs.length == 0)) {
	    return null;
	}

	ClassPath oppoRootsClassPath = ClassPathSupport
		.createClassPath(oppoRootsURLs);
	final List<FileObject> oppoFiles = oppoRootsClassPath
		.findAllResources(oppoResourceName);
	if (oppoFiles.isEmpty()) {
	    //if (sourceToTest) {
	    //    PENDING - offer creation of new test class
	    //}
	    return null;
	}

	return new Location(oppoFiles.get(0)/*, null*/);
    }

    @Override
    protected FileObject[] createTests(FileObject[] filesToTest, FileObject targetRoot, Map<CreateTestParam, Object> params) {
	Project project = FileOwnerQuery.getOwner(filesToTest[0]);
        if (project != null) {
            JUnitPlugin plugin = JUnitTestUtil.getPluginForProject(project);
            if (plugin instanceof DefaultPlugin) {
                params.put(CommonPlugin.CreateTestParam.INC_GENERATE_INTEGRATION_TEST, Boolean.TRUE);
		return ((DefaultPlugin) plugin).createTests(filesToTest, targetRoot, params);
	    }
	}
	return new FileObject[0];
    }
}
