pipeline {
    agent none
    parameters {
        string(name: 'REDMINE_VERSION', description: 'The release note will be based on the tickets tagged with the given target version.', trim: true)
        string(name: 'RELEASE_NUMERIC_PREFIX', description: """
The numeric prefix of the release (like 2018.16).
For example for:
- for Gaia.18 it is 2021.07
- for 2022.06 it is 2022.06
- for Helios.05 it is 2021.15
- ...
""", trim: true)
        string(name: 'LTS_BRANCH', description: 'Technical name of the LTS branch (e.g. 2022.10, 2023.10, or master)')
        choice(name: 'RELEASE_TYPE', choices: ['IV', 'BUGFIX'], description: 'Select the type of release')
        string(name: 'SOURCE_RELEASE', description: """
This is the source release (debian packages) that will be used as the source of the new release (same as SOURCE parameter of the job ). For example xivo-2024.10-latest

If RELEASE_TYPE is BUGFIX: this parameter is optional. It will be constructed from RELEASE_NUMERIC_PREFIX.
Otherwise, if RELEASE_TYPE is IV : set it to the last previous Intermediate Version that was released (this IV may be an LTS) : if you're building 2024.11 it should be xivo-2024.10-latest.
""", trim: true)
    }
    stages {
        stage('build-release-notes') {
            agent any
            steps {
                build(
                    job: 'release-note',
                    parameters: [
                        string(name: 'REDMINE_VERSION', value: "${REDMINE_VERSION}"),
                        string(name: 'RELEASE_NUMERIC_PREFIX', value: "${RELEASE_NUMERIC_PREFIX}")],
                    wait: true
                )
                script {
                    def map = readProperties  file: '/var/lib/jenkins/workspace/release-note/TAGGED_PROJECTS'
                    DOCKER_PROJECTS = "${map['DOCKER_PROJECTS']}"
                    DEBIAN_PROJECTS = "${map['DEBIAN_PROJECTS']}"
                }
            }
        }
        stage('build-docker') {
            steps {
                script {
                    switch(params.RELEASE_TYPE) {
                        case 'BUGFIX':
                            build(
                                job: 'docker-images-rc-build-process',
                                parameters: [
                                    string(name: 'RELEASE', value: "${REDMINE_VERSION.substring(0,10)}"),
                                    string(name: 'DOCKER_LIST', value: "${DOCKER_PROJECTS}"),
                                    string(name: 'LTS_BRANCH', value: "${LTS_BRANCH}")
                                ]
                            )
                            break
                        case 'IV':
                            build(
                                job: 'build-all-docker-images',
                                parameters: [
                                    string(name: 'BRANCH_OR_TAG', value: "${LTS_BRANCH}"),
                                    string(name: 'MM_BRANCH_OR_TAG', value: "${LTS_BRANCH == 'master' ? 'xivo-master' : LTS_BRANCH}"),
                                    string(name: 'BUILD_MODE', value: "rc")
                                ]
                            )
                            break
                        default:
                            error("Invalid RELEASE_TYPE: ${params.RELEASE_TYPE}")
                    }
                }
            }
        }
        stage('build-debian') {
            steps {
                script {
                    def DEBIAN_PROJECTS_WITHOUT_ASTERISK = DEBIAN_PROJECTS.split(',').findAll { it.trim() != 'asterisk' }.join(',')

                    if (DEBIAN_PROJECTS_WITHOUT_ASTERISK) {
                        switch(params.RELEASE_TYPE) {
                            case 'BUGFIX':
                                build(
                                    job: 'debian-packages-rc-build-process',
                                    parameters: [
                                        string(name: 'RELEASE', value: "${REDMINE_VERSION.substring(0,10)}"),
                                        string(name: 'PACKAGER_LIST', value: "${DEBIAN_PROJECTS_WITHOUT_ASTERISK}"),
                                        string(name: 'SOURCE', value: "xivo-${RELEASE_NUMERIC_PREFIX}-latest")
                                    ]
                                )
                                break
                            case 'IV':
                                if (SOURCE_RELEASE == "") {
                                    error("SOURCE_RELEASE cannot be empty for RELEASE_TYPE IV")
                                }
                                build(
                                    job: 'debian-packages-rc-build-process',
                                    parameters: [
                                        string(name: 'RELEASE', value: "${REDMINE_VERSION.substring(0,10)}"),
                                        string(name: 'PACKAGER_LIST', value: "${DEBIAN_PROJECTS_WITHOUT_ASTERISK}"),
                                        string(name: 'SOURCE', value: "${SOURCE_RELEASE}")
                                    ]
                                )
                                break
                            default:
                                error("Invalid RELEASE_TYPE: ${params.RELEASE_TYPE}")
                        }
                    } else {
                        echo "No projects to build. Skipping build stage."
                    }
                }
            }
        }
        stage('daily-tests') {
            steps {
                script {
                    def versionToCompare = "2023.05.12"
                    def currentVersion = REDMINE_VERSION.substring(0,10)

                    if (currentVersion >= versionToCompare) {
                        build(
                            job: 'daily-tests',
                            parameters: [
                                string(name: 'VERSION', value: currentVersion)
                            ]
                        )
                    } else {
                        echo "Skipping daily-tests as version ${currentVersion} is older than ${versionToCompare}"
                    }
                }
            }
        }
    }
}
