/*
 * 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.
 */

import org.gradle.plugins.ide.eclipse.model.SourceFolder
import org.gradle.plugins.ide.eclipse.model.ClasspathEntry

def resources = scriptResources(buildscript)

configure(rootProject) {
  apply plugin: "eclipse"

  def relativize = { other -> rootProject.rootDir.relativePath(other).toString() }

  eclipse {
    project {
      name = "Apache Lucene Solr ${version}"
    }

    classpath {
      defaultOutputDir = file('build/eclipse')

      file {
        beforeMerged { classpath -> classpath.entries.removeAll { it.kind == "src" } }

        whenMerged { classpath ->
          def projects = allprojects.findAll { prj ->
            return prj.plugins.hasPlugin(JavaPlugin) &&
                   prj.path != ":solr:solr-ref-guide"
          }

          Set<String> sources = []
          Set<File> jars = []
          projects.each { prj ->
            prj.sourceSets.each { sourceSet ->
              sources += sourceSet.java.srcDirs.findAll { dir -> dir.exists() }.collect { dir -> relativize(dir) }
              sources += sourceSet.resources.srcDirs.findAll { dir -> dir.exists() }.collect { dir -> relativize(dir) }
            }

            // This is hacky - we take the resolved compile classpath and just
            // include JAR files from there. We should probably make it smarter
            // by looking at real dependencies. But then: this Eclipse configuration
            // doesn't really separate sources anyway so why bother.
            jars += prj.configurations.compileClasspath.resolve()
            jars += prj.configurations.testCompileClasspath.resolve()
          }

          classpath.entries += sources.sort().collect {name -> new SourceFolder(name, "build/eclipse/" + name) }
          classpath.entries += jars.unique().findAll { location -> location.isFile() }.collect { location ->
            new LibEntry(location.toString())
          }
        }
      }
    }

    jdt {
      sourceCompatibility = rootProject.minJavaVersion
      targetCompatibility = rootProject.minJavaVersion
      javaRuntimeName = "JavaSE-${rootProject.minJavaVersion}"
    }
  }

  eclipseJdt {
    doLast {
      project.sync {
        from rootProject.file("${resources}/dot.settings")
        into rootProject.file(".settings")
      }
    }
  }
}

public class LibEntry implements ClasspathEntry {
  private String path;

  LibEntry(String path) {
    this.path = path;
  }

  @Override
  String getKind() {
    return "lib"
  }

  @Override
  void appendNode(Node node) {
    node.appendNode("classpathentry", Map.of(
        "kind", "lib",
        "path", path
    ));
  }
}
