name: Crowdin (push)

on:
  push:
    branches: ['main']
    paths:
      - '.github/workflows/i18n.push.yml'
      - 'apps/*/src/locales/en-US/**'
      - 'apps/*/locales/en-US/**'
      - 'packages/*/src/locales/en-US/**'
      - 'packages/*/locales/en-US/**'
      - 'crowdin.yml'
  workflow_dispatch:

concurrency:
  group: i18n-management

jobs:
  push_translations:
    name: Push sources to Crowdin
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/main'
    concurrency:
      group: i18n-push:${{ github.ref }}
      cancel-in-progress: true
    steps:
      - name: Preflight check
        run: |
          PREFLIGHT_CHECK_RESULT=true

          function flight_failure () {
            if [ "$PREFLIGHT_CHECK_RESULT" = true ]; then
              echo "One or more pre-flight checks failed!"
              echo ""
              PREFLIGHT_CHECK_RESULT=false
            fi
            echo "- $1"
          }

          if [ "$CROWDIN_PROJECT_ID_DEFINED" != true ]; then
            flight_failure "CROWDIN_PROJECT_ID variable is not defined (required to push)"
          fi

          if [ "$CROWDIN_PERSONAL_TOKEN_DEFINED" != true ]; then
            flight_failure "CROWDIN_PERSONAL_TOKEN secret is not defined (required to push)"
          fi

          if [ "$PREFLIGHT_CHECK_RESULT" = false ]; then
            exit 1
          fi
        env:
          CROWDIN_PROJECT_ID_DEFINED: ${{ vars.CROWDIN_PROJECT_ID != '' }}
          CROWDIN_PERSONAL_TOKEN_DEFINED: ${{ secrets.CROWDIN_PERSONAL_TOKEN != '' }}

      - name: Checkout
        uses: actions/checkout@v4
        with:
          ref: ${{ github.ref }}

      - name: Query branch name
        id: branch-name
        shell: bash
        run: |
          BRANCH_NAME=$(git rev-parse --abbrev-ref HEAD)
          SAFE_BRANCH_NAME=$(echo "$BRANCH_NAME" | sed -e "s/[\\\\/\\:*?\"<>|]/_/g")
          echo "Branch name is $BRANCH_NAME (escaped as $SAFE_BRANCH_NAME)"
          echo "branch_name=$BRANCH_NAME" >> "$GITHUB_OUTPUT"
          echo "safe_branch_name=$SAFE_BRANCH_NAME" >> "$GITHUB_OUTPUT"

      - name: Upload translations to Crowdin
        uses: crowdin/github-action@v1
        with:
          upload_sources: true
          upload_translations: false
          download_translations: false
          push_translations: false
          create_pull_request: false
          crowdin_branch_name: '[${{ github.repository_owner }}.${{ github.event.repository.name }}] ${{ steps.branch-name.outputs.safe_branch_name }}'
        env:
          CROWDIN_PROJECT_ID: ${{ vars.CROWDIN_PROJECT_ID }}
          CROWDIN_PERSONAL_TOKEN: ${{ secrets.CROWDIN_PERSONAL_TOKEN }}
