/*
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY, either express or
  implied.
  See the License for the specific language governing permissions and
  limitations under the License.
*/

def DEFAULT_MODULE_NAME = 'devops'

pipeline {
  agent { label 'pool' }
  options { disableConcurrentBuilds() }
  parameters {
    // Core Gerrit / multibranch inputs
    string(name: 'GERRIT_BRANCH', defaultValue: env.BRANCH_NAME ?: 'master', description: '')
    string(name: 'GERRIT_PROJECT', defaultValue: 'osm/devops', description: '')
    string(name: 'GERRIT_REFSPEC', defaultValue: env.GERRIT_REFSPEC ?: '', description: '')
    string(name: 'GERRIT_PATCHSET_REVISION', defaultValue: env.GERRIT_PATCHSET_REVISION ?: '', description: '')
    string(name: 'DOCKER_ARGS', defaultValue: '', description: 'Extra docker args for docker run')

    // E2E test parameters
    string(name: 'OPENSTACK_BASE_IMAGE', defaultValue: 'ubuntu24.04', description: '')
    string(name: 'OPENSTACK_OSM_FLAVOR', defaultValue: 'osm.sanity', description: '')
    string(name: 'MODULE_NAME', defaultValue: 'devops', description: 'Name of the module under test')

    // Pipeline control flags
    booleanParam(name: 'DO_INSTALL', defaultValue: true, description: '')
    booleanParam(name: 'DO_DOCKERPUSH', defaultValue: true, description: '')
    booleanParam(name: 'DO_ROBOT', defaultValue: true, description: '')
    booleanParam(name: 'SAVE_CONTAINER_ON_FAIL', defaultValue: false, description: '')
    booleanParam(name: 'SAVE_CONTAINER_ON_PASS', defaultValue: false, description: '')

    // Docker image configuration
    string(name: 'IMAGENAME', defaultValue: 'opensourcemano/devops', description: 'Image name for publish (reserved)')
  }
  environment {
    MDG = "${params.GERRIT_PROJECT?.contains('/') ? params.GERRIT_PROJECT.split('/')[1] : params.GERRIT_PROJECT}"
    CONTAINER_NAME = "${params.GERRIT_PROJECT}-${params.GERRIT_BRANCH}".toLowerCase()
    TEST_IMAGE = 'overdrive3000/tox-osm:v1.6'
    DOCKER_REGISTRY = 'osm.etsi.org:5050/devops/cicd/'
  }
  stages {
    stage('Prepare') { steps { sh 'env' } }

    stage('Checkout') {
      steps {
        checkout scm
        script {
          sh "git fetch --tags"
          if (params.GERRIT_REFSPEC?.trim()) { sh "git fetch origin ${params.GERRIT_REFSPEC}" }
          if (params.GERRIT_PATCHSET_REVISION?.trim()) { sh "git checkout -f ${params.GERRIT_PATCHSET_REVISION}" }
          sh "sudo git clean -dfx || git clean -dfx"
        }
      }
    }

    stage('License Scan') {
      steps {
        script {
          def isMergeJob = env.JOB_NAME?.contains('merge')
          if (!isMergeJob) { sh 'devops/tools/license_scan.sh' } else { echo 'skip the scan for merge' }
        }
      }
    }

    stage('Prepare Test Image') {
      steps {
        script {
          // Use shared test image from registry; no local build needed
          sh "docker pull ${env.TEST_IMAGE} || true"
        }
      }
    }

    stage('Tests') {
      steps {
        script {
          def UID = sh(returnStdout: true, script: 'id -u').trim()
          def GID = sh(returnStdout: true, script: 'id -g').trim()
          def common = "-v ${env.WORKSPACE}:/tests -e UID=${UID} -e GID=${GID} " + (params.DOCKER_ARGS ?: '')

          stage('Helm Tests') {
            sh """
              docker run --rm ${common} \
                ${env.TEST_IMAGE} \
                /tests/devops-stages/stage-test.sh
            """
            if (fileExists('coverage.xml')) { cobertura coberturaReportFile: 'coverage.xml' }
            if (fileExists('nosetests.xml')) { junit 'nosetests.xml' }
          }

          stage('Changelog') {
            sh 'mkdir -p changelog'
            sh """
              docker run --rm ${common} \
                ${env.TEST_IMAGE} \
                /bin/sh -lc 'devops/tools/generatechangelog-pipeline.sh > /tests/changelog/changelog-${MDG}.html'
            """
          }
        }
      }
    }

    stage('Build & Push Image') {
      when { expression { return params.DO_DOCKERPUSH } }
      steps {
        script {
          def moduleName = (env.MDG ?: DEFAULT_MODULE_NAME).toLowerCase()

          if (!params.GERRIT_BRANCH) {
            error 'GERRIT_BRANCH is required to tag the Docker image'
          }
          def sanitizedBranchName = params.GERRIT_BRANCH
            .toLowerCase()
            .replaceAll('[^a-z0-9._-]', '-')
          def baseTagPrefix = "osm-${sanitizedBranchName}"
          def buildNumber = env.BUILD_NUMBER ?: '0'
          def isMergeJob = env.JOB_NAME?.contains('merge')
          // Remove promotion logic from this stage
          def moduleTags = []
          if (isMergeJob) {
            moduleTags << "${baseTagPrefix}-merge"
          } else {
            moduleTags << "${baseTagPrefix}-patchset-${buildNumber}"
          }

          def imageName = params.IMAGENAME ?: "opensourcemano/${moduleName}"
          def primaryLocalImage = "${imageName}:${moduleTags[0]}"

          withCredentials([[$class: 'UsernamePasswordMultiBinding', credentialsId: 'gitlab-registry',
                            usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD']]) {
            sh """
              docker build -f Dockerfile -t ${primaryLocalImage} .
            """
            sh "docker login ${env.DOCKER_REGISTRY.split('/')[0]} -u ${USERNAME} -p ${PASSWORD}"
            // Push build-scope tag(s) only. Promotion happens after tests.
            moduleTags.each { tag ->
              def localImage = "${imageName}:${tag}"
              def remoteImage = "${env.DOCKER_REGISTRY}${imageName}:${tag}"
              sh "docker tag ${localImage} ${remoteImage}"
              sh "docker push ${remoteImage}"
            }
            // Stash the built image id for later promotion without rebuild
            env.BUILT_IMAGE = primaryLocalImage
            env.BUILT_TAG = moduleTags[0]
          }
        }
      }
    }

    stage('E2E Test (robot)') {
      when { expression { return params.DO_ROBOT && !env.JOB_NAME.contains('merge') } }
      steps {
        script {
          def dowstreamJob = "osm-e2e/${params.GERRIT_BRANCH ?: 'master'}"
          build job: dowstreamJob,
            parameters: [
              string(name: 'GERRIT_BRANCH', value: params.GERRIT_BRANCH ?: 'master'),
              string(name: 'GERRIT_REFSPEC', value: params.GERRIT_REFSPEC ?: ''),
              string(name: 'OPENSTACK_BASE_IMAGE', value: params.OPENSTACK_BASE_IMAGE),
              string(name: 'OPENSTACK_OSM_FLAVOR', value: params.OPENSTACK_OSM_FLAVOR),
              string(name: 'MODULE_NAME', value: params.MODULE_NAME ?: 'devops'),
              string(name: 'CONTAINER_NAME', value: env.BUILT_TAG),
              booleanParam(name: 'DO_ROBOT', value: params.DO_ROBOT),
              booleanParam(name: 'DO_INSTALL', value: params.DO_INSTALL),
              booleanParam(name: 'SAVE_CONTAINER_ON_FAIL', value: params.SAVE_CONTAINER_ON_FAIL),
              booleanParam(name: 'SAVE_CONTAINER_ON_PASS', value: params.SAVE_CONTAINER_ON_PASS)
            ]
        }
      }
    }
  }

  post {
    always {
      // cleanWs()
      deleteDir()
    }
  }
}

