buildscript {
  repositories {
    jcenter()
  }

  dependencies {
    classpath 'org.jfrog.buildinfo:build-info-extractor-gradle:2.2.4'
  }
}

apply plugin: 'native-component'
apply plugin: 'ivy-publish'
apply plugin: 'java'
apply plugin: 'artifactory-publish'

enum SupportedOS implements OperatingSystem {
  LINUX, WINDOWS, MACOSX;

  public static final SupportedOS CURRENT;

  static {
    String p = System.properties['os.name']
    switch(p.replaceAll(' ', '').toLowerCase()) {
      case ~/.*linux.*/:  CURRENT = LINUX; break;
      case ~/.*darwin.*/: CURRENT = MACOSX; break;
      case ~/.*osx.*/:    CURRENT = MACOSX; break;
      case ~/.*win.*/:    CURRENT = WINDOWS; break;
      default:
        String m = "SupportedOS: unrecognized platform: ${p}"
        println(m)
        throw new IllegalArgumentException(m)
    }
  }

  public String getName() {
    return toString().toLowerCase()
  }

  public String  getDisplayName() {
    return getName()
  }
  public boolean isCurrent() { return this == CURRENT }
  public boolean isFreeBSD() { return false }
  public boolean isLinux() { return this == LINUX }
  public boolean isMacOsX() { return this == MACOSX }
  public boolean isSolaris() { return false }
  public boolean isWindows() { return this == WINDOWS }

}

public String adjustArch(String arch) {
  switch(arch) {
    case ~/.*64.*/: return 'x86_64'
    default:        return 'i386'
  }
}

ext {
  currentPlatform = SupportedOS.CURRENT.getName()
  currentArch = adjustArch(System.properties['os.arch'])
  currentPlatformArch = "${currentPlatform}-${currentArch}"

  platform = project.hasProperty('platform') ? platform : currentPlatform
  arch = project.hasProperty('arch') ? arch : currentArch
  platformArch = "${platform}-${arch}"

  java_home = System.properties.'java.home'
  if(java_home.endsWith("/jre")) {
    java_home = java_home.substring(0, java_home.length() - "/jre".length())
  }
  java_home = java_home

  libDir = "${buildDir}/lib"
  lzmaDir = "${libDir}/lzma"

  buildOptions = ['', '-lzma']
}

repositories {
  ivy {
    name "ivyLocal"
    url "${System.env.HOME}/.ivy2/local"
    layout 'maven'
  }

  ivy {
    name "jcenter"
    if(version.contains("SNAPSHOT")) {
      url "http://oss.jfrog.org/artifactory/oss-snapshot-local"
    } else {
      url "http://oss.jfrog.org/artifactory/oss-release-local"
    }
    layout 'maven'
  }
}

configurations {
  create('windows-i386')
  create('windows-x86_64')
}

dependencies {
  'windows-i386' "com.readytalk:win32:1.0.0-SNAPSHOT"
  'windows-x86_64' "com.readytalk:win64:1.0.0-SNAPSHOT"
}

model {
  platforms {
    create(platformArch) {
      operatingSystem SupportedOS.valueOf(platform.toUpperCase())
      architecture "${arch}"
    }
  }

  tasks {
    buildOptions.each { buildOption ->
      platforms.each { platform ->
        if(platform.operatingSystem.name == "windows") {
          def artifactName = platform.architecture.name == "i386" ? 'win32' : 'win64'

          task "extract${platform.name}${buildOption}"(type: Copy) {
            from {
              tarTree(configurations."${platform.name}".find { it.name =~ artifactName })
            }
            into "${libDir}/tools"
          }
        }

        task "build${platform.name}${buildOption}"(type: Exec) {
          executable "make"
          args "platform=${platform.operatingSystem.name}",
               "arch=${platform.architecture.name}"

          if(buildOption == "-lzma") {
            dependsOn 'extractLzma'
            args "lzma=${lzmaDir}"
          }

          if(platform.operatingSystem.name == "windows") {
              dependsOn "extract${platform.name}${buildOption}"
              args "win32=${libDir}/tools/win32",
                   "win64=${libDir}/tools/win64"
          }
          environment JAVA_HOME: java_home
        }

        assemble {
          dependsOn "build${platform.name}${buildOption}"
        }
      }
    }
  }
}

