// 新增带返回值的跨平台 PowerShell 执行函数
def runPowerShellWithOutput(script) {
    try { 
        if (isUnix()) {
            // Unix 系统使用 sh 执行命令
            return sh(script: "${script}", returnStdout: true).trim()
        } else {
            // Windows 系统优先使用 PowerShell 7 (pwsh)，失败时回退到 PowerShell 5
            try {
                return bat(script: "pwsh -NoProfile -Command \"${script}\"", returnStdout: true).trim()
            } catch (Exception pwshError) {
                echo "⚠️ PowerShell 7 (pwsh) 执行失败，尝试使用 PowerShell 5: ${pwshError.message}"
                return bat(script: "powershell -NoProfile -Command \"${script}\"", returnStdout: true).trim()
            }
        }
    } catch (Exception e) {
        echo "执行 PowerShell 脚本失败: ${e.message}"
        throw e
    }
}

/**
 * 获取 Git 提交信息（统一函数，修复 PowerShell 中 % 转义问题）
 * @param commitHash 可选，指定 commit hash，默认使用最新提交
 * @return Map [author, message, email, bugId]
 */
def getGitCommitInfo(commitHash = '') {
    def result = [
        author: '',
        message: '',
        email: '',
        bugId: ''
    ]
    
    // 确定使用哪个 commit
    def commitArg = commitHash ? "${commitHash}" : "-1"
    def gitCmdPrefix = "git log ${commitArg} --pretty="
    
    // Windows PowerShell 中 % 是特殊字符，需要用单引号避免变量展开
    // 使用 sh -c 在 Windows 上也能工作
    def cmdAuthor = isUnix() ? "${gitCmdPrefix}%an" : "sh -c '${gitCmdPrefix}%an'"
    def cmdMessage = isUnix() ? "${gitCmdPrefix}%B" : "sh -c '${gitCmdPrefix}%B'"
    def cmdEmail = isUnix() ? "${gitCmdPrefix}%ae" : "sh -c '${gitCmdPrefix}%ae'"
    
    try {
        // 获取作者
        def authorResult = runCommandWithOutput(cmdAuthor)
        if (authorResult.success) {
            result.author = authorResult.stdout
        }
        
        // 获取提交信息
        def msgResult = runCommandWithOutput(cmdMessage)
        if (msgResult.success) {
            result.message = msgResult.stdout
            // 提取 Bug ID
            def matcher = (result.message =~ /#[0-9]+/)
            result.bugId = matcher ? matcher[0] : "未关联Bug"
        }
        
        // 获取邮箱
        def emailResult = runCommandWithOutput(cmdEmail)
        if (emailResult.success) {
            result.email = emailResult.stdout
        }
        
    } catch (Exception e) {
        echo "获取 Git 提交信息失败: ${e.message}"
        result.author = "未知提交人"
        result.message = "无法获取提交信息"
        result.email = "unknown@example.com"
        result.bugId = "未关联Bug"
    }
    
    return result
}

/**
 * 跨平台命令执行函数（统一）
 */
def runCommandWithOutput(command) {
    try {
        def result = runPowerShellWithOutput(command)
        return [success: true, stdout: result, stderr: '']
    } catch (Exception e) {
        return [success: false, stdout: '', stderr: e.message]
    }
}

// properties([
//     pipelineTriggers([
//         // 使用 Cron 表达式，实现极其精准的控制
//         // 例如：每 2 分钟扫描一次分支变动
//         // parameterizedCron('H/2 * * * *'),
        
//         // 或者使用特定的扫描触发器
//         // 这里的 '2' 代表分钟，你可以随意改成任何数字
//         cron('H/1 * * * *')
//     ])
// ])
pipeline {
    // 全局变量定义  // 变量名 = "值" (中间不要有空行或乱放的注释)
    // environment {
      
    //     GIT_EXE = 'D:\\Git\\bin\\git.exe'
    //     NODE_HOME = 'C:\\Program Files\\nodejs'
    // }

   
    parameters {
        string(name: 'appConfigName', defaultValue: 'dh', description: 'Description for appConfigName eg:standard ， dh ，xgm')
        string(name: 'SysName', defaultValue: 'report_tool', description: 'Description for SysName:operation_platform,report_tool ')
        string(name: 'webapps', defaultValue: 'unknown', description: 'Description for audit webapps')
        string(name: 'avg', defaultValue: 'report', description: 'Description for npm run build:avg 参数')
        string(
            name: 'AGENT_LABEL',
            defaultValue: 'windowsPackageMachine',
            description: '输入 agent 节点 (可选:ljgWinMachine or lzxWinMachine)'
        )
        string(name: 'NODE_WORKING_DIR', defaultValue: 'G:\\cpas-framework', description: 'electron打包脚本执行的工作目录 G:\\cpas-framework')
        string(name: 'BRANCH_NAME', defaultValue: 'release-report-060320', description: '要构建的分支名称')
        string(name: 'INSTALLATION_DIR', defaultValue: '', description: '安装包打包目录：E:/CPAS6-101 UFCPAS6.0 致同智审IAS版_测试版')
        string(name: 'PUBLISH_DIR', defaultValue: 'E:/产品安装包/05 大客户专版/109 致同/CPAS6.0 IAS版', description: '发布目录：E:/产品安装包/05 大客户专版/109 致同/CPAS6.0 IAS版')
    }

    agent {
        label params.AGENT_LABEL
    }

    stages {
        stage('AI 自动决策中心') {
            steps {
                script {
                    try {
                                             // 基础信息准备
                        def commitId = env.GIT_COMMIT ?: "未知Commit" // 优先使用 env.GIT_COMMIT 获取最新的 Commit ID 和相关信息
                        def actionType = "SKIP1" // 默认不执行
                        echo "webapps: ${params.webapps}"
                        
                        // --- 优先级 1: 检查 Tag ---
                        // 1. 自动识别是 Tag 还是 分支 // 
                        if (env.TAG_NAME) {
                            echo "检测到发布标签: ${env.TAG_NAME}，准备打包正式版镜像..."
                            // 执行构建逻辑
                            actionType = "TAG_RELEASE"
                            // runPowerShellWithOutput("node ./scripts/build.js --cpasBusiness ${params.cpasBusiness} --framework ${params.framework} --cpasUi ${params.cpasUi} --avg ${params.avg} --commitId ${commitId}")
                        } 
                        
                          // --- 优先级 2: 检查 Commit Message ---
                        else {
                            // 2. 抓取 Commit 信息（使用统一函数）
                            def branch = env.BRANCH_NAME ?: ''  // 若 env.BRANCH_NAME 为 null，则转为空字符串
                            echo "当前分支: ${branch}"
                            
                            def gitInfo = getGitCommitInfo()
                            def commitMsg = gitInfo.message

                            if (commitMsg.contains("[deploy]") ||commitMsg.contains("[部署]") || commitMsg.contains("[发布]") ) {
                                echo "🚀 [高优先级] 检测到 [deploy] 关键字，执行强制构建..."
                                actionType = "FORCE_DEPLOY"
                            } 
                            // --- 优先级 3: 检查分支 ---
                               // --- 优先级 3: Release 分支判断 (正则匹配 release/*) ---
                            // 使用 ==~ 进行全匹配，或者 .startsWith()
                            else if (env.BRANCH_NAME ==~ /release.*/) { 
                                echo "🛡️ 检测到发布分支: ${env.BRANCH_NAME}，准备进行预发布构建..."
                                actionType = "PRE_RELEASE"
                            }
                            // --- 优先级 4: 常规核心分支 ---
                            else if (branch == '' || branch == 'feat-report-zxh-bghd') {
                                actionType = "REGULAR_BUILD"
                                echo "🔍 检测到核心分支: ${env.BRANCH_NAME}，执行常规构建..."
                            }
                         
                        }




                                // --- 统一执行中心 ---
                        if (actionType != "SKIP") {
                            echo "决策结论: 执行模式 -> ${actionType}"
                                 def buildParams = ""
                                if (params.appConfigName) {
                                    buildParams += " --appConfigName=${params.appConfigName}"
                                }
                                if (params.SysName) {
                                    buildParams += " --SysName=${params.SysName}"
                                }
                                if (params.avg) {
                                    buildParams += " --avg=${params.avg}"
                                }
                                if (params.BRANCH_NAME) {
                                     buildParams += " --branch=${params.BRANCH_NAME}"   
                                }
                            
                            // 执行你的 Node.js 构建脚本
                            // 注意：${params.xxx} 建议加上 trim() 防止空格报错
                               // 处理 webapps 参数并执行 S3 下载
                            if (params.webapps != "unknown") {
                                echo "检测到 webapps 参数: ${params.webapps}，准备执行 S3 下载..."
                                
                                // 构建参数字符串
                                buildParams += " --webapps=${params.webapps} "
                               
                                
                                echo "执行构建参数:node  ./BuildScripts/ai-build.js ${buildParams}"
                                
                                // 执行 AI 构建脚本
                                def buildResult = runPowerShellWithOutput("cd \"${params.NODE_WORKING_DIR}\"; node ./BuildScripts/ai-build.js ${buildParams}")
                                echo "AI 构建脚本执行结果: ${buildResult}"
                            } else {
                                echo "webapps 参数为默认值，跳过 S3 下载"
                                echo "执行构建参数: ${buildParams}"
                                def buildResult = runPowerShellWithOutput("cd \"${params.NODE_WORKING_DIR}\" ; node ./BuildScripts/ai-build.js ${buildParams}")
                                echo "AI 构建脚本执行结果: ${buildResult}"
                                
                            }
                            
                            // 如果提供了 INSTALLATION_DIR，则执行安装包构建
                            if (params.INSTALLATION_DIR && params.INSTALLATION_DIR.trim()) {
                                echo "检测到 INSTALLATION_DIR 参数: ${params.INSTALLATION_DIR}，执行安装包构建..."
                                def srcDir = "${params.NODE_WORKING_DIR}\\release\\win-unpacked"
                                def installBuildResult = runPowerShellWithOutput("node ./build.js --dest \"${params.INSTALLATION_DIR}\" --src \"${srcDir}\"")
                                echo "安装包构建结果: ${installBuildResult}"
                            }
                          
                        } else {
                            echo "⏹️ 决策结论: 无需构建，正在跳过..."
                            currentBuild.result = 'SUCCESS'
                        }


                     
                        
                    
                    } catch (Exception e) {
                        echo "AI 自动决策中心发生错误: ${e.message}"
                        currentBuild.result = 'FAILURE'
                    }
                }
                // 执行下游项目

            }
                        
        }
    }
    post {
        always {
            script {
                try {
                    // 优先使用 env.GIT_COMMIT 获取最新的 Commit ID
                    def commitId = env.GIT_COMMIT ?: "未知Commit"
                    
                    // 使用统一函数获取 Git 提交信息
                    def gitInfo = getGitCommitInfo(commitId)
                    
                    echo "--- 自动决策中心报告 ---"
                    echo "提交信息: ${gitInfo.message}"
                    echo "关联任务: ${gitInfo.bugId}"
                    echo "修复人员: ${gitInfo.author} (${gitInfo.email})"

                    // 智能化逻辑：如果是修复 Bug，可以触发特定的通知
                    if (gitInfo.bugId != "未关联Bug") {
                        echo "检测到 Bug 修复任务，准备执行回归测试..."
                    }
                    
                    // 使用dingtalk插件提供的指令，Cpas6Package 是你在系统设置里定义的 ID，（这个一定不能改重要）
                    /* dingtalk (
                        robot: 'Cpas6Package',
                        type: 'MARKDOWN',
                        title: "AI 训练任务状态",
                        text: [
                            "### 构建报告: ${env.JOB_NAME}",
                            "---",
                            "🎉 修复喜报！", "修复人: ${gitInfo.email}", "关联Bug: ${gitInfo.bugId}",
                            "- **当前分支**: ${env.BRANCH_NAME}",
                            "- **Commit ID**: ${commitId}",
                            "- **结果**: ${currentBuild.currentResult}",
                            "- **提交人**: ${gitInfo.author}",
                            "- **提交信息**: ${gitInfo.message}",
                            "- **查看详情**: [点击跳转](${env.BUILD_URL})"
                        ]
                        // 移除 @ 特定测试人员的逻辑
                    ) */
                } catch (Exception e) {
                    echo "获取 Git 信息时发生错误: ${e.message}"
                    // 错误情况下的兜底方案
                    /* dingtalk (
                        robot: 'Cpas6Package',
                        type: 'MARKDOWN',
                        title: "AI 训练任务状态",
                        text: [
                            "### 构建报告: ${env.JOB_NAME}",
                            "---",
                            "⚠️ 获取 Git 信息失败",
                            "- **当前分支**: ${env.BRANCH_NAME}",
                            "- **结果**: ${currentBuild.currentResult}",
                            "- **查看详情**: [点击跳转](${env.BUILD_URL})"
                        ]
                    ) */
                }
            }
        }
    }
}