def library()

in build.sbt [68:372]


def library(
    theProject: Project,
    projectDependencies: Seq[ClasspathDependency] = Seq(),
    scalaSettings: SettingsDefinition = scala2Settings,
) =
  theProject
    .settings(scalaSettings, testSettings, scalafmtSettings)
    .configs(EffectsTest, HealthCheckTest)
    .dependsOn(projectDependencies *)
    .settings(
      Test / test := ((Test / test) dependsOn (projectDependencies.map(cp => cp.project / Test / test) *)).value,
      Test / testOnly := ((Test / testOnly) dependsOn (projectDependencies.map(_.project / Test / test) *)).evaluated,
      Test / testQuick := ((Test / testQuick) dependsOn (projectDependencies.map(_.project / Test / test) *)).evaluated,
    )

// ==== START libraries ====

lazy val testLib = library(project in file("lib/test"))
  .settings(
    libraryDependencies ++= Seq(
      scalatest,
      playJson % "test",
    ),
  )

val testDep = testLib % "test->test"

lazy val zuora = library(
  project in file("lib/zuora"),
  Seq(
    restHttp,
    testDep,
    handler, // TODO only for the config, which needs to be split out
    effects % "test->test",
  ),
)
  .settings(
    libraryDependencies ++= Seq(okhttp3, playJson, scalatest) ++ logging,
    dependencyOverrides ++= jacksonDependencies,
  )

lazy val `salesforce-core` = library(
  project in file("lib/salesforce/core"),
  Seq(`config-core`),
)
  .settings(
    libraryDependencies ++= Seq(playJson),
    dependencyOverrides ++= jacksonDependencies,
  )

lazy val `salesforce-client` = library(
  project in file("lib/salesforce/client"),
  Seq(
    restHttp,
    handler, // % "test->test" TODO make this dep only in test - SF client shouldn't depends on ApiGateway
    effects % "test->test",
    testDep,
    `salesforce-core`,
  ),
)
  .settings(
    libraryDependencies ++= Seq(okhttp3, catsCore, playJson, scalatest) ++ logging,
    dependencyOverrides ++= jacksonDependencies,
  )

lazy val `salesforce-sttp-client` = library(
  project in file("lib/salesforce/sttp-client"),
  Seq(
    `salesforce-core`,
    `salesforce-sttp-test-stub` % Test,
  ),
)
  .settings(
    libraryDependencies ++=
      Seq(sttp, sttpCirce, sttpAsyncHttpClientBackendCats % Test, scalatest, catsCore, catsEffect, circe) ++ logging,
    dependencyOverrides ++= jacksonDependencies :+ asyncHttpClientOverride,
  )

lazy val `salesforce-sttp-test-stub` = library(
  project in file("lib/salesforce/sttp-test-stub"),
  Seq(
    `salesforce-core`,
  ),
)
  .settings(
    libraryDependencies ++= Seq(sttp, sttpCirce, scalatest) ++ logging,
    dependencyOverrides ++= jacksonDependencies,
  )

lazy val `holiday-stops` = library(
  project in file("lib/holiday-stops"),
  Seq(
    `salesforce-client`,
    effects % "test->test",
    testDep,
    `zuora-core` % "compile->compile;test->test",
  ),
)
  .settings(
    libraryDependencies ++= Seq(
      okhttp3,
      playJson,
      scalatest,
      scalaCheck,
      circe,
      circeParser,
      sttp,
      sttpCirce,
      enumeratum,
      zio,
    ) ++ logging,
    dependencyOverrides ++= jacksonDependencies,
  )

lazy val restHttp = library(project in file("lib/restHttp"), Seq(handler))
  .settings(
    libraryDependencies ++= Seq(okhttp3, catsCore, playJson, scalatest) ++ logging,
    dependencyOverrides ++= jacksonDependencies,
  )

lazy val s3ConfigValidator = library(
  project in file("lib/s3ConfigValidator"),
  Seq(
    testDep,
    handler,
    zuora,
    `digital-subscription-expiry`,
    `identity-backfill`,
    effectsDepIncludingTestFolder,
    `cancellation-sf-cases-api`,
    `sf-gocardless-sync`,
    `holiday-stop-api`,
  ),
)
  .settings(
    libraryDependencies ++= Seq(scalatest),
    dependencyOverrides ++= jacksonDependencies,
  )

lazy val handler = library(
  project in file("lib/handler"),
  Seq(`effects-s3`, `config-core`),
)
  .settings(
    libraryDependencies ++= Seq(okhttp3, catsCore, playJson, scalatest, awsLambda) ++ logging,
    dependencyOverrides ++= jacksonDependencies,
  )

// to aid testability, only the actual handlers called as a lambda can depend on this
lazy val effects = library(
  project in file("lib/effects"),
  Seq(handler),
)
  .settings(
    dependencyOverrides ++= jacksonDependencies,
    libraryDependencies ++= Seq(okhttp3, playJson, scalatest, awsS3) ++ logging,
  )
lazy val `effects-s3` = library(project in file("lib/effects-s3"))
  .settings(
    libraryDependencies ++= Seq(awsS3) ++ logging,
    dependencyOverrides ++= jacksonDependencies,
  )
lazy val `effects-cloudwatch` = library(
  project in file("lib/effects-cloudwatch"),
  Seq(testDep),
)
  .settings(
    libraryDependencies ++= Seq(awsCloudwatch) ++ logging,
  )
