import groovy.xml.MarkupBuilder
import java.util.regex.*

defaultTasks 'init'

allprojects {
  repositories {
    mavenLocal()
    mavenCentral()
  }
}

repositories {
  ivy {
      url 'https://teamcity.jetbrains.com/guestAuth/repository/download'
      layout ('pattern') {
          artifact '[organization]/[classifier]/[module]-[revision].[ext]'
      }
  }
}

configurations {
    junitAnt
    mps
}

dependencies {
  // initialize JUnit optional ant task
  junitAnt 'junit:junit:4.8.2'
  junitAnt('org.apache.ant:ant-junit:1.9.2') {
      transitive = false
  }

  // MPS-related stuff declared as project properties
  mps "${mpsBuildConfiguration}:MPS:${mpsBuildNumber}:${mpsBuildLabel}.tcbuildtag@zip"
}

task installMps(type: Copy)  {
  onlyIf {
    ! file('MPS_HOME').exists()
  }

  from zipTree(configurations.mps[0])
  into 'MPS_HOME'

  // Gradle woodoo for unzipping an archive
  eachFile { FileCopyDetails fcp ->
    // copy the contents of the directory named "MPS ${mpsRelease}"
    if (fcp.relativePath.pathString.startsWith("MPS ${mpsRelease}/")) {
      // remap the file to the root
      def segments = fcp.relativePath.segments
      def pathsegments = segments[1..-1] as String[]
      fcp.relativePath = new RelativePath(!fcp.file.isDirectory(), pathsegments)

    } else {
      fcp.exclude()
    }
    // avoid overriding files
    if (fcp.relativePath.getFile(destinationDir).exists()) {
       it.exclude()
    }
  }
  includeEmptyDirs = false
}

def allInitDependencies = [
  'installMps',
  'coderules/solutions/jetbrains.mps.logic.reactor:copyDependencies',
  'coderules/solutions/jetbrains.mps.logic.test:copyDependencies',
  'coderules/solutions/jetbrains.mps.typechecking:copyDependencies',
  'coderules/solutions/jetbrains.mps.coderules:copyDependencies' ]

task init(dependsOn: allInitDependencies) {
  doLast {
    println 'Initialized all dependencies.'
  }
}

def tagMatcher() {
  System.env.TRAVIS_TAG =~ /v([0-9.]+)-.*\.([0-9]+)/
}

task generateUpdatePluginsXml {
  onlyIf {
    tagMatcher().find()
  }
  doLast {
    def updatesDir = project.projectDir.absolutePath + "/build/artifacts/coderules/updates"
    mkdir(updatesDir)

    def baseUrl = "https://github.com/fisakov/constraints-typechecking/releases/download"
    def zip = "/coderules-0.5.zip"

    file(updatesDir + "/updatePlugins.xml").withWriter { w ->
       new MarkupBuilder(new IndentPrinter(w, "    ", true)).
         plugins {
           plugin( id: "jetbrains.mps.coderules" ,
                   url: baseUrl + "/$System.env.TRAVIS_TAG" + zip ,
                   version: "${tagMatcher()[0][1]}-b${tagMatcher()[0][2]}" )
         { }
       }
    }
  }
}

ant.taskdef(name: 'junit',
            classname: 'org.apache.tools.ant.taskdefs.optional.junit.JUnitTask',
            classpath: configurations.junitAnt.asPath)

ant.importBuild('build.xml') { antTarget ->
    'coderules-'+antTarget
}
ant.properties.'ci.build.num' = "${tagMatcher().find() ? tagMatcher()[0][2] : '9999'}".toString()

// ensure 'init' runs before 'fetchDependencies' and 'declare-mps-tasks'
'coderules-fetchDependencies' {
  dependsOn {
    'init'
  }
}

'coderules-declare-mps-tasks' {
  dependsOn {
    'init'
  }
}

// ensure 'generate' runs before 'classes' ('generate' is NOT optional)
'coderules-classes' {
  dependsOn {
    'coderules-generate'
  }
  mustRunAfter {
    'coderules-generate'
  }
}

'coderules-assemble' {
  finalizedBy {
    'generateUpdatePluginsXml'
  }
}

task check {
  dependsOn {
    [
      ':coderules-test',
      ':samples/mpscore:mpscore-test',
      ':samples/lambdacalc:lambdacalc-test',
      ':samples/fitch:fitch-test'
    ]
  }
}
