import sbt._
import Keys._
import play.Project._

object ApplicationBuild extends Build {

    val appName         = "proinfodata-web"
    val appVersion      = "2.0.4"

    val appDependencies = Seq(
        javaCore,
        javaJdbc,
        "postgresql" % "postgresql" % "9.1-901-1.jdbc4",
        "net.sf.jasperreports" % "jasperreports" % "5.0.4",
        "commons-digester" % "commons-digester" % "2.1",
        "groovy" % "groovy-all" % "1.1-rc-1",
        "com.lowagie" % "itext" % "4.2.0"
    )

    val fullDist = TaskKey[File]("dist", "Build the standalone application package with reports in it")
    val fullDistTask = (distDirectory, baseDirectory, playPackageEverything, dependencyClasspath in Runtime, target, normalizedName, version) map { (dist, root, packaged, dependencies, target, id, version) =>

        import sbt.NameFilter._

        val packageName = id + "-" + version
        val zip = dist / (packageName + ".zip")

        IO.delete(dist)
        IO.createDirectory(dist)

        val libs = {
          dependencies.filter(_.data.ext == "jar").map { dependency =>
            val filename = for {
              module <- dependency.metadata.get(AttributeKey[ModuleID]("module-id"))
              artifact <- dependency.metadata.get(AttributeKey[Artifact]("artifact"))
            } yield {
              module.organization + "." + module.name + "-" + Option(artifact.name.replace(module.name, "")).filterNot(_.isEmpty).map(_ + "-").getOrElse("") + module.revision + ".jar"
            }
            val path = ("lib/" + filename.getOrElse(dependency.data.getName))
            dependency.data -> path
          } ++ packaged.map(jar => jar -> ("lib/" + jar.getName))
        }

        val start = target / "start"

        val customConfig = Option(System.getProperty("config.file"))
        val customFileName = customConfig.map(f => Some((new File(f)).getName)).getOrElse(None)

        IO.write(start,
          """#!/usr/bin/env sh
scriptdir=`dirname $0`
classpath=""" + libs.map { case (jar, path) => "$scriptdir/" + path }.mkString("\"", ":", "\"") + """
exec java $* -cp $classpath """ + customFileName.map(fn => "-Dconfig.file=`dirname $0`/" + fn + " ").getOrElse("") + """play.core.server.NettyServer `dirname $0`
""" /* */ )
        val scripts = Seq(start -> (packageName + "/start"))

        val other = Seq((root / "README") -> (packageName + "/README"))

        val reportsDir = (root / "reports/")
        val reports = reportsDir.listFiles.map { file =>
            file -> (packageName + "/reports/" + file.getName)
        }

        val reportImagesDir = (root / "reports/images/")
        val reportImages = reportImagesDir.listFiles.map { file =>
            file -> (packageName + "/reports/images/" + file.getName)
        }

        val productionConfig = customFileName.map(fn => target / fn).getOrElse(target / "application.conf")

        val prodApplicationConf = customConfig.map { location =>
          val customConfigFile = new File(location)
          IO.copyFile(customConfigFile, productionConfig)
          Seq(productionConfig -> (packageName + "/" + customConfigFile.getName))
        }.getOrElse(Nil)

        IO.zip(libs.map { case (jar, path) => jar -> (packageName + "/" + path) } ++ scripts ++ reports ++ reportImages ++ other ++ prodApplicationConf, zip)
        IO.delete(start)
        IO.delete(productionConfig)

        println()
        println("Your application is ready in " + zip.getCanonicalPath)
        println()

        zip
    }

    val main = play.Project(appName, appVersion, appDependencies).settings(
        fullDist <<= fullDistTask
    )

}