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, skipReleaseCreation, 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.skipReleaseCreation = skipReleaseCreation

  // 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, stageParams) {
  return {
    stage(stageParams.name){
      def testPipelineFlag = pythonPackage.stageFlags(jenkinsParams.FORCE_BUILD, stageParams).testPipelineFlag
      def mainPipelineFlag = pythonPackage.stageFlags(jenkinsParams.FORCE_BUILD, stageParams).mainPipelineFlag
      if (testPipelineFlag) {
        liquibaseTestPipeline(
          setLiquibasePipelineVars(stageParams.path)
        )
        if (stageParams.triggerDeploy && mainPipelineFlag) {
          pythonPackage.dockerPipeline(
            setDockerPipelineParams(
              jenkinsParams.IMAGE_UPLOAD_MODE,
              jenkinsParams.SKIP_RELEASE_CREATION,
              stageParams.path, env.PROJECT_GROUP, env.ECR,
              '', stageParams.name
            )
          )
        }
      } else {
        echo "Step skipped due to conditions."
      }
    }
  }
}

def generateStages(jenkinsParams, stagesParamList) {
  // Test always, deploy only if master branch and special conditions
  // if parameters are explicitly set to yes or no, sets flag accordingly.
  testAll = true
  triggerDeploy = checkBranchConditions(jenkinsParams.TRIGGER_DEPLOY)

  stagesMap = [:]

  stagesParamList.each {
    def stageParams    = [:]
    stageParams.testAll            = testAll
    stageParams.triggerDeploy      = triggerDeploy
    stageParams.name               = it.name
    stageParams.path               = it.path
    stagesMap.put(stageParams.name, getStage(jenkinsParams,stageParams))
  }
  return stagesMap
}
