name: 'Release: Nightly'

on:
  schedule:
    - cron: '0 0 * * *'
  workflow_dispatch:
    inputs:
      dry_run:
        description: 'Run a dry-run of the release process; no branches, npm packages or GitHub releases will be created.'
        required: true
        type: 'boolean'
        default: true
      force_skip_tests:
        description: 'Select to skip the "Run Tests" step in testing. Prod releases should run tests'
        required: false
        type: 'boolean'
        default: true
      ref:
        description: 'The branch, tag, or SHA to release from.'
        required: false
        type: 'string'
        default: 'main'
      environment:
        description: 'Environment'
        required: false
        type: 'choice'
        options:
          - 'prod'
          - 'dev'
        default: 'prod'

jobs:
  build-mac:
    if: "github.repository == 'google-gemini/gemini-cli'"
    uses: './.github/workflows/build-unsigned-mac-binaries.yml'
    with:
      ref: '${{ github.event.inputs.ref }}'

  release:
    if: "github.repository == 'google-gemini/gemini-cli'"
    needs: ['build-mac']
    environment: "${{ github.event.inputs.environment || 'prod' }}"
    runs-on: 'ubuntu-latest'
    permissions:
      contents: 'write'
      packages: 'write'
      issues: 'write'
      pull-requests: 'write'
    steps:
      - name: 'Checkout'
        uses: 'actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8'
        with:
          persist-credentials: false
          fetch-depth: 0

      - name: 'Checkout Release Code'
        uses: 'actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8'
        with:
          persist-credentials: false
          ref: '${{ github.event.inputs.ref }}'
          path: 'release'
          fetch-depth: 0

      - name: 'Setup Node.js'
        uses: 'actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020' # ratchet:actions/setup-node@v4
        with:
          node-version-file: './release/.nvmrc'
          cache: 'npm'

      - name: 'Install Dependencies'
        working-directory: './release'
        run: 'npm ci'

      - name: 'Download macOS Binaries'
        uses: './.github/actions/download-mac-binaries'
        with:
          path: 'release/dist'

      - name: 'Print Inputs'
        shell: 'bash'
        env:
          JSON_INPUTS: '${{ toJSON(github.event.inputs) }}'
        run: 'echo "$JSON_INPUTS"'

      - name: 'Calculate Release Variables'
        id: 'vars'
        uses: './.github/actions/calculate-vars'
        with:
          dry_run: '${{ github.event.inputs.dry_run }}'

      - name: 'Print Calculated vars'
        shell: 'bash'
        env:
          JSON_VARS: '${{ toJSON(steps.vars.outputs) }}'
        run: 'echo "$JSON_VARS"'

      - name: 'Run Tests'
        if: "${{ github.event_name == 'schedule' || github.event.inputs.force_skip_tests == 'false' }}"
        uses: './.github/actions/run-tests'
        with:
          gemini_api_key: '${{ secrets.GEMINI_API_KEY }}'
          working-directory: './release'

      - name: 'Get Nightly Version'
        id: 'nightly_version'
        working-directory: './release'
        env:
          GH_TOKEN: '${{ secrets.GITHUB_TOKEN }}'
        run: |
          # Calculate the version using the centralized script
          VERSION_JSON=$(node scripts/get-release-version.js --type=nightly)

          # Extract values for logging and outputs
          RELEASE_TAG=$(echo "${VERSION_JSON}" | jq -r .releaseTag)
          RELEASE_VERSION=$(echo "${VERSION_JSON}" | jq -r .releaseVersion)
          NPM_TAG=$(echo "${VERSION_JSON}" | jq -r .npmTag)
          PREVIOUS_TAG=$(echo "${VERSION_JSON}" | jq -r .previousReleaseTag)

          # Print calculated values for logging
          echo "Calculated Release Tag: ${RELEASE_TAG}"
          echo "Calculated Release Version: ${RELEASE_VERSION}"
          echo "Calculated Previous Tag: ${PREVIOUS_TAG}"

          # Set outputs for subsequent steps
          echo "RELEASE_TAG=${RELEASE_TAG}" >> "${GITHUB_OUTPUT}"
          echo "RELEASE_VERSION=${RELEASE_VERSION}" >> "${GITHUB_OUTPUT}"
          echo "NPM_TAG=${NPM_TAG}" >> "${GITHUB_OUTPUT}"
          echo "PREVIOUS_TAG=${PREVIOUS_TAG}" >> "${GITHUB_OUTPUT}"

      - name: 'Publish Release'
        if: true
        uses: './.github/actions/publish-release'
        with:
          release-version: '${{ steps.nightly_version.outputs.RELEASE_VERSION }}'
          release-tag: '${{ steps.nightly_version.outputs.RELEASE_TAG }}'
          npm-tag: '${{ steps.nightly_version.outputs.NPM_TAG }}'
          wombat-token-core: '${{ secrets.WOMBAT_TOKEN_CORE }}'
          wombat-token-cli: '${{ secrets.WOMBAT_TOKEN_CLI }}'
          wombat-token-a2a-server: '${{ secrets.WOMBAT_TOKEN_A2A_SERVER }}'
          github-token: '${{ secrets.GITHUB_TOKEN }}'
          github-release-token: '${{ secrets.GEMINI_CLI_ROBOT_GITHUB_PAT }}'
          dry-run: '${{ steps.vars.outputs.is_dry_run }}'
          previous-tag: '${{ steps.nightly_version.outputs.PREVIOUS_TAG }}'
          working-directory: './release'
          skip-branch-cleanup: true
          force-skip-tests: "${{ github.event_name != 'schedule' && github.event.inputs.force_skip_tests == 'true' }}"
          gemini_api_key: '${{ secrets.GEMINI_API_KEY }}'
          npm-registry-publish-url: '${{ vars.NPM_REGISTRY_PUBLISH_URL }}'
          npm-registry-url: '${{ vars.NPM_REGISTRY_URL }}'
          npm-registry-scope: '${{ vars.NPM_REGISTRY_SCOPE }}'
          cli-package-name: '${{ vars.CLI_PACKAGE_NAME }}'
          core-package-name: '${{ vars.CORE_PACKAGE_NAME }}'
          a2a-package-name: '${{ vars.A2A_PACKAGE_NAME }}'

      - name: 'Create and Merge Pull Request'
        if: "github.event.inputs.environment != 'dev'"
        uses: './.github/actions/create-pull-request'
        with:
          branch-name: 'release/${{ steps.nightly_version.outputs.RELEASE_TAG }}'
          pr-title: 'chore/release: bump version to ${{ steps.nightly_version.outputs.RELEASE_VERSION }}'
          pr-body: 'Automated version bump for nightly release.'
          github-token: '${{ secrets.GEMINI_CLI_ROBOT_GITHUB_PAT }}'
          dry-run: '${{ steps.vars.outputs.is_dry_run }}'
          working-directory: './release'

      - name: 'Create Issue on Failure'
        if: "${{ failure() && github.event.inputs.environment != 'dev' && (github.event_name == 'schedule' || github.event.inputs.dry_run != 'true') }}"
        env:
          GITHUB_TOKEN: '${{ secrets.GITHUB_TOKEN }}'
          RELEASE_TAG: '${{ steps.nightly_version.outputs.RELEASE_TAG }}'
          DETAILS_URL: '${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}'
        run: |
          gh issue create \
            --title "Nightly Release Failed for ${RELEASE_TAG} on $(date +'%Y-%m-%d')" \
            --body "The nightly-release workflow failed. See the full run for details: ${DETAILS_URL}" \
            --label 'release-failure,priority/p0'
