def notify(
    String context,
    String giteaUser, 
    String giteaPass, 
    String repositoryUrl, 
    String repositoryName, 
    String commitHash, 
    String buildStatus 
) {
    def status = buildStatus == 'success' ? 'success' : 'failure'
    def description = buildStatus == 'success' ? 'Build succeeded' : 'Build failed'
    
    sh """
    curl -X POST \
        -u "${giteaUser}:${giteaPass}" \
        -H "Content-Type: application/json" \
        -d '{"context":"${context}","state": "${status}", "description": "${description}"}' \
        ${repositoryUrl}deployer3000/${repositoryName}/statuses/${commitHash}
    """
}

pipeline {
    agent any
    environment {
        REGISTRY_NAME = 'registry.entcor/trust-module'
        IMAGE_NAME = "test-ci-cd"
        GITEA_REPOSITORY_URL = "http://git.entcor/api/v1/repos/" 
    }
    stages {
        stage ('Initialize variables') {
            steps {
                script {
                        def hasTags = sh(script: "git tag -l | wc -l", returnStdout: true).trim().toInteger() > 0
                        echo "${hasTags}"
                        
                        def lastVersion = "0.0.0"
                        
                        if (hasTags) {
                            lastVersion = sh(script: "git describe --tags --abbrev=0", returnStdout: true).trim()
                        }

                        echo "Last version: ${lastVersion}"

                        def (major, minor, patch) = lastVersion.tokenize('.')
                        def newVersion = "${major}.${minor}.${patch.toInteger() + 1}"
                        echo "New version: ${newVersion}"

                        env.IMAGE_TAG = newVersion
                        env.NEW_VERSION = newVersion
                }
            }
        }
        stage ('Build docker image') {
            when {
                expression { env.CHANGE_BRANCH?.startsWith('rc') }
            }
            steps {
                script {
                    def image = docker.build("${env.IMAGE_NAME}:${env.IMAGE_TAG}")
                    sh "docker tag ${env.IMAGE_NAME}:${env.IMAGE_TAG} ${env.REGISTRY_NAME}/${env.IMAGE_NAME}:${env.IMAGE_TAG}"
                }
            }
        }
        // stage ('Push docker image to registry') {
        //     when {
        //         expression { env.CHANGE_BRANCH?.startsWith('rc') }
        //     }
        //     steps {
        //         script {
        //             docker.withRegistry('https://registry.entcor/harbor/', 'harbor-credentials-id') {
        //                 docker.image("${env.REGISTRY_NAME}/${env.IMAGE_NAME}:${env.IMAGE_TAG}").push()
        //             }
        //         }
        //     }
        // }
    }
    post {
        always {
            script {
                echo "Cleaning up workspace..."
                sh "rm -rf ${env.WORKSPACE}/rc/ || true"
            }
        }
        success {
            script {
                if (env.CHANGE_BRANCH?.startsWith('rc')) { 
                    echo "Attempting to merge PR ${env.CHANGE_ID} into master..."
                    // def mergeCommitHash = sh(script: "git rev-parse HEAD", returnStdout: true).trim()
                    withCredentials([usernamePassword(credentialsId: 'gitea_creds', usernameVariable: 'GITEA_USER', passwordVariable: 'GITEA_PASS')]) {
                        def prId = env.CHANGE_ID

                        sh """
                        curl -X POST \
                             -u "${GITEA_USER}:${GITEA_PASS}" \
                             -H "Content-Type: application/json" \
                             -d '{"do":"merge"}' \
                             http://git.entcor/api/v1/repos/deployer3000/${env.IMAGE_NAME}/pulls/${prId}/merge
                        """
                        def commitHash = sh(script: "git rev-parse HEAD~1", returnStdout: true).trim() // необходим для корректного отображения статусов
                        echo "PR ${prId} merged successfully into main!"
                        sleep(time: 15, unit: 'SECONDS')
                        sh "git checkout main && git pull origin main" // пробуем спуллить, чтобы последний мёрдж коммит получить
                        
                        def prCommitHash = sh(script: "git rev-parse HEAD", returnStdout: true).trim()

                        sh """
                            curl -v -X POST -u "${GITEA_USER}:${GITEA_PASS}" \
                            -H "Content-Type: application/json" \
                            -d '{"tag_name": "${env.NEW_VERSION}", "name": "Release ${env.NEW_VERSION}", "target_commitish": "${prCommitHash}"}' \
                            "${env.GITEA_REPOSITORY_URL}deployer3000/${env.IMAGE_NAME}/releases"
                        """
                        echo "New release succeeded!"

                        def context = "test-org/${env.IMAGE_NAME}/pipeline/pr-${env.CHANGE_TARGET}"
                        notify(context, GITEA_USER, GITEA_PASS, env.GITEA_REPOSITORY_URL, env.IMAGE_NAME, commitHash, "success")
                    }
                }
            }
        }
        failure {
            echo "Pipeline failed. Check the logs for details."
        }
        aborted {
            echo "Pipeline was aborted."
        }
    }
}

//TODO: дженкинс entcor убрать
