pipeline {
  agent any

  parameters {
    choice(name: 'SERVICE', choices: ['postgres', 'seaweedfs', 'ollama', 'keycloak', 'vllm', 'all'], description: 'Service to build/deploy')
    choice(name: 'ENV', choices: ['dev', 'preprod', 'prod'], description: 'Target environment / namespace')
    choice(name: 'ACTION', choices: ['build', 'deploy', 'build-and-deploy'], description: 'Pipeline action')
    booleanParam(name: 'USE_PUBLIC_IMAGES', defaultValue: false, description: 'Use values-public.yaml (only for lab smoke tests; false in closed loop)')
    string(name: 'REGISTRY', defaultValue: '192.168.10.68:5000', description: 'Internal registry for push/tag')
    string(name: 'KUBE_CONTEXT', defaultValue: '', description: 'Optional override; default lab-cluster-<ENV>')
    string(name: 'GIT_BASE_URL', defaultValue: 'http://192.168.10.68:7990/bbadmin', description: 'Bitbucket project base URL without trailing slash')
    string(name: 'GIT_BRANCH', defaultValue: 'main', description: 'Branch to build/deploy')
  }

  environment {
    PATH = "/home/ubuntu/bin:${env.HOME}/bin:/usr/local/bin:${env.PATH}"
    KUBECONFIG = "/home/ubuntu/kube-deploy.config"
    NELM_SECRET_KEY = credentials('nelm-secret-key')
    BITBUCKET_GIT = credentials('bitbucket-git')
  }

  options {
    timestamps()
    disableConcurrentBuilds()
  }

  stages {
    stage('Checkout from Bitbucket') {
      steps {
        script {
          def services = params.SERVICE == 'all' ? ['postgres', 'seaweedfs', 'ollama', 'keycloak', 'vllm'] : [params.SERVICE]
          env.SERVICES = services.join(' ')
          env.REPOS_DIR = "${env.WORKSPACE}/repos"
          withEnv([
            "GIT_BASE_URL=${params.GIT_BASE_URL}",
            "GIT_BRANCH=${params.GIT_BRANCH}",
            "SERVICES=${env.SERVICES}",
            "DEST=${env.REPOS_DIR}",
            "GIT_USER=${env.BITBUCKET_GIT_USR}",
            "GIT_TOKEN=${env.BITBUCKET_GIT_PSW}",
            "GIT_SSL_NO_VERIFY=1"
          ]) {
            sh 'bash jenkins/checkout-repos.sh'
          }
        }
      }
    }

    stage('Build') {
      when {
        expression { params.ACTION == 'build' || params.ACTION == 'build-and-deploy' }
      }
      steps {
        script {
          load "${env.WORKSPACE}/jenkins/build.groovy"
          env.SERVICES.split(' ').each { svc ->
            buildService(svc, params.REGISTRY, params.ENV, env.REPOS_DIR)
          }
        }
      }
    }

    stage('Deploy') {
      when {
        expression { params.ACTION == 'deploy' || params.ACTION == 'build-and-deploy' }
      }
      steps {
        script {
          load "${env.WORKSPACE}/jenkins/deploy.groovy"
          env.SERVICES.split(' ').each { svc ->
            deployService(svc, params.ENV, params.USE_PUBLIC_IMAGES, params.KUBE_CONTEXT, env.REPOS_DIR)
          }
        }
      }
    }
  }

  post {
    always {
      echo "Done: SERVICE=${params.SERVICE} ENV=${params.ENV} ACTION=${params.ACTION} BRANCH=${params.GIT_BRANCH}"
    }
  }
}
