# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.

{% import 'macros.jinja' as macros with context %}
{% set pr_number = pr_number|replace("Unset", arrow.branch) %}
{{ macros.github_header() }}

jobs:
  test:
    name: Build Docs
    runs-on: ubuntu-latest
{{ macros.github_set_env(env) }}
    steps:
      {{ macros.github_checkout_arrow(fetch_depth=fetch_depth|default(1))|indent }}
      {{ macros.github_free_space()|indent }}
      {{ macros.github_install_archery()|indent }}

      - name: Execute Docker Build
        shell: bash
        env:
          ARROW_JAVA_SKIP_GIT_PLUGIN: true
        run: |
          mkdir -p build
          archery docker run \
            -e SETUPTOOLS_SCM_PRETEND_VERSION="{{ arrow.no_rc_version }}" \
            -v $PWD/build/:/build/ \
            {{ flags|default("") }} \
            {{ image }} \
            {{ command|default("") }}
      - name: Checkout Crossbow
        uses: actions/checkout@v4
        with:
          persist-credentials: false
          ref: {{ default_branch|default("main") }}
          path: crossbow
          fetch-depth: 1
      {% if publish %}
      - name: Prepare Docs Preview
        run: |
          # build files are created by the docker user
          sudo chown -R ${USER}: build
          # These are only used while generating the page
          rm -rf build/docs/.doctrees
      - name: Upload preview to S3
        env:
          {%- raw %}
          AWS_ACCESS_KEY_ID: ${{ secrets.CROSSBOW_DOCS_ARROW_AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.CROSSBOW_DOCS_ARROW_AWS_SECRET_ACCESS_KEY }}
          AWS_DEFAULT_REGION: ${{ secrets.CROSSBOW_DOCS_ARROW_S3_BUCKET_REGION }}
          BUCKET: ${{ secrets.CROSSBOW_DOCS_ARROW_S3_BUCKET }}
          {% endraw %}
        run: |
          aws s3 cp build/docs/ $BUCKET/pr_docs/{{ pr_number }}/ --recursive
          echo ":open_book: You can find the preview here: https://s3.amazonaws.com/arrow-data/pr_docs/{{ pr_number }}/index.html" >> $GITHUB_STEP_SUMMARY

      {% endif %}
      - name: Prepare Docs artifacts
        run: |
          cd build
          sudo chown -R ${USER}: .
          tar cvzf docs.tar.gz docs
      {{ macros.github_upload_releases("build/docs.tar.gz")|indent }}
