def checkBranchConditions(parameter="default") {
  switch(parameter) {
    case "default":
      switch(env.BRANCH_NAME) {
        case "master":
          return true
        default:
          return false
      }
    case "yes":
      return true
    case "no":
      return false
    default:
      return false
  }
}

def setLiquibasePipelineVars(projectPath) {
  // uses common environment variables to set parameter map for pythonPackagePipeline method
  def params = [:]
  // Common variables to parameters
  params.awsProfile              = env.AWS_PROFILE
  //ProjectSpecific parameters
  params.projectName             = projectPath.split('/')[-1]
  params.workDir                 = "${env.WORKSPACE}/${projectPath}"

  return params
}

def liquibaseTestPipeline(params) {
  withEnv(["AWS_PROFILE=${params.awsProfile}"]) {
    stage("Run tests") {
      echo sh(script: "cd ${params.workDir} && make docker/clean", returnStdout: true).trim()
      echo sh(script: "cd ${params.workDir} && make docker/test", returnStdout: true).trim()
    }
  }
}

def setDockerPipelineParams(imageUploadMode, failIfReleaseExists, projectPath, projectGroup, ecr, ecrRepoSubfolder='', projectName='') {
  // uses common environment variables to set parameter map for dockerPipeline method

  def params = [:]
  // Jenkins build parameters
  params.imageUploadMode = imageUploadMode
  params.failIfReleaseExists = failIfReleaseExists

  // Common variables to parameters
  params.awsProfile     = env.AWS_PROFILE
  params.octopusChannel = env.OCTOPUS_CHANNEL
  params.deployEnv      = env.DEPLOY_ENV

  // Parameters for octopus deploy and ECR
  if (projectName == '') {
    params.projectName = projectPath.split('/')[-1]
  }
  else {
    params.projectName = projectName
  }

  params.octopusProject = "${projectGroup}.${params.projectName.replace('_','-')}"
  params.workDir        = "${env.WORKSPACE}/${projectPath}"
  if (ecrRepoSubfolder == '') {
    params.ecrRepository = "${projectGroup}/${params.projectName.replace('_','-')}"
  } else {
    params.ecrRepository = "${projectGroup}/${ecrRepoSubfolder}/${params.projectName.replace('_','-')}"
  }
  params.registry = "${ecr}/${params.ecrRepository}"
  params.version  = octopus.getVersion(env.BRANCH_NAME,params.workDir)

  return params
}

// Liquibase deployment is triggered only for master branch
def getStage(jenkinsParams, name, path) {
  return {
    stage(name){
      def runTests           = checkBranchConditions(jenkinsParams.RUN_TESTS)
      def triggerDeploy      = checkBranchConditions(jenkinsParams.TRIGGER_DEPLOY)

      if (runTests) {
        liquibaseTestPipeline(
          setLiquibasePipelineVars(path)
        )
        if (triggerDeploy) {
          pythonPackage_v2.dockerPipeline(
            setDockerPipelineParams(
              jenkinsParams.IMAGE_UPLOAD_MODE,
              jenkinsParams.SKIP_RELEASE_CREATION,
              path, env.PROJECT_GROUP, env.ECR,
              '', name
            )
          )
        }
        else {
          echo "Triggering deployment has been skipped."
        }
      } else {
        echo "Tests and all subsequent steps have been skipped."
      }
    }
  }
}

//monorepo parallel job invocations
def prepareLiquibaseBuildStages(jenkinsParams, stageJobList, buildJobList, branchId) {
  def stagesMap = [:]
  stageJobList.each{
    stagesMap.put(it, getLiquibaseRunJobStage(jenkinsParams, it, buildJobList, branchId))
  }
  return stagesMap
}

//monorepo parallel job invocations
def getLiquibaseRunJobStage(jenkinsParams, job, buildJobList, branchId) {
  return {
    stage(job) {
      if (buildJobList.contains(job)) {
        build job: "${job}/${branchId}",
          parameters: [
            string(name: 'RUN_TESTS', value: "yes"),
            string(name: 'TRIGGER_DEPLOY', value: "${jenkinsParams.TRIGGER_DEPLOY}"),
            string(name: 'DEPLOY_ENV_CHOICE', value: "${jenkinsParams.DEPLOY_ENV_CHOICE}"),
            string(name: 'IMAGE_UPLOAD_MODE', value: "${jenkinsParams.IMAGE_UPLOAD_MODE}"),
            string(name: 'FAIL_IF_RELEASE_EXISTS', value: "${jenkinsParams.FAIL_IF_RELEASE_EXISTS}")
          ]
      }
      else {
        println "Skipping stage ${job}"
      }
    }
  }
}
