/*
  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 '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()
    }
  }
}

