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

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
