pipeline {
    agent any

    parameters {
        // ── 版本升级策略 ─────────────────────────────────────────────────────
        choice(name: 'VERSION_BUMP', choices: ['patch', 'minor', 'major'],
               description: '版本升级策略: major(1.0.0→2.0.0), minor(1.0.0→1.1.0), patch(1.0.0→1.0.1)')

        // 要构建并发布的模块（勾选即发布）
        booleanParam(name: 'MOD_CORE',    defaultValue: false, description: '发布 sdk-core')
        booleanParam(name: 'MOD_IM',      defaultValue: false, description: '发布 sdk-im')
        booleanParam(name: 'MOD_PUSH',    defaultValue: false, description: '发布 sdk-push')
        booleanParam(name: 'MOD_UPDATE',  defaultValue: false, description: '发布 sdk-update')
        booleanParam(name: 'MOD_WEBVIEW', defaultValue: false, description: '发布 sdk-webview')
        booleanParam(name: 'MOD_LICENSE', defaultValue: false, description: '发布 sdk-license')
    }

    environment {
        NEXUS_CREDS = credentials('NEXUS_CREDS')
    }

    stages {
        stage('Checkout') {
            steps {
                checkout([
                    $class: 'GitSCM',
                    branches: [[name: 'main']],
                    extensions: [[$class: 'CleanBeforeCheckout']],
                    userRemoteConfigs: scm.userRemoteConfigs
                ])
                script {
                    def moduleChecks = [
                        'sdk-core':    params.MOD_CORE,
                        'sdk-im':      params.MOD_IM,
                        'sdk-push':    params.MOD_PUSH,
                        'sdk-update':  params.MOD_UPDATE,
                        'sdk-webview': params.MOD_WEBVIEW,
                        'sdk-license': params.MOD_LICENSE,
                    ]
                    def resolved = moduleChecks.findAll { k, v -> v }.collect { k, v -> k }
                    if (resolved.isEmpty()) {
                        error("没有选择任何模块，请至少勾选一个")
                    }
                    env.PUBLISH_MODULES = resolved.join(',')
                    echo "Modules: ${env.PUBLISH_MODULES}"
                }
            }
        }

        stage('Resolve Versions') {
            steps {
                script {
                    def bumpVersion = { String ver ->
                        def parts = ver.tokenize('.')
                        while (parts.size() < 3) { parts.add('0') }
                        def major = parts[0].toInteger()
                        def minor = parts[1].toInteger()
                        def patch = parts[2].toInteger()

                        if (params.VERSION_BUMP == 'major') { major++; minor = 0; patch = 0 }
                        else if (params.VERSION_BUMP == 'minor') { minor++; patch = 0 }
                        else { patch++ }

                        return "${major}.${minor}.${patch}"
                    }

                    def propsText = readFile('gradle.properties')
                    def getProp = { String key ->
                        def line = propsText.readLines().find { it.trim().startsWith("${key}=") }
                        return line ? line.split('=', 2)[1].trim() : null
                    }
                    def setProp = { String key, String value ->
                        def pattern = /(?m)^${key}=.*/
                        if (propsText =~ pattern) {
                            propsText = propsText.replaceAll(pattern, "${key}=${value}")
                        } else {
                            propsText = propsText.trim() + "\n${key}=${value}\n"
                        }
                    }

                    def modules = env.PUBLISH_MODULES.split(',').toList()
                    def versionArgs = []
                    def publishedVersions = []

                    for (mod in modules) {
                        def propName = "SDK_${mod.replace('sdk-', '').toUpperCase()}_VERSION"
                        def currentVer = getProp(propName) ?: getProp('PUBLISH_VERSION') ?: '0.1.0'
                        def newVer = bumpVersion(currentVer)

                        setProp(propName, newVer)
                        versionArgs.add("-P${propName}=${newVer}")
                        publishedVersions.add("${mod}: ${currentVer} → ${newVer}")
                        echo "${mod} version: ${currentVer} → ${newVer}"
                    }

                    writeFile(file: 'gradle.properties', text: propsText)
                    env.VERSION_ARGS = versionArgs.join(' ')
                    env.PUBLISHED_VERSIONS = publishedVersions.join('\n')
                    echo "VERSION_ARGS: ${env.VERSION_ARGS}"
                }
            }
        }

        stage('Build AARs') {
            steps {
                script {
                    def modules = env.PUBLISH_MODULES.split(',').toList()
                    def moduleTasks = modules.collect { ":${it}:assembleRelease" }.join(' ')
                    bat "gradlew.bat ${moduleTasks} ${env.VERSION_ARGS} --no-daemon"
                }
            }
        }

        stage('Publish to Nexus') {
            steps {
                script {
                    def modules = env.PUBLISH_MODULES.split(',').toList()
                    def publishTasks = modules.collect { ":${it}:publish" }.join(' ')
                    def credArgs = "-PNEXUS_USER=%NEXUS_CREDS_USR% -PNEXUS_PASSWORD=%NEXUS_CREDS_PSW%"
                    bat "gradlew.bat ${publishTasks} ${env.VERSION_ARGS} ${credArgs} --no-daemon"
                }
            }
        }

        stage('Commit Version Bump') {
            steps {
                script {
                    bat """
                        git config user.email "jenkins@xuqm.com"
                        git config user.name "Jenkins CI"
                        git add gradle.properties
                        git diff --cached --quiet || git commit -m "ci: bump module versions [${env.PUBLISH_MODULES}]"
                        git push origin HEAD:main
                    """
                }
            }
        }
    }

    post {
        success {
            echo "Android SDK 构建成功"
            echo "发布版本:\n${env.PUBLISHED_VERSIONS}"
        }
        failure { echo "Android SDK 构建失败" }
    }
}
