pipeline {
    agent any

    tools {
        jdk 'JDK17'
    }

//     parameters {
//         choice(name: 'ENVIRONMENT', choices: ['dev'], description: '배포할 어플리케이션 profile 선택')
//         choice(name: 'DEPLOY_SERVER_IP', choices: ['172.31.20.11'], description: '배포할 WAS 서버 IP 선택')
//         string(name: 'GIT_REPO', defaultValue: 'http://172.31.18.11:3000/gcone/gcone_batch.git', description: 'Git 레파지토리 주소')
//     }

    environment {
        SERVER_IP = "${DEPLOY_SERVER_IP}"
        SERVER_USER = "tomcat"
        TOMCAT_HOME = "${ENVIRONMENT == 'dev' ? '/var/lib/tomcat' : '/usr/local/tomcat'}"
        DEPLOY_PATH = "${TOMCAT_HOME}/webapps"
        BACKUP_PATH = "${DEPLOY_PATH}/backup"
        APP_NAME = "gcone_batch"
        WAR_FILE = "${APP_NAME}.war"
        DEPLOY_FILE = "${DEPLOY_PATH}/${WAR_FILE}"
        BACKUP_FILE = "${BACKUP_PATH}/${WAR_FILE}.bak"
        GIT_BRANCH = "${ENVIRONMENT == 'dev' ? 'develop' : 'master'}"
//         SSH_KEY_PATH = "C:/Users/CHAMDAHAN-41/.ssh/id_rsa"
    }

    stages {

        stage('Setup parameters') {
            steps {
                script {
                    try {
						echo "Setup parameters ${ENVIRONMENT}"
						echo "tomcat home here ${env.TOMCAT_HOME}"


						if("${ENVIRONMENT}" == "dev" ) {
							properties([
		                        parameters([
		                            choice(name: 'ENVIRONMENT', choices: ['dev'], description: '배포할 어플리케이션 profile 선택'),
                                    choice(name: 'DEPLOY_SERVER_IP', choices: ['172.31.20.11'], description: '배포할 WAS 서버 IP 선택'),
                                    string(name: 'GIT_REPO', defaultValue: 'http://172.31.18.11:3000/gcone/gcone_batch.git', description: 'Git 레파지토리 주소')
		                        ])
		                    ])
						}else{
							properties([
		                        parameters([
		                            choice(name: 'ENVIRONMENT', choices: ['stage'], description: '배포할 어플리케이션 profile 선택'),
                                    choice(name: 'DEPLOY_SERVER_IP', choices: ['10.100.241.11'], description: '배포할 WAS 서버 IP 선택'),
                                    string(name: 'GIT_REPO', defaultValue: 'http://172.31.18.11:3000/gcone/gcone_batch.git', description: 'Git 레파지토리 주소')
		                        ])
		                    ])
						}


                    } catch (Exception e) {
                        error "Setup parameters 실패: ${e.getMessage()}"
                    }
                }
            }
        }


        stage('Checkout') {
            steps {
                script {
                    try {
                        echo "Checking out ${env.GIT_BRANCH} branch for ${params.ENVIRONMENT} environment"
                        git branch: "${env.GIT_BRANCH}", url: "${params.GIT_REPO}"
                        echo "Checkout 성공: 브랜치 ${env.GIT_BRANCH}, 저장소 ${params.GIT_REPO}"
                    } catch (Exception e) {
                        error "Checkout 실패: ${e.getMessage()}"
                    }
                }
            }
        }

        stage('Build') {
            steps {
                script {
                    try {
                        if("${RUNNING_OS}" == "linux" ) {
                            sh 'chmod +x gradlew'
                            sh "./gradlew clean war -x test -Pprofile=${params.ENVIRONMENT}"
                        }else{
                            bat "./gradlew.bat clean build -Pprofile=${params.ENVIRONMENT}"
                        }
                        echo "Build 성공"
                    } catch (Exception e) {
                        error "Build 실패: ${e.getMessage()}"
                    }
                }
            }
        }

        stage('Unit Tests') {
            steps {
                script {
                    try {
                        if("${RUNNING_OS}" == "linux" ) {
                            sh "./gradlew test"
                        }else{
                            bat "./gradlew.bat test"
                        }
                        echo "Unit Tests 성공"
                    } catch (Exception e) {
                        error "Unit Tests 실패: ${e.getMessage()}"
                    }
                }
            }
        }

        stage('Backup') {
            steps {
                script {
                    sshCommand remote: [
                        name: 'WAS Server',
                        host: "${env.SERVER_IP}",
                        user: "${env.SERVER_USER}",
                        identityFile: "${env.SSH_KEY_PATH}",
                        allowAnyHosts: true
                    ], command: """
                        if [ -f ${env.DEPLOY_FILE} ]; then
                            mkdir -p ${env.BACKUP_PATH}
                            cp ${env.DEPLOY_FILE} ${env.BACKUP_FILE}
                            rm -r ${env.TOMCAT_HOME}/webapps/${env.WAR_FILE}
                            echo "기존 WAR 파일 백업 완료"
                        else
                            echo "백업할 WAR 파일이 없습니다"
                        fi
                    """
                }
            }
        }

        stage('Deploy to Tomcat') {
            steps {
                script {
                    sshPut remote: [
                        name: 'WAS Server',
                        host: "${env.SERVER_IP}",
                        user: "${env.SERVER_USER}",
                        identityFile: "${env.SSH_KEY_PATH}",
                        allowAnyHosts: true
                    ], from: "build/libs/${env.WAR_FILE}", into: "${env.DEPLOY_FILE}"

                    sshCommand remote: [
                        name: 'WAS Server',
                        host: "${env.SERVER_IP}",
                        user: "${env.SERVER_USER}",
                        identityFile: "${env.SSH_KEY_PATH}",
                        allowAnyHosts: true
                    ], command: """
                        if nc -z localhost 8005; then
                            echo "Tomcat이 실행 중입니다. 종료 중..."
                            ${env.TOMCAT_HOME}/bin/shutdown.sh
                            sleep 2
                            rm -r ${env.TOMCAT_HOME}/webapps/${env.APP_NAME}
                            sleep 10
                        else
                            echo "Tomcat이 실행 중이지 않습니다."
                        fi
                        ${env.TOMCAT_HOME}/bin/startup.sh
                    """

                    echo "Deploy 완료 (${params.ENVIRONMENT} 환경, ${env.GIT_BRANCH} 브랜치)"
                }
            }
        }
    }

    post {
        success {
            echo '배포가 성공적으로 완료되었습니다.'
        }
        failure {
            script {
                echo '배포에 실패했습니다. 이전 버전으로 롤백을 시도합니다.'
                sshCommand remote: [
                    name: 'WAS Server',
                    host: "${env.SERVER_IP}",
                    user: "${env.SERVER_USER}",
                    identityFile: "${env.SSH_KEY_PATH}",
                    allowAnyHosts: true
                ], command: """
                    if [ -f ${env.BACKUP_FILE} ]; then
                        cp ${env.BACKUP_FILE} ${env.DEPLOY_FILE}
                        if nc -z localhost 8005; then
                            echo "Tomcat이 실행 중입니다. 종료 중..."
                            ${env.TOMCAT_HOME}/bin/shutdown.sh
                            sleep 10
                        else
                            echo "Tomcat이 실행 중이지 않습니다."
                        fi
                        ${env.TOMCAT_HOME}/bin/startup.sh
                        echo "롤백 완료"
                    else
                        echo "백업 파일이 존재하지 않아 롤백할 수 없습니다."
                    fi
                """
            }
        }
        always {
            echo '파이프라인 실행이 종료되었습니다.'
        }
    }
}