on:
  push:
    branches:
    - '**'
jobs:
  build_docs:
    name: Build the production documentation site
    runs-on: ubuntu-latest
    env:
      HUGO_VERSION: 0.111.2
      GCLOUD_VERSION: 458.0.1-linux-x86_64
      BUCKET: docs-prod-learn-redis-com
      BUCKET_SERVICE_ACCOUNT: ${{ secrets.BUCKET_DOCUMENTATION_SA_PROD }}
      BUCKET_SECRET: ${{ secrets.BUCKET_DOCUMENTATION_PROD }}
      GCP_PROJECT: ${{ secrets.GCP_PROJECT_PROD }}
    steps:
    - name: Start
      run: echo "The name of the branch is ${{ github.ref }} on ${{ github.repository }}"
    - name: Install Hugo
      run: |
          wget -O ${{ runner.temp }}/hugo.deb https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_linux-amd64.deb \
          && sudo dpkg -i ${{ runner.temp }}/hugo.deb
    - name: Check the branch out
      uses: actions/checkout@v4
    - name: List repository files
      run: ls ${{ github.workspace }}
    - name: Validate the branch name before using it
      run: |
          if [[ "${{ github.ref_name }}" =~ ^[a-zA-Z0-9_.-]+$ ]]
          then
            echo "The branch name ${{ github.ref_name }} is valid."
          else
            echo "ERROR: Invalid branch name ${{ github.ref_name }}!"
            exit 1
          fi

    - name: Install dependencies
      run: make deps

    - name: Build out all versions
      run: |
        set -x

        function setBaseUrl() {
          if [[ "${{ github.ref_name }}" == "main" ]]
          then
            hugo_root_path=docs/staging/dev
          elif [[ "${{ github.ref_name }}" == "latest" ]]
          then
            hugo_root_path="docs/latest"
          elif [[ "${{ endsWith(github.ref_name, '-build') }}" == "true" ]]
          then
            hugo_root_path=`echo docs/version/${{ github.ref_name }} | sed 's/-build$//'`
          else
            hugo_root_path=docs/staging/${{ github.ref_name }}
          fi \
          && sed -i "s#baseURL = \"https://redis.io\"#baseURL = \"https://redis.io/$hugo_root_path\"#g" config.toml
        }

        setBaseUrl
        kubernetes_versions=($(find content/operate/kubernetes/ -maxdepth 1 -type d -regex ".*[0-9-]" | awk -F/ '{print $NF}'))
        rs_versions=($(find content/operate/rs/ -maxdepth 1 -type d -regex ".*[0-9-]" | awk -F/ '{print $NF}'))

        # build latest
        for version in "${kubernetes_versions[@]}"; do
          rm -r "content/operate/kubernetes/${version}"
        done
        for version in "${rs_versions[@]}"; do
          rm -r "content/operate/rs/${version}"
        done
        make all

        git checkout .

        # build all versions
        for version in "${kubernetes_versions[@]}"; do

          setBaseUrl

          # for each version, remove all other versions before building
          versions_to_remove=($(echo "${kubernetes_versions[@]}" "${version}" | tr ' ' '\n' | sort | uniq -u))
          for version_to_remove in "${versions_to_remove[@]}"; do
            rm -r "content/operate/kubernetes/${version_to_remove}"
          done

          cp -r "content/operate/kubernetes/${version}"/* content/operate/kubernetes/
          rm -r "content/operate/kubernetes/${version}"
          sed -i 's/id="versionSelectorKubernetesValue" class="version-selector-control">latest/id="versionSelectorKubernetesValue" class="version-selector-control">v'"${version}"'/' layouts/partials/docs-nav.html
          sed -i 's/linkTitle: '"${version}"'/linkTitle: Redis for Kubernetes/' content/operate/kubernetes/_index.md

          # inject replace command in meta-links to make sure editURL and issuesURL point to right version
          sed -i "11i \{\{ \$gh_file = replaceRE \`\^operate\/kubernetes\/\` \"operate\/kubernetes\/$version\/\" \$gh_file }}" layouts/partials/meta-links.html

          hugo -d "kubernetes-${version}"

          git checkout .
        done

        for version in "${rs_versions[@]}"; do

          setBaseUrl

          # for each version, remove all other versions before building
          versions_to_remove=($(echo "${rs_versions[@]}" "${version}" | tr ' ' '\n' | sort | uniq -u))
          for version_to_remove in "${versions_to_remove[@]}"; do
            rm -r "content/operate/rs/${version_to_remove}"
          done

          cp -r "content/operate/rs/${version}"/* content/operate/rs/
          rm -r "content/operate/rs/${version}"
          sed -i 's/id="versionSelectorRsValue" class="version-selector-control">latest/id="versionSelectorRsValue" class="version-selector-control">v'"${version}"'/' layouts/partials/docs-nav.html
          sed -i 's/linkTitle: '"${version}"'/linkTitle: Redis Software/' content/operate/rs/_index.md

          # inject replace command in meta-links to make sure editURL and issuesURL point to right version
          sed -i "11i \{\{ \$gh_file = replaceRE \`\^operate\/rs\/\` \"operate\/rs\/$version\/\" \$gh_file }}" layouts/partials/meta-links.html

          hugo -d "rs-${version}"

          git checkout .
        done

    - name: List client examples
      run: ls "${{ github.workspace }}/examples"
    - name: List files to be published
      run: ls "${{ github.workspace }}/public"    
    - name: Install the Google Cloud CLI
      run: |
          wget -O ${{ github.workspace }}/google-cloud-cli.tar.gz "https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-cli-$GCLOUD_VERSION.tar.gz" \
          && tar -xvf google-cloud-cli.tar.gz -C ${{ github.workspace }}\
          && ${{ github.workspace }}/google-cloud-sdk/install.sh --quiet
    - name: Prepare bucket authentication
      run: echo $BUCKET_SECRET | base64 --decode > service_account.json && ls -a service_account.json
    - name: Authenticate to the bucket
      run: |
          ./google-cloud-sdk/bin/gcloud auth activate-service-account $BUCKET_SERVICE_ACCOUNT --key-file=./service_account.json --project=$GCP_PROJECT \
          && ./google-cloud-sdk/bin/gcloud auth list
    - name: Sync the branch to the bucket
      run: |
          if [[ "${{ github.ref_name }}" == "main" ]]
          then
            bucket_path=staging/dev
          elif [[ "${{ github.ref_name }}" == "latest" ]]
          then
            bucket_path=${{ github.ref_name }}
          elif [[ "${{ endsWith(github.ref_name, '-build') }}" == "true" ]]
          then
            bucket_path=`echo "version/${{ github.ref_name }}" | sed 's/-build$//'`
          else
            bucket_path=staging/${{ github.ref_name }}
          fi \
          && ./google-cloud-sdk/bin/gsutil -m rsync -r -c -j html -d ${{ github.workspace }}/public gs://$BUCKET/$bucket_path

          if [[ "${{ github.ref_name }}" == "latest" ]]
          then
            versioned_builds=($(find . -type d -regex ".*[0-9-]" -maxdepth 1 | sed -E 's/^.\///'))
            for versioned_build in "${versioned_builds[@]}"; do
              product=$(grep -Eo '[a-zA-Z]+' <<< $versioned_build)
              gsutil -m rsync -r -c -j html -d "${{ github.workspace }}/${versioned_build}/operate/${product}" "gs://${BUCKET}/${versioned_build}/operate/${product}"
            done
          fi

          if [[ "$bucket_path" == staging/* ]]
          then
            versioned_builds=($(find . -type d -regex ".*[0-9-]" -maxdepth 1 | sed -E 's/^.\///'))
            for versioned_build in "${versioned_builds[@]}"; do
              product=$(grep -Eo '[a-zA-Z]+' <<< $versioned_build)
              gsutil -m rsync -r -c -j html -d "${{ github.workspace }}/${versioned_build}/operate/${product}" "gs://${BUCKET}/${bucket_path}/${versioned_build}/operate/${product}"
            done
          fi

    - name: End
      run: echo "This job's status is ${{ job.status }}."