@Library('eo-jenkins-lib@main') import eo.Utils

pipeline {
    agent any
    options {
        disableConcurrentBuilds()
        timeout(time: 30, unit: 'MINUTES')
    }
    environment {
        max = 100000
        RAND_TEST = "${Math.abs(new Random().nextInt(max+1))}"
    }
    triggers {
        cron(BRANCH_NAME == 'main' ? 'H H(0-7) * * *' : '')
    }
    stages {
        stage('Tests (in parallel)') {
            parallel {
                stage('Unit Tests (pytest)') {
                    steps {
                        sh "RAND_TEST=${env.RAND_TEST} nox -e tests"
                    }
                    post {
                        always {
                            script {
                                def utils = new Utils()
                                utils.publish_coverage('coverage.xml')
                                utils.publish_coverage_native()
                                utils.publish_diff_cover()
                                utils.display_diff_cover_status()
                            }
                            mergeJunitResults()
                        }
                    }
                }
                stage('Unit Tests (vitest)') {
                    steps {
                        sh "RAND_TEST=${env.RAND_TEST} nox -e js_tests"
                    }
                }
                stage('Codestyle') {
                    steps {
                        sh "RAND_TEST=${env.RAND_TEST} nox -e codestyle"
                    }
                }
                stage('Linter (pylint)') {
                    steps {
                        sh "RAND_TEST=${env.RAND_TEST} nox -e pylint"
                    }
                    post {
                        always {
                            script {
                                def utils = new Utils()
                                utils.publish_pylint('pylint.out')
                            }
                        }
                    }
                }
                stage('Checker (check-manifest)') {
                    steps {
                        sh "nox -e check_manifest"
                    }
                }
                stage('Checker (check-migrations)') {
                    steps {
                        sh "nox -e check_migrations"
                    }
                }
            }
        }
        stage('Packaging') {
            steps {
                script {
                    env.SHORT_JOB_NAME=sh(
                        returnStdout: true,
                        // given JOB_NAME=gitea/project/PR-46, returns project
                        // given JOB_NAME=project/main, returns project
                        script: '''
                            echo "${JOB_NAME}" | sed "s/gitea\\///" | awk -F/ '{print $1}'
                        '''
                    ).trim()
                    if (env.GIT_BRANCH == 'main' || env.GIT_BRANCH == 'origin/main') {
                        sh "sudo -H -u eobuilder /usr/local/bin/eobuilder -d bookworm,trixie ${SHORT_JOB_NAME}"
                    } else if (env.GIT_BRANCH.startsWith('hotfix/')) {
                        sh "sudo -H -u eobuilder /usr/local/bin/eobuilder -d bookworm,trixie --branch ${env.GIT_BRANCH} --hotfix ${SHORT_JOB_NAME}"
                    }
                }
            }
        }
    }
    post {
        always {
            script {
                def utils = new Utils()
                utils.mail_notify(currentBuild, env, 'ci+jenkins-passerelle@entrouvert.org')
            }
        }
        success {
            cleanWs()
        }
    }
}
