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

description = "Apache Zest™ Manuals and Website."

dependencies {
  compile( project( ":org.apache.zest.core:org.apache.zest.core.bootstrap" ) )
  compile( project( ":org.apache.zest.libraries:org.apache.zest.library.constraints" ) )
  compile( project( ":org.apache.zest.libraries:org.apache.zest.library.logging" ) )
  runtime( project( ":org.apache.zest.core:org.apache.zest.core.runtime" ) )
  runtime( libraries.slf4j_simple )
}


//task userguide( type: org.apache.zest.gradle.plugin.documentation.Documentation ) {
//  docName = 'userguide'
//  docType = 'book'
//}
//
//task recipes( type: org.apache.zest.gradle.plugin.documentation.Documentation ) {
//  docName = 'recipes'
//  docType = 'article'
//}
//
//task referenceManual( type: org.apache.zest.gradle.plugin.documentation.Documentation ) {
//  docName = 'reference'
//  docType = 'book'
//}


task website( type: org.apache.zest.gradle.plugin.Documentation,
              dependsOn: rootProject.allprojects.tasks.flatten().findAll { it.name == AsciidocBuildInfo.TASK_NAME } ) {
  docName 'website'
  docType 'article'
}

task archiveWebsite( type: Copy ) {
  dependsOn website
  if( rootProject.version == '0' || rootProject.version.contains( "SNAPSHOT" ) )
  {
    into( "$rootProject.projectDir/../zest-web/site/content/java/develop" )
  }
  else
  {
    into( "$rootProject.projectDir/../zest-web/site/content/java/$version" )
  }
  from( 'build/docs/website/' )
}

task copyWebsite( type: Copy ) {
  dependsOn archiveWebsite
  if( rootProject.version != '0' && !rootProject.version.contains( "SNAPSHOT" ) )
  {
    from( "$rootProject.projectDir/../zest-web/site/content/java/$version/" )
    into( "$rootProject.projectDir/../zest-web/site/content/java/latest/" )
  }
}

task manuals() {
  dependsOn copyWebsite
//  dependsOn userguide
//  dependsOn referenceManual
//  dependsOn recipes
}

// Skip if asciidoc is not found in PATH when building a 0 or SNAPSHOT version,
// or if skipAsciidocIfAbsent property is set and asciidoc is not found in PATH
[ website, archiveWebsite, copyWebsite, manuals ]*.onlyIf {
  def skipAsciidocIfAbsent = rootProject.hasProperty( 'skipAsciidocIfAbsent' ) ? rootProject.skipAsciidocIfAbsent : false
  def pathDirs = System.getenv( 'PATH' ).split( File.pathSeparator )
  def present = pathDirs.collect( { new File( it, 'asciidoc') } ).flatten().findAll( { it.isFile() } )
  if( !skipAsciidocIfAbsent && version != '0' && !version.contains( 'SNAPSHOT' ) ) {
    project.logger.debug 'Asciidoc tasks forced because version is no-0 and no-SNAPSHOT, hope you have Asciidoc installed'
    return true
  }
  if( !present ) {
    project.logger.warn 'Asciidoc not found in PATH, manual tasks will skip, please install http://www.methods.co.nz/asciidoc/'
  }
  present
}
