# 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-20.04, highmem]
    outputs:
      properties: ${{ steps.test-properties.outputs.properties }}
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
      - id: test-properties
        uses: ./.github/actions/setup-default-test-properties

  update_python_dependencies:
    runs-on: [self-hosted, ubuntu-20.04]
    needs: set-properties
    name: Update Python Dependencies
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
      - name: Setup environment
        uses: ./.github/actions/setup-environment-action
        with:
          python-version: |
            3.10
            3.11
            3.12
            3.13
            3.14
          java-version: default
          go-version: default
          disable-cache: true
      - 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
