# Copyright 2021 Google LLC

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

#     https://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.

name: For testing purposes
# Controls when the action will run.

on:
  # Triggers the workflow on pull request events but only for the main branch
  pull_request:
    branches: [ main ]


jobs:
  build:
    name: For testing purposes
    runs-on: ubuntu-latest
    if: |
      ${{github.event.pull_request.user.login == 'parthea' && github.event.pull_request.title == 'for testing purposes' && github.repository == 'googleapis/google-api-python-client'}}
    steps:
      - name: Get current date
        id: date
        run: echo "::set-output name=current_date::$(date +'%Y-%m-%d')"

      - name: Check out main branch
        uses: actions/checkout@v3
        with:
          ref: refs/heads/main

      - name: Create branch
        run: |
          git checkout -b update-discovery-artifacts-${{ steps.date.outputs.current_date }}

      - name: Set up Python 3.9
        uses: actions/setup-python@v3
        with:
          python-version: 3.9

      - name: Install google-api-python-client
        run: pip3 install -e .

      - name: Install script dependencies
        run: pip3 install -r requirements.txt
        working-directory: ./scripts

      # Apply a workaround to discovery.py to avoid DefaultCredentialsError
      # which is raised when calling `build_from_document()` as a result of
      # `google.auth.default()`. The workaround is to bypass the code block that
      # attempts to load default credentials.
      - name: Workaround to avoid DefaultCredentialsError in discovery.py
        run: sed -i -e 's/if credentials is None/if False/g' googleapiclient/discovery.py

      - name: Run Change Summary
        run: python3 updatediscoveryartifacts.py
        working-directory: ./scripts

      - name: Commit changes
        run: ./createcommits.sh
        working-directory: ./scripts

      - name: Push changes
        run: git push -f --set-upstream origin update-discovery-artifacts-${{ steps.date.outputs.current_date }}

      - name: Prepare summary for PR Body
        id: pr_body
        shell: bash
        run: |
          python3 buildprbody.py
          output=$(cat temp/allapis.summary)
          output="${output//'%'/'%25'}"
          output="${output//$'\n'/'%0A'}"
          output="${output//$'\r'/'%0D'}"
          echo "::set-output name=change_summary::$output"
        working-directory: ./scripts

      - name: Create PR
        uses: actions/github-script@v6.0.0
        with:
          github-token: ${{secrets.YOSHI_CODE_BOT_TOKEN}}
          script: |
            async function createPR () {
              const { owner, repo } = context.repo
              const branch = 'update-discovery-artifacts-${{ steps.date.outputs.current_date }}'
              let prBody = `${{ steps.pr_body.outputs.change_summary }}`
              const prTitle = 'chore: Update discovery artifacts'
              const pullRequests = await github.rest.pulls.list({
                owner: owner,
                repo: repo,
                head: `${owner}:${branch}`,
                state: 'open'
              })

              if (pullRequests.data.length === 1) {
                prNumber = pullRequests.data[0].number
                await github.rest.pulls.update({
                  owner: owner,
                  repo: repo,
                  pull_number: prNumber,
                  title: prTitle,
                  body: prBody
                })
                console.log('Updated PR')
              } else {
                const createPrResult = await github.rest.pulls.create({
                  owner: owner,
                  repo: repo,
                  base: 'main',
                  head: `${owner}:${branch}`,
                  title: prTitle,
                  body: prBody
                })
                prNumber = createPrResult.data.number
                console.log('Created PR')
              }
            }
            createPR()
