val scala3: String = "3.6.3"

ThisBuild / scalaVersion  := scala3
ThisBuild / gsProjectName := "gs-maintainer"

ThisBuild / externalResolvers := Seq(
  "Garrity Software Mirror" at "https://maven.garrity.co/releases",
  "Garrity Software Releases" at "https://maven.garrity.co/gs"
)

lazy val sharedSettings = Seq(
  scalaVersion        := scala3,
  version             := calVer.value,
  publish / skip      := true,
  publishLocal / skip := true,
  publishArtifact     := false
)

val Deps = new {
  val Cats = new {
    val Core: ModuleID   = "org.typelevel" %% "cats-core"   % "2.13.0"
    val Effect: ModuleID = "org.typelevel" %% "cats-effect" % "3.5.7"
  }

  val Fs2 = new {
    val Core: ModuleID = "co.fs2" %% "fs2-core" % "3.11.0"
  }

  val Skunk = new {
    val Core: ModuleID = "org.tpolecat" %% "skunk-core" % "1.1.0-M3"
  }

  val Http4s = new {
    val Core: ModuleID = "org.http4s" %% "http4s-core" % "1.0.0-M44"
    val Dsl: ModuleID  = "org.http4s" %% "http4s-dsl"  % "1.0.0-M44"
    val EmberServer: ModuleID =
      "org.http4s" %% "http4s-ember-server" % "1.0.0-M44"
  }

  val Gs = new {
    val Uuid: ModuleID    = "gs" %% "gs-uuid-v0"         % "0.4.0"
    val Config: ModuleID  = "gs" %% "gs-config-v0"       % "0.2.0"
    val Datagen: ModuleID = "gs" %% "gs-datagen-core-v0" % "0.3.0"
  }

  val MUnit: ModuleID = "org.scalameta" %% "munit" % "1.1.0"
}

lazy val testSettings = Seq(
  libraryDependencies ++= Seq(
    Deps.MUnit      % Test,
    Deps.Gs.Datagen % Test
  )
)

lazy val `gs-maintainer` = project
  .in(file("."))
  .aggregate(model, web, cli)
  .settings(sharedSettings)
  .settings(name := s"${gsProjectName.value}")

lazy val model = project
  .in(file("modules/model"))
  .settings(sharedSettings)
  .settings(testSettings)
  .settings(name := s"${gsProjectName.value}-model")
  .settings(
    libraryDependencies ++= Seq(
      Deps.Gs.Uuid,
      Deps.Cats.Core
    )
  )

lazy val web = project
  .in(file("modules/web"))
  .dependsOn(model)
  .settings(sharedSettings)
  .settings(testSettings)
  .settings(name := s"${gsProjectName.value}-web")
  .settings(
    libraryDependencies ++= Seq(
      Deps.Http4s.Core,
      Deps.Http4s.Dsl,
      Deps.Http4s.EmberServer
    )
  )

lazy val cli = project
  .in(file("modules/cli"))
  .dependsOn(model)
  .settings(sharedSettings)
  .settings(testSettings)
  .settings(name := s"${gsProjectName.value}-cli")
  .settings(
    libraryDependencies ++= Seq(
    )
  )