lazy val `effects-sqs` = library(project in file("lib/effects-sqs"), Seq(testDep))
  .settings(
    libraryDependencies ++= Seq(awsSQS) ++ logging,
    dependencyOverrides ++= jacksonDependencies,
  )
lazy val `effects-lambda` = library(project in file("lib/effects-lambda"), Seq(testDep))
  .settings(
    libraryDependencies ++= Seq(awsSdkLambda) ++ logging,
    dependencyOverrides ++= jacksonDependencies,
  )

lazy val `config-core` = library(project in file("lib/config-core"), Seq(), scala3Settings)

lazy val `config-cats` = library(project in file("lib/config-cats"), Seq(`effects-s3`))
  .settings(
    libraryDependencies ++= Seq(simpleConfig, catsEffect, circe, circeConfig),
    dependencyOverrides ++= jacksonDependencies,
  )

val effectsDepIncludingTestFolder: ClasspathDependency = effects % "compile->compile;test->test"

lazy val `zuora-reports` = library(
  project in file("lib/zuora-reports"),
  Seq(zuora, handler, effectsDepIncludingTestFolder, testDep),
)
  .settings(dependencyOverrides ++= jacksonDependencies)

lazy val `fulfilment-dates` = library(
  project in file("lib/fulfilment-dates"),
  Seq(`effects-s3`, `config-core`, testDep, `zuora-core`),
)
  .settings(
    libraryDependencies ++= Seq(catsCore, circe, circeParser),
    dependencyOverrides ++= jacksonDependencies,
  )

lazy val `google-bigquery` = library(
  project in file("lib/google-bigquery"),
  Seq(testDep, `config-core`, `effects-s3` % "test", handler % "test"),
)
  .settings(
    libraryDependencies ++= Seq(googleBigQuery, playJson) ++ logging,
  )

lazy val `zuora-baton` = library(
  project in file("lib/zuora-baton"),
  Seq(zuora, `config-core`),
)
  .settings(
    libraryDependencies ++= Seq(playJson),
    dependencyOverrides ++= jacksonDependencies,
  )

lazy val `zuora-core` = library(project in file("lib/zuora-core"))
  .settings(
    libraryDependencies ++= Seq(
      playJson,
      catsCore,
      circe,
      circeParser,
      sttp,
      sttpCirce,
      scalatest,
      diffx,
    ) ++ logging,
    dependencyOverrides ++= jacksonDependencies,
  )

// this lib is shared between ZIO and non zio projects so can't depend on json libs, http clients, effects etc.
lazy val `zuora-models` = library(
  project in file("lib/zuora-models"),
  Seq(`config-core`),
  scala3Settings,
)
  .settings(
    libraryDependencies += "com.gu" %% "support-internationalisation" % "0.16" exclude ("com.typesafe.scala-logging", "scala-logging_2.13"),
  )

lazy val `credit-processor` = library(
  project in file("lib/credit-processor"),
  Seq(
    `zuora-core`,
    `fulfilment-dates`,
  ),
)
  .settings(
    libraryDependencies ++= Seq(parallelCollections) ++ logging,
    dependencyOverrides ++= jacksonDependencies,
  )

lazy val `imovo-sttp-client` = library(project in file("lib/imovo/imovo-sttp-client"))
  .settings(
    libraryDependencies ++=
      Seq(sttp, sttpCirce, sttpAsyncHttpClientBackendCats % Test, scalatest, catsCore, catsEffect, circe) ++ logging,
    dependencyOverrides ++= Seq(asyncHttpClientOverride),
  )

lazy val `imovo-sttp-test-stub` = library(
  project in file("lib/imovo/imovo-sttp-test-stub"),
  Seq(`imovo-sttp-client`),
)
  .settings(
    libraryDependencies ++= Seq(scalatest),
  )

def lambdaProject(
    projectName: String,
    projectDescription: String,
    externalDependencies: Seq[sbt.ModuleID] = Nil,
    projectDependencies: Seq[ClasspathDependency] = Nil,
    scalaSettings: SettingsDefinition = scala2Settings,
) = {
  val cfName = "cfn.yaml"
  Project(projectName, file(s"handlers/$projectName"))
    .enablePlugins(RiffRaffArtifact)
    .configs(EffectsTest, HealthCheckTest)
    .dependsOn(projectDependencies *)
    .settings(scalaSettings, testSettings, scalafmtSettings)
    .settings(
      name := projectName,
      description := projectDescription,
      assemblyJarName := s"$projectName.jar",
      assemblyMergeStrategyDiscardModuleInfo,
      riffRaffAwsRegion := "eu-west-1",
      riffRaffPackageType := assembly.value,
      riffRaffUploadArtifactBucket := Option("riffraff-artifact"),
      riffRaffUploadManifestBucket := Option("riffraff-builds"),
      riffRaffManifestProjectName := s"support-service-lambdas::$projectName",
      riffRaffArtifactResources += (file(s"handlers/$projectName/$cfName"), s"cfn/$cfName"),
      dependencyOverrides ++= jacksonDependencies :+ asyncHttpClientOverride,
      libraryDependencies ++= externalDependencies ++ logging,
      Test / test := ((Test / test) dependsOn (projectDependencies.map(_.project / Test / test) *)).value,
      Test / testOnly := ((Test / testOnly) dependsOn (projectDependencies.map(_.project / Test / test) *)).evaluated,
      Test / testQuick := ((Test / testQuick) dependsOn (projectDependencies.map(_.project / Test / test) *)).evaluated,
    )
}