@Library('infraLib') _
def getEnvPrefixByBranch(branch) {
  switch(branch) {
    case "master":
      return "prod"
    case "release":
      return "stage"
    case "develop":
      return "dev"
    case "qa":
      return "qa"
    default:
      return "NULL"
  }
}

pipeline {
  agent {
    label 'linux-agents'
  }
  options { disableConcurrentBuilds() }
  environment {
    AWS_PROFILE             = "sme-dev"
    PROJECT_GROUP           = "delphi"
    ECR                     = "475275892927.dkr.ecr.us-east-1.amazonaws.com"
    OCTOPUS_CLI_SERVER      = "https://octopus.delphi.zone"
    OCTOPUS_CLI_API_KEY     = sh(script: "aws secretsmanager get-secret-value --profile sme-dev --secret-id 'infra/jenkins/octopus_api_key' --output json | jq .SecretString | tr -d '\"'", , returnStdout: true).trim()
    OCTOPUS_CHANNEL         = octopus.setOctoChannel(env.BRANCH_NAME)
    DEPLOY_ENV              = octopus.setDeploymentEnv(params.DEPLOY_ENV_CHOICE, env.PROJECT_GROUP, env.BRANCH_NAME )
    ZIP_PACKAGE_UPLOAD_MODE = octopus.zipPackageUploadMode(params.ZIP_PACKAGE_UPLOAD_MODE)
    NOTIFICATIONS_CHANNEL   = "delphi-slz-cicd-alerts"
  }
  parameters {
    choice(
      choices: [
        'Please make a choice',
        'slz_db_schema',
        'db_schema',
        'ALL'
      ],
      description: 'Force build all or some modules',
      name: 'FORCE_BUILD'
    )
    choice(
      choices: [
        'default',
        'yes',
        'no',
      ],
      description: 'Whether to build python package. By default it\'s only build for develop, release* and master branches.',
      name: 'BUILD_PYTHON_PACKAGE'
    )
    choice(
      choices: [
        'error',
        'overwrite',
        'ignore'
      ],
      description: 'Defines whether to raise error, overwrite or ignore if python package of specified version already exists in Pypi.',
      name: 'PYTHON_PACKAGE_UPLOAD_MODE'
    )
    choice(
      choices: [
        'default',
        'yes',
        'no',
      ],
      description: '''Whether to trigger deployment pipeline(build deployment artifact, create octopus release, deploy it).
      By default it\'s only triggered for master branch.
      ''',
      name: 'TRIGGER_DEPLOY'
    )
    choice(
      choices: [
        'default',
        'dev',
        'qa',
        'stage',
        'skip_deployment'
      ],
      description: 'Set environment for deployment. Skipped by default master/release*, dev by default for all other branches',
      name: 'DEPLOY_ENV_CHOICE'
    )
    choice(
      choices: [
        'error',
        'overwrite',
        'skip_build'
      ],
      description: "Docker image upload mode - ovewrite if the image with such tag already exists, raise error if exists, or skip build part if exists.",
      name: 'IMAGE_UPLOAD_MODE'
    )
    choice(
      choices: [
        'no',
        'yes'
      ],
      description: "Don't raise errors in case release already exists",
      name: 'SKIP_RELEASE_CREATION'
    )
  }
  stages {
    stage("Liquibase stages") {
      steps {
        script {
          stagesMap = [
            [ path: "liquibase", name: "slz_db_schema" ],
          ]
          stagesList = liquibasePackage.generateStages(params, stagesMap)
          parallel(stagesList)
        }
      }
    }
    stage("Generic parallel stages") {
      steps {
        script {
          stagesMap = [
            [ type: "lib", path: "db_schema" ],
          ]
          stagesList = pythonPackage.generateStages(params, stagesMap)
          parallel(stagesList)
        }
      }
    }
  }
  post {
    always {
      sh "sudo chown -R ec2-user:ec2-user ${env.WORKSPACE}"
    }
    success {
      script {
        if (currentBuild.getPreviousBuild() &&
            currentBuild.getPreviousBuild().getResult().toString() != "SUCCESS") {
          utility.slackNotifyMainBranches(currentBuild.currentResult, env.NOTIFICATIONS_CHANNEL)
        }
      }
    }
    failure {
      script {
        utility.slackNotifyMainBranches(currentBuild.currentResult, env.NOTIFICATIONS_CHANNEL)
      }
    }
    cleanup {
        deleteDir()
    }
  }
}
