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

configure(rootProject) {
  def urlVersion = project.baseVersion.replace('.', '_')
  def refguideUrlVersion = project.baseVersion.replaceFirst(/^(\d+)\.(\d+).*$/, '$1_$2')

  ext {
    luceneDocUrl = project.propertyOrDefault('lucene.javadoc.url', {
      if (project.version != project.baseVersion) {
        // non-release build
        new File(project('lucene:documentation').buildDir, 'site').toURI().toASCIIString().minus(~'/$')
      } else {
        // release build
        "https://lucene.apache.org/core/${urlVersion}"
      }
    }())

    solrDocUrl = project.propertyOrDefault('solr.javadoc.url', {
      if (project.version != project.baseVersion) {
        // non-release build
        new File(project('solr:documentation').buildDir, 'site').toURI().toASCIIString().minus(~'/$')
      } else {
        // release build
        "https://lucene.apache.org/solr/${urlVersion}"
      }
    }())

    solrRefguideUrl = project.propertyOrDefault('solr.refguide.url', "https://lucene.apache.org/solr/guide/${refguideUrlVersion}")
  }

  task documentation() {
    group = 'documentation'
    description = 'Generate all documentation'

    dependsOn ':lucene:documentation:assemble'
    dependsOn ':solr:documentation:assemble'
  }
}

// docroot will point to Lucene and Solr relative directory for each sub-project.
configure(subprojects.findAll { it.path == ':lucene:documentation' || it.path == ':solr:documentation' }) {

  ext {
    docroot = file("${buildDir}/site")
    docrootMinimal = file("${buildDir}/minimalSite")

    markdownSrc = file("src/markdown")
    assets = file("src/assets")
  }

  task documentation() {
    group = 'documentation'
    description = "Generate ${project.name.capitalize()} documentation"

    dependsOn project.parent.subprojects.collect { prj ->
      prj.tasks.matching { it.name == 'renderSiteJavadoc' }
    }
    dependsOn 'changesToHtml','copyDocumentationAssets',
      'markdownToHtml','createDocumentationIndex'
  }

  task copyDocumentationAssets(type: Copy) {
    includeEmptyDirs = false
    from(project.assets)
    into project.docroot
  }
  
  assemble {
    dependsOn documentation
  }

  configurations {
    site
  }
  
  artifacts {
    site project.docroot, {
      builtBy documentation
    }
  }

}

configure(project(':solr:documentation')) {

  task documentationMinimal() {
    group = 'documentation'
    description = "Generate stub Solr documentation pointing to web page (that's part of Solr TGZ)"
    dependsOn 'copyMiniDocumentationAssets','createMiniDocumentationIndex','copyChangesToHtmlForMiniSite'
  }

  task copyChangesToHtmlForMiniSite(type: Copy) {
    from project.docroot
    into project.docrootMinimal
    include 'changes/**'
    dependsOn 'changesToHtml'
  }

  task copyMiniDocumentationAssets(type: Copy) {
    includeEmptyDirs = false
    from('src/assets')
    into project.docrootMinimal
  }

  assemble {
    dependsOn documentationMinimal
  }

  configurations {
    minimalSite
  }
  
  artifacts {
    minimalSite project.docrootMinimal, {
      builtBy documentationMinimal
    }
  }

}

configure(subprojects.findAll { it.path == ':lucene' || it.path == ':solr' }) {
  
  ext {
    docroot = project('documentation').docroot
    docrootMinimal = project('documentation').docrootMinimal
  }

}