tasks.withType(JavaCompile) {
  sourceCompatibility = "1.6"
  targetCompatibility = "1.6"

  options.with {
    encoding = "UTF-8"
    bootClasspath = sourceSets.main.output.classesDir
  }
}

sourceSets {
  main {
    java {
      srcDir 'classpath'
    }
  }
}

javadoc {
  title = "Avian v${version} Class Library API"
}

task javadocJar(type: Jar) {
  dependsOn javadoc
  classifier = 'javadoc'
  from {
    javadoc.destinationDir
  }
}

jar {
  baseName "classpath-avian"
}

task downloadLzma(type: Exec) {
  commandLine "curl"
  args "--create-dirs", "-o", "${lzmaDir}/lzma920.tar.bz2", "-f", "http://oss.readytalk.com/avian-web/lzma920.tar.bz2"
}

task extractLzma(type: Copy) {
  dependsOn downloadLzma
  from {
    tarTree(resources.bzip2("${lzmaDir}/lzma920.tar.bz2"))
  }
  into lzmaDir
}

task install {
  dependsOn assemble, publish
}

publishing {
  repositories {
    add(project.repositories."ivyLocal")
  }

  publications {

    ivy(IvyPublication) {
      from components.java

      artifact(javadocJar)

      artifact("vm.pro") {
        name "vm"
        type "proguard"
        extension "pro"
      }

      module "classpath-avian"
    }

    create("tools-avian-${currentPlatformArch}", IvyPublication) {
      module "tools-avian-${currentPlatformArch}"

      def publishBinSuffix = currentPlatform == "windows" ? "exe" : "bin"
      def binSuffix = currentPlatform == "windows" ? ".exe" : ""
      artifact("${buildDir}/${currentPlatform}-${currentArch}/binaryToObject/binaryToObject${binSuffix}") {
        name "binaryToObject"
        type publishBinSuffix
        extension publishBinSuffix
      }
    }

    buildOptions.each { buildOption ->
      platforms.each { platform ->
        def binSuffix=""
        def publishBinSuffix="bin"

        create("${platform.name}${buildOption}", IvyPublication) {
          def nativeBuildDir = "${buildDir}/${platform.operatingSystem.name}-${platform.architecture.name}${buildOption}"

          if(platform.operatingSystem.name == "windows") {
            publishBinSuffix = "exe"
            binSuffix = ".${publishBinSuffix}"
          }

          module "runtime-avian${buildOption}-${platform.name}"

          artifact("${nativeBuildDir}/avian${binSuffix}") {
            name "avian"
            type publishBinSuffix
            extension publishBinSuffix
          }

          artifact("${nativeBuildDir}/libavian.a") {
            name "libavian"
            type "a"
            extension "a"
          }

          if (buildOption == "-lzma") {
            artifact("${nativeBuildDir}/libavian-lzma.a") {
              name "libavian-lzma"
              type "a"
              extension "a"
            }

            artifact("${nativeBuildDir}/lzma/lzma${binSuffix}") {
              name "lzma"
              type publishBinSuffix
              extension publishBinSuffix
            }
          }
        }
      }
    }
  }
}

artifactoryPublish {
  onlyIf {
    // TRAVIS_BRANCH reports master if it is a master build or a PR going to master
    // TRAVIS_PULL_REQUEST reports false if not a pull request and the PR number if it is
    System.env.'TRAVIS_BRANCH' == "master" && System.env.'TRAVIS_PULL_REQUEST' == "false"
  }
  dependsOn assemble
}

artifactory {
  contextUrl = "http://oss.jfrog.org"

  resolve {
    repository {
      repoKey = 'libs-releases'
    }
  }

  publish {
    repository {
      repoKey = 'oss-snapshot-local'
      username = System.env.BINTRAY_USER
      password = System.env.BINTRAY_API_KEY
      ivy {
        ivyLayout = "[organisation]/[module]/[revision]/ivy-[revision].xml"
      }
    }

    defaults {
      platforms.each {
        publications it.name
      }
    }
  }
}

task wrapper(type: Wrapper) {
  distributionUrl = 'http://services.gradle.org/distributions/gradle-2.0-bin.zip'
}