// ============================================================
// JENKINSFILE — Definição do Pipeline CI/CD
// ============================================================
// Este arquivo é o coração do CI/CD. Ele descreve, em código,
// TODAS as etapas que o Jenkins deve executar quando você faz
// um "git push".
//
// Conceito: "Pipeline as Code" — o pipeline é versionado junto
// com o código da aplicação. Se alguém perguntar "como o deploy
// funciona?", a resposta está aqui.
//
// SINTAXE: Groovy (linguagem do Jenkins). Não precisa saber
// Groovy — a estrutura é declarativa e autoexplicativa.
// ============================================================

pipeline {

    // "agent any" = executa em qualquer worker disponível.
    // No nosso lab, só temos um (o próprio SRVJENKINS).
    agent any

    // Variáveis de ambiente disponíveis em todos os stages
    environment {
        REGISTRY   = '10.15.1.211:5000'     // Docker Registry (roda no próprio SRVJENKINS)
        APP_NAME   = 'cicd-demo-app'        // Nome da imagem Docker
        STAGING_IP = '10.15.1.212'          // IP do SRVSTAGING
    }

    stages {

        // ==================================================
        // STAGE 1: Instalar Dependências
        // ==================================================
        // O Jenkins já clonou o repositório automaticamente
        // (configurado no Job). Agora instalamos as dependências
        // Node.js listadas no package.json.
        stage('Install') {
            steps {
                echo '📦 Instalando dependências (npm install)...'
                sh 'npm install'
            }
        }

        // ==================================================
        // STAGE 2: Executar Testes
        // ==================================================
        // Roda os testes automatizados (Jest).
        // Se QUALQUER teste falhar, o pipeline PARA AQUI.
        // Código quebrado NUNCA chega ao servidor de staging.
        stage('Test') {
            steps {
                echo '🧪 Executando testes automatizados...'
                sh 'npm test'
            }
        }

        // ==================================================
        // STAGE 3: Construir Imagem Docker
        // ==================================================
        // Cria a imagem Docker da aplicação usando o Dockerfile.
        // Gera duas tags:
        //   - BUILD_NUMBER: versão específica (ex: :14)
        //   - latest: sempre aponta para a versão mais recente
        stage('Build Image') {
            steps {
                echo '🐳 Construindo imagem Docker...'
                sh "docker build -t ${REGISTRY}/${APP_NAME}:${BUILD_NUMBER} ."
                sh "docker tag ${REGISTRY}/${APP_NAME}:${BUILD_NUMBER} ${REGISTRY}/${APP_NAME}:latest"
            }
        }

        // ==================================================
        // STAGE 4: Enviar Imagem para o Registry
        // ==================================================
        // "Push" da imagem para o Docker Registry local.
        // O Registry é o "repositório de templates" — o staging
        // vai buscar a imagem de lá.
        stage('Push to Registry') {
            steps {
                echo '📤 Enviando imagem para o Registry local...'
                sh "docker push ${REGISTRY}/${APP_NAME}:${BUILD_NUMBER}"
                sh "docker push ${REGISTRY}/${APP_NAME}:latest"
            }
        }

        // ==================================================
        // STAGE 5: Deploy no Staging
        // ==================================================
        // Conecta via SSH no SRVSTAGING e:
        //   1. Puxa a imagem mais recente do Registry
        //   2. Para e remove o container antigo (se existir)
        //   3. Sobe um novo container com a versão nova
        //
        // PREREQUISITO: A credencial 'staging-ssh-key' precisa
        // estar cadastrada no Jenkins (Manage Jenkins → Credentials)
        stage('Deploy to Staging') {
            steps {
                echo '🚀 Fazendo deploy no SRVSTAGING...'
                sshagent(credentials: ['staging-ssh-key']) {
                    sh """
                        ssh -o StrictHostKeyChecking=no root@${STAGING_IP} '
                            docker pull ${REGISTRY}/${APP_NAME}:latest &&
                            (docker stop ${APP_NAME} || true) &&
                            (docker rm ${APP_NAME} || true) &&
                            docker run -d \
                                --name ${APP_NAME} \
                                --restart unless-stopped \
                                -p 3001:3000 \
                                ${REGISTRY}/${APP_NAME}:latest
                        '
                    """
                }
            }
        }
    }

    // Ações executadas APÓS o pipeline terminar
    post {
        success {
            echo '✅ Pipeline executado com sucesso!'
            echo '🌐 App disponível em: http://10.15.1.212:3001'
        }
        failure {
            echo '❌ Pipeline falhou. Verifique os logs acima.'
        }
    }
}
