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