pipeline {
  agent {
    docker {
      image 'lifemaps/ci-cpp:latest'
      reuseNode true
      args '-u root:root'
    }
  }

  options {
    timestamps()
    disableConcurrentBuilds()
  }

  environment {
    PROJECT_DIR = "qt6-after/qt6-migrated-benchmark"
    BUILD_DIR = "build"
    COVERAGE_BUILD_DIR = "build-coverage"
    CHANGE_TARGET = "${env.CHANGE_TARGET ?: 'origin/main'}"
    QT_QPA_PLATFORM = "offscreen"
    LANG = "C.UTF-8"
    LC_ALL = "C.UTF-8"
  }

  stages {
    stage('Checkout') {
      steps {
        checkout scm
        sh 'git fetch --all --prune'
        sh 'git submodule update --init --recursive || true'
      }
    }

    stage('Tool Versions') {
      steps {
        sh '''
          python3 --version
          cmake --version
          ninja --version
          g++ --version
        '''
      }
    }

    stage('Qt Diagnostics') {
      steps {
        sh '''
          echo "QT_QPA_PLATFORM=$QT_QPA_PLATFORM"
          echo "LANG=$LANG"
          echo "LC_ALL=$LC_ALL"
          dpkg -l | grep -E "qt6-base-dev|qtbase5-dev|qt6-tools" || true
          pkg-config --list-all | grep -i qt || true
        '''
      }
    }

    stage('Policy Checks') {
      steps {
        sh 'python3 ci/check_pr_policies.py'
      }
    }

    stage('Configure') {
      steps {
        sh 'cmake -S ${PROJECT_DIR} -B ${BUILD_DIR} -G Ninja -DCMAKE_BUILD_TYPE=Debug'
      }
    }

    stage('Build') {
      steps {
        sh 'cmake --build ${BUILD_DIR} --parallel'
      }
    }

    stage('Test') {
      steps {
        sh 'QT_QPA_PLATFORM=offscreen LANG=C.UTF-8 LC_ALL=C.UTF-8 ctest --test-dir ${BUILD_DIR} --output-on-failure'
      }
    }

    stage('Coverage') {
      when {
        expression {
          return env.BRANCH_NAME ==~ /main|master|coverage.*/
        }
      }
      steps {
        echo "Running coverage collection..."
        sh '''
          ${PROJECT_DIR}/scripts/collect-coverage.sh ${WORKSPACE}/${COVERAGE_BUILD_DIR}
        '''
      }
      post {
        always {
          publishCoverage adapters: [lcovAdapter(mergeToOneReport: true, reportFile: 'coverage/lcov.info')],
                        sourceFileResolver: sourceFiles('STORE_LAST_BUILD')
        }
      }
    }
  }

  post {
    always {
      script {
        if (getContext(hudson.FilePath)) {
          cleanWs deleteDirs: true, disableDeferredWipeout: true
        }
      }
    }
  }
}
