import sbt._, Keys._
import org.fusesource.scalate.ScalatePlugin._, ScalateKeys._
import skinny.servlet._, ServletPlugin._, ServletKeys._
import org.sbtidea.SbtIdeaPlugin._

import scala.language.postfixOps

// -------------------------------------------------------
// Common Settings
// -------------------------------------------------------

val appOrganization = "jp.co.atware"
val appName = "scuruto"
val appVersion = "1.1.1-SNAPSHOT"

val skinnyVersion = "2.5.2"
val theScalaVersion = "2.12.4"
val jettyVersion = "9.3.22.v20171030"

lazy val baseSettings = servletSettings ++ Seq(
  organization := appOrganization,
  name         := appName,
  version      := appVersion,
  scalaVersion := theScalaVersion,
  dependencyOverrides := Set(
    "org.scala-lang"         %  "scala-library"            % scalaVersion.value,
    "org.scala-lang"         %  "scala-reflect"            % scalaVersion.value,
    "org.scala-lang"         %  "scala-compiler"           % scalaVersion.value,
    "org.scala-lang.modules" %% "scala-xml"                % "1.0.6",
    "org.scala-lang.modules" %% "scala-parser-combinators" % "1.0.6",
    "org.slf4j"              %  "slf4j-api"                % "1.7.25"
  ),
  libraryDependencies ++= Seq(
    "org.skinny-framework"    %% "skinny-framework"     % skinnyVersion,
    "org.skinny-framework"    %% "skinny-assets"        % skinnyVersion,
    "org.skinny-framework"    %% "skinny-task"          % skinnyVersion,
    "org.skinny-framework"    %  "skinny-logback"       % "1.0.14",
    "org.skinny-framework"    %% "skinny-oauth2-controller" % skinnyVersion,
    "org.skinny-framework"    %% "skinny-scaldi"        % skinnyVersion,
    "com.h2database"          %  "h2"                   % "1.4.196",
    "org.postgresql"          %  "postgresql"           % "42.1.4",
    "org.skinny-framework"    %% "skinny-factory-girl"  % skinnyVersion   % "test",
    "org.skinny-framework"    %% "skinny-test"          % skinnyVersion   % "test",
    "org.eclipse.jetty"       %  "jetty-webapp"         % jettyVersion    % "container",
    "org.eclipse.jetty"       %  "jetty-plus"           % jettyVersion    % "container",
    "javax.servlet"           %  "javax.servlet-api"    % "3.1.0"         % "container;provided;test",
    "org.pegdown"             %  "pegdown"              % "1.6.0",
    "org.scilab.forge"        %  "jlatexmath"           % "1.0.6",
    "com.github.t3hnar"       %% "scala-bcrypt"         % "3.1",
    "com.github.roundrop"     %% "scalikejdbc-sqlsyntax-ext" % "1.1.2",
    "com.unboundid"           %  "unboundid-ldapsdk"    % "2.3.8", // for LDAP
    "org.zapodot"             %  "embedded-ldap-junit"  % "0.5.2"         % "test" // for LDAP TEST
  ),
  // ------------------------------
  // for ./skinnny console
  initialCommands := """
import _root_.skinny._
import _root_.controller._
import _root_.model._
import _root_.org.joda.time._
import _root_.scalikejdbc._
import _root_.scalikejdbc.config._
DBSettings.initialize()
""",
  resolvers ++= Seq(
    "sonatype releases"  at "https://oss.sonatype.org/content/repositories/releases"
    //, "sonatype snapshots" at "https://oss.sonatype.org/content/repositories/snapshots"
    //, "LocalRepo" at file(Path.userHome.absolutePath + "/.ivy2/local").getAbsolutePath
    , "jlatexmath latest" at "https://dl.bintray.com/porst17/maven/" // by http://forge.scilab.org/index.php/p/jlatexmath/issues/1293/
  ),
  // Faster "./skinny idea"
  transitiveClassifiers in Global := Seq(Artifact.SourceClassifier),
  // the name-hashing algorithm for the incremental compiler.
  incOptions := incOptions.value.withNameHashing(true),
  updateOptions := updateOptions.value.withCachedResolution(true),
  logBuffered in Test := false,
  javaOptions in Test ++= Seq("-Dskinny.env=test"),
  fork in Test := true,
  suppressSbtShellNotification := true,
  scalacOptions ++= Seq("-unchecked", "-deprecation", "-feature"),
  ideaExcludeFolders := Seq(".idea",
    ".idea_modules",
    "db",
    "target",
    "task/target",
    "build",
    "standalone-build",
    "node_modules")
)

lazy val scalatePrecompileSettings = scalateSettings ++ Seq(
  scalateTemplateConfig in Compile := {
    val base = (sourceDirectory in Compile).value
    Seq(
      TemplateConfig(
        file(".") / "src" / "main" / "webapp" / "WEB-INF",
        // These imports should be same as src/main/scala/templates/ScalatePackage.scala
        Seq("import controller._", "import model._"),
        Seq(
          Binding("context",
            "_root_.skinny.micro.contrib.scalate.SkinnyScalateRenderContext",
            importMembers = true,
            isImplicit = true)
        ),
        Some("templates")
      )
    )
  }
)

// -------------------------------------------------------
// Development
// -------------------------------------------------------

lazy val devBaseSettings = baseSettings ++ Seq(
  unmanagedClasspath in Test += Attributed.blank(baseDirectory.value / "src/main/webapp"),
  // Integration tests become slower when multiple controller tests are loaded in the same time
  parallelExecution in Test := false,
  port in container.Configuration := 8080
)
lazy val dev = (project in file("."))
  .settings(devBaseSettings)
  .settings(
    name := appName + "-dev",
    target := baseDirectory.value / "target" / "dev"
  )

// --------------------------------------------------------
// Enable this sub project when you'd like to use --precompile option
// --------------------------------------------------------
/*
lazy val precompileDev = (project in file(".")).settings(devBaseSettings, scalatePrecompileSettings).settings(
  name := appName + "-precompile-dev",
  target := baseDirectory.value / "target" / "precompile-dev",
  ideaIgnoreModule := true
)
*/
// -------------------------------------------------------
// Task Runner
// -------------------------------------------------------

lazy val task = (project in file("task"))
  .settings(baseSettings)
  .settings(
    mainClass := Some("TaskRunner"),
    name := appName + "-task",
    libraryDependencies += "javax.servlet" % "javax.servlet-api" % "3.1.0"
  ) dependsOn (dev)

// -------------------------------------------------------
// Packaging
// -------------------------------------------------------

lazy val packagingBaseSettings = baseSettings ++ scalatePrecompileSettings ++ Seq(
  sources in doc in Compile := List(),
  publishTo := {
    val base = "https://oss.sonatype.org/"
    if (version.value.trim.endsWith("SNAPSHOT")) Some("snapshots" at base + "content/repositories/snapshots")
    else Some("releases" at base + "service/local/staging/deploy/maven2")
  }
)
lazy val build = (project in file("build"))
  .settings(packagingBaseSettings)
  .settings(
    name := appName,
    ideaIgnoreModule := true
  )
lazy val standaloneBuild = (project in file("standalone-build"))
  .settings(packagingBaseSettings)
  .settings(
    name := appName + "-standalone",
    libraryDependencies += "org.skinny-framework" %% "skinny-standalone" % skinnyVersion,
    ideaIgnoreModule := true,
    ivyXML := <dependencies><exclude org="org.eclipse.jetty.orbit" /></dependencies>
  )