# 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.

# This workflow will update python dependencies as part of the release process
# And commit the changes into the branch release, creating a PR into the branch

name: Update Python Dependencies

on:
  schedule:
  - cron: "0 0 * * 0"
  workflow_dispatch:
permissions:
  contents: write
  pull-requests: write
  checks: read
  issues: read
  statuses: read

env:
  DEVELOCITY_ACCESS_KEY: ${{ secrets.DEVELOCITY_ACCESS_KEY }}

jobs:
  set-properties:
    runs-on: [self-hosted, ubuntu-24.04, highmem]
    outputs:
      properties: ${{ steps.test-properties.outputs.properties }}
    steps:
      - name: Checkout code
        uses: actions/checkout@v7
        with:
          persist-credentials: false
      - id: test-properties
        uses: ./.github/actions/setup-default-test-properties

  update_python_dependencies:
    runs-on: [self-hosted, ubuntu-24.04, main]
    needs: set-properties
    name: Update Python Dependencies
    timeout-minutes: 180
    steps:
      - name: Checkout code
        uses: actions/checkout@v7
        with:
          persist-credentials: false
      - name: Setup environment
        uses: ./.github/actions/setup-environment-action
        with:
          python-version: |
            3.11
            3.12
            3.13
            3.14
          java-version: default
          go-version: default
          disable-cache: true
          # generatePythonRequirementsAll does not use tox.
          tox-cache: false
      - name: Update Python Dependencies
        uses: ./.github/actions/gradle-command-self-hosted-action
        with:
          gradle-command: :sdks:python:container:generatePythonRequirementsAll
      - name: Install gh cli
        uses: ./.github/actions/setup-gh-cli-linux
      - name: Set git config
        run: |
          git config user.name $GITHUB_ACTOR
          git config user.email actions@"$RUNNER_NAME".local
      - name: Commit Changes and create new PR
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          GH_EVENT: ${{ github.event_name }}
        run: |
          # Take the current date, subtract from a release cut date in the past (Mar 6, 2024),
          # then get the num days % 42 (our release cadence is 42 days).
          # This will ensure it only runs the week after a release branch has been cut.
          days_diff=$(( ($(date +%s) - $(date --date="240306" +%s) )/(60*60*24)%42 ))
          if [[ $GH_EVENT != 'workflow_dispatch' && $days_diff -gt 6 ]]; then
            echo "Exiting early. We only update dependencies the week after we cut the release"
            exit 0
          fi
          branchName=weekly_update_python_dependencies_$(date +%s)
          git checkout -b $branchName
          git add -A
          git diff-index --quiet HEAD || gitdiff=$? || echo $?
          if [[ $gitDiff != 0 ]]; then
            echo "Changes are ready to commit"
            git commit -m "Update Python Dependencies" --quiet
            git push origin $branchName --quiet
            GITHUB_PR_URL=$(gh pr create --title "Update Python Dependencies" --label "python" --body "This PR was created by automation - by default this does not execute tests due to a limitation in GitHub Actions. To review this PR, please (1) review the contents to make sure all dependency upgrades are formatted correctly, (2) close and reopen the PR (3) Approve/merge if tests pass successfully.")
            echo "Link of the new PR  $GITHUB_PR_URL"
          else
            echo "No changes on the files"
          fi
