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

jobs:
  set-properties:
    runs-on: [self-hosted, ubuntu-20.04]
    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.9
            3.10
            3.11
            3.12
          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 }}
        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 [[ $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
