pipeline {
  agent any

  environment {
    DEVELOPMENT_SSH_TARGET = 'deploy@172.31.198.8'
    DEVELOPMENT_SSH_KEY = '/var/jenkins_home/.ssh/dev_deploy'
    DEVELOPMENT_SSH_KNOWN_HOSTS = '/var/jenkins_home/.ssh/known_hosts'
    DEVELOPMENT_DEPLOY_DIR = '/opt/firstleg/frontend/admin-web'
  }

  options {
    timestamps()
    disableConcurrentBuilds()
  }

  stages {
    stage('确认提交版本') {
      steps {
        script {
          env.IS_DEVELOPMENT = env.JOB_BASE_NAME?.endsWith('-dev') ? 'true' : 'false'
          env.SOURCE_TAG = sh(script: 'git rev-parse --short=12 HEAD', returnStdout: true).trim()
        }
        sh 'git log -1 --oneline'
      }
    }

    stage('构建并部署测试前端') {
      when { expression { env.IS_DEVELOPMENT != 'true' } }
      steps {
        sh '''
          set -eu
          docker compose -f docker-compose.test.yml build --pull=false
          docker compose -f docker-compose.test.yml up -d --remove-orphans
        '''
      }
    }

    stage('构建并部署开发前端') {
      when { expression { env.IS_DEVELOPMENT == 'true' } }
      steps {
        sh '''
          set -eu
          image="admin-web-development:${SOURCE_TAG}"
          ssh_args="-i ${DEVELOPMENT_SSH_KEY} -o BatchMode=yes -o StrictHostKeyChecking=yes -o UserKnownHostsFile=${DEVELOPMENT_SSH_KNOWN_HOSTS} -o ConnectTimeout=10"

          docker build \
            --build-arg VITE_CLIENT_WEB_URL=http://8.163.49.32:9002 \
            -t "$image" .
          docker save "$image" | gzip -1 | ssh $ssh_args "$DEVELOPMENT_SSH_TARGET" 'gzip -dc | docker load'

          ssh $ssh_args "$DEVELOPMENT_SSH_TARGET" "install -d -m 750 '$DEVELOPMENT_DEPLOY_DIR'"
          scp $ssh_args docker-compose.development.yml \
            "$DEVELOPMENT_SSH_TARGET:$DEVELOPMENT_DEPLOY_DIR/docker-compose.yml.tmp"
          ssh $ssh_args "$DEVELOPMENT_SSH_TARGET" \
            "mv -f '$DEVELOPMENT_DEPLOY_DIR/docker-compose.yml.tmp' '$DEVELOPMENT_DEPLOY_DIR/docker-compose.yml'"

          ssh $ssh_args "$DEVELOPMENT_SSH_TARGET" sh -s -- "$DEVELOPMENT_DEPLOY_DIR" "$SOURCE_TAG" <<'REMOTE'
          set -eu
          cd "$1"
          export IMAGE_TAG="$2"
          docker compose -f docker-compose.yml up -d --remove-orphans --pull never
          docker compose -f docker-compose.yml ps
          docker compose -f docker-compose.yml exec -T admin-web wget -qO- http://127.0.0.1/healthz
REMOTE
        '''
      }
    }

    stage('部署检查') {
      when { expression { env.IS_DEVELOPMENT != 'true' } }
      steps {
        sh '''
          set -eu
          docker compose -f docker-compose.test.yml ps
          docker compose -f docker-compose.test.yml exec -T admin-web wget -qO- http://127.0.0.1/healthz
        '''
      }
    }
  }

  post {
    failure {
      sh '''
        if [ "${IS_DEVELOPMENT:-false}" = "true" ]; then
          ssh -i "$DEVELOPMENT_SSH_KEY" -o BatchMode=yes -o StrictHostKeyChecking=yes \
            -o UserKnownHostsFile="$DEVELOPMENT_SSH_KNOWN_HOSTS" \
            "$DEVELOPMENT_SSH_TARGET" 'docker logs --tail=100 admin-web-development || true' || true
        else
          docker compose -f docker-compose.test.yml logs --tail=100 || true
        fi
      '''
    }
  }
}
