name: Upload Release Build

on: 
  release:
    types: [published]

jobs:

  build:
    name: Upload Release
    runs-on: ubuntu-latest

    steps:
      # Initialization
      - name: Checkout release branch w/submodules
        uses: actions/checkout@v5
        with:
          submodules: recursive
      - uses: actions/setup-node@v4
        with:
          node-version: '18'
      - name: Copy configuration
        run: cp config.json.example config.json

      # Create source artifact with submodule
      - name: Create directory
        run: cd ..; mkdir ./builds
      - name: Zip Source code
        run: zip -r ../builds/SourceCodeUseThisOne.zip *
      - name: Upload Source to release
        uses: Shopify/upload-to-release@07611424e04f1475ddf550e1c0dd650b867d5467
        with:
          args: ../builds/SourceCodeUseThisOne.zip
          name: SourceCodeUseThisOne.zip
          path: ../builds/SourceCodeUseThisOne.zip
          repo-token: ${{ secrets.GITHUB_TOKEN }}

      - name: Checkout source maps branch
        uses: actions/checkout@v5
        with:
          path: source-maps
          ref: source-maps
      - name: Set up committer info
        run: |
          git config --global user.name "github-actions[bot]"
          git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com"
      - run: npm ci

      # Create Firefox artifacts
      - name: Create Firefox artifacts
        run: npm run build:firefox -- --env ghpSourceMaps
      - run: mkdir ./builds
      - name: Move Firefox source maps to source map repo
        run: |
          VERSION=`jq -r '.version' ./dist/manifest.json`
          mkdir -p "./source-maps/firefox/$VERSION/"
          mv -v ./dist/**/*.js.map "./source-maps/firefox/$VERSION/"
          cp -v ./dist/**/*.js.LICENSE.txt "./source-maps/firefox/$VERSION/"
      - name: Zip Artifacts
        run: cd ./dist ; zip -r ../builds/FirefoxExtension.zip *
      - name: Upload FirefoxExtension to release
        uses: Shopify/upload-to-release@07611424e04f1475ddf550e1c0dd650b867d5467
        with:
          args: builds/FirefoxExtension.zip
          name: FirefoxExtension.zip
          path: ./builds/FirefoxExtension.zip
          repo-token: ${{ secrets.GITHUB_TOKEN }}
      
      # Create Chrome artifacts
      - name: Create Chrome artifacts
        run: npm run build:chrome -- --env ghpSourceMaps
      - name: Move Chrome source maps to source map repo
        run: |
          VERSION=`jq -r '.version' ./dist/manifest.json`
          mkdir -p "./source-maps/chrome/$VERSION/"
          mv -v ./dist/**/*.js.map "./source-maps/chrome/$VERSION/"
          cp -v ./dist/**/*.js.LICENSE.txt "./source-maps/chrome/$VERSION/"
      - name: Zip Artifacts
        run: cd ./dist ; zip -r ../builds/ChromeExtension.zip *
      - name: Upload ChromeExtension to release
        uses: Shopify/upload-to-release@07611424e04f1475ddf550e1c0dd650b867d5467
        with:
          args: builds/ChromeExtension.zip
          name: ChromeExtension.zip
          path: ./builds/ChromeExtension.zip
          repo-token: ${{ secrets.GITHUB_TOKEN }}

      # Create Edge artifacts
      - name: Clear dist for Edge
        run: rm -rf ./dist
      - name: Create Edge artifacts
        run: npm run build:edge -- --env ghpSourceMaps
      - name: Move Edge source maps to source map repo
        run: |
          VERSION=`jq -r '.version' ./dist/manifest.json`
          mkdir -p "./source-maps/edge/$VERSION/"
          mv -v ./dist/**/*.js.map "./source-maps/edge/$VERSION/"
          cp -v ./dist/**/*.js.LICENSE.txt "./source-maps/edge/$VERSION/"
      - name: Zip Artifacts
        run: cd ./dist ; zip -r ../builds/EdgeExtension.zip *
      - name: Upload EdgeExtension to release
        uses: Shopify/upload-to-release@07611424e04f1475ddf550e1c0dd650b867d5467
        with:
          args: builds/EdgeExtension.zip
          name: EdgeExtension.zip
          path: ./builds/EdgeExtension.zip
          repo-token: ${{ secrets.GITHUB_TOKEN }}

      # Create Safari artifacts
      - name: Create Safari artifacts
        run: npm run build:safari -- --env ghpSourceMaps
      - name: Move Safari source maps to source map repo
        run: |
          VERSION=`jq -r '.version' ./dist/manifest.json`
          mkdir -p "./source-maps/safari/$VERSION/"
          mv -v ./dist/**/*.js.map "./source-maps/safari/$VERSION/"
          cp -v ./dist/**/*.js.LICENSE.txt "./source-maps/safari/$VERSION/"
      - name: Zip Artifacts
        run: cd ./dist ; zip -r ../builds/SafariExtension.zip *
      - name: Upload SafariExtension to release
        uses: Shopify/upload-to-release@07611424e04f1475ddf550e1c0dd650b867d5467
        with:
          args: builds/SafariExtension.zip
          name: SafariExtension.zip
          path: ./builds/SafariExtension.zip
          repo-token: ${{ secrets.GITHUB_TOKEN }}

      # Create Beta artifacts (Builds with the name changed to beta)
      - name: Create Chrome Beta artifacts
        run: npm run build:chrome -- --env stream=beta --env ghpSourceMaps
      - name: Move Chrome Beta source maps to source map repo
        run: |
          VERSION=`jq -r '.version' ./dist/manifest.json`
          mkdir -p "./source-maps/chrome-beta/$VERSION/"
          mv -v ./dist/**/*.js.map "./source-maps/chrome-beta/$VERSION/"
          cp -v ./dist/**/*.js.LICENSE.txt "./source-maps/chrome-beta/$VERSION/"
      - name: Zip Artifacts
        run: cd ./dist ; zip -r ../builds/ChromeExtensionBeta.zip *
      - name: Upload ChromeExtensionBeta to release
        uses: Shopify/upload-to-release@07611424e04f1475ddf550e1c0dd650b867d5467
        with:
          args: builds/ChromeExtensionBeta.zip
          name: ChromeExtensionBeta.zip
          path: ./builds/ChromeExtensionBeta.zip
          repo-token: ${{ secrets.GITHUB_TOKEN }}

      # Firefox Beta
      - name: Create Firefox Beta artifacts
        run: npm run build:firefox -- --env stream=beta --env autoupdate --env ghpSourceMaps
      - uses: actions/upload-artifact@v4
        with:
          name: FirefoxExtensionBeta
          path: dist
      - name: Move Firefox Beta source maps to source map repo
        run: |
          VERSION=`jq -r '.version' ./dist/manifest.json`
          mkdir -p "./source-maps/firefox-beta/$VERSION/"
          mv -v ./dist/**/*.js.map "./source-maps/firefox-beta/$VERSION/"
          cp -v ./dist/**/*.js.LICENSE.txt "./source-maps/firefox-beta/$VERSION/"
      - name: Zip Artifacts
        run: cd ./dist ; zip -r ../builds/FirefoxExtensionBeta.zip *

      # Create Firefox Signed Beta version
      - name: Create Firefox Signed Beta artifacts
        run: npm run web-sign
        env:
          WEB_EXT_API_KEY: ${{ secrets.WEB_EXT_API_KEY }}
          WEB_EXT_API_SECRET: ${{ secrets.WEB_EXT_API_SECRET }}
      - name: Rename signed file
        run: mv ./web-ext-artifacts/* ./web-ext-artifacts/FirefoxSignedInstaller.xpi
      - uses: actions/upload-artifact@v4
        with:
          name: FirefoxExtensionSigned.xpi
          path: ./web-ext-artifacts/FirefoxSignedInstaller.xpi

      - name: Upload FirefoxSignedInstaller.xpi to release
        uses: Shopify/upload-to-release@07611424e04f1475ddf550e1c0dd650b867d5467
        with:
          args: web-ext-artifacts/FirefoxSignedInstaller.xpi
          name: FirefoxSignedInstaller.xpi
          path: ./web-ext-artifacts/FirefoxSignedInstaller.xpi
          repo-token: ${{ secrets.GITHUB_TOKEN }}

      - name: Commit & push new source maps
        if: always()
        run: |
          VERSION=`jq -r '.version' ./dist/manifest.json`
          cd ./source-maps
          git add .
          git commit -m "Publish source maps for version $VERSION"
          git push

      - name: Prepare new github pages deployment
        shell: python
        run: |
          from pathlib import Path
          import json
          import shutil
          import os

          # config stuff
          installer_name = "FirefoxSignedInstaller.xpi"
          owner, repo_name = os.environ["GITHUB_REPOSITORY"].split("/")
          owner = owner.lower()

          # create the github paged dir
          ghp_dir = Path("./github-pages")
          ghp_dir.mkdir(parents=True, exist_ok=True)

          # move in the installer
          Path("./web-ext-artifacts", installer_name).rename(ghp_dir / installer_name)

          # read manifest.json and extract parameters
          with open("./dist/manifest.json") as f:
            manifest = json.load(f)
          current_version = manifest["version"]
          ext_id = manifest["browser_specific_settings"]["gecko"]["id"]

          # generate updates file
          updates = {
            "addons": {
              ext_id: {
                "updates": [
                  {
                    "version": current_version,
                    # param doesn't actually matter, it's just a cachebuster
                    "update_link": f"https://{owner}.github.io/{repo_name}/{installer_name}?v={current_version}",
                  },
                ],
              },
            },
          }
          (ghp_dir / "updates.json").write_text(json.dumps(updates))

          # copy in source maps
          def only_sourcemaps(cur, ls):
            if '/' in cur:
              return []
            return set(ls) - {"chrome", "chrome-beta", "edge", "firefox", "firefox-beta", "safari"}
          shutil.copytree("source-maps", ghp_dir, ignore=only_sourcemaps, dirs_exist_ok=True)

      - name: Upload new github pages deployment
        uses: actions/upload-pages-artifact@v3
        with:
          path: ./github-pages

  deploy-ghp:
    name: Deploy to github pages
    needs: build
    permissions:
      id-token: write
      pages: write
    environment:
      name: github-pages
      url: ${{ steps.deployment.outputs.page_url }}
    runs-on: ubuntu-latest
    steps:
      - name: Deploy
        id: deployment
        uses: actions/deploy-pages@v4
