/*
  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 = 'opensourcemano/devops:19.0'
    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.DOCKER_REGISTRY}${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.DOCKER_REGISTRY}${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.DOCKER_REGISTRY}${env.TEST_IMAGE} \
                /bin/sh -lc 'cd /tests; tools/generatechangelog-pipeline.sh > changelog/changelog-${MDG}.html'
            """
          }
        }
      }
    }

    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: "not-used-from-devops-pipeline"),
              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()
    }
  }
}

