name: Jan Default Plugins
on:
  push:
    branches:
      - main
    paths:
      - "plugins/**"
      - "!plugins/*/package.json"
  pull_request:
    branches:
      - main
    paths:
      - "plugins/**"
      - ".github/workflows/jan-plugins.yml"
      - "!plugins/*/package.json"
jobs:
  build:
    runs-on: macos-latest
    environment: production
    outputs:
      branch_name: ${{ steps.commit_and_tag.outputs.branch_name }}
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: "0"
          token: ${{ secrets.PAT_SERVICE_ACCOUNT }}

      - name: Install jq
        uses: dcarbone/install-jq-action@v2.0.1

      - name: Get Cer for code signing
        run: base64 -d <<< "$CODE_SIGN_P12_BASE64" > /tmp/codesign.p12
        shell: bash
        env:
          CODE_SIGN_P12_BASE64: ${{ secrets.CODE_SIGN_P12_BASE64 }}

      - uses: apple-actions/import-codesign-certs@v2
        continue-on-error: true
        with:
          p12-file-base64: ${{ secrets.CODE_SIGN_P12_BASE64 }}
          p12-password: ${{ secrets.CODE_SIGN_P12_PASSWORD }}

      - name: Check Path Change
        run: |
          git config --global user.email "service@jan.ai"
          git config --global user.name "Service Account"
          echo "Changes in these directories trigger the build:"
          changed_dirs=$(git -c http.extraheader="AUTHORIZATION: bearer ${{ secrets.GITHUB_TOKEN }}" diff --name-only HEAD HEAD~1 | grep '^plugins/' | awk -F/ '{print $2}' | uniq)
          echo $changed_dirs > /tmp/change_dir.txt

      - name: "Auto Increase package Version"
        run: |
          cd plugins
          for dir in $(cat /tmp/change_dir.txt)
          do
            echo "$dir"
            # Extract current version
            current_version=$(jq -r '.version' $dir/package.json)

            # Break the version into its components
            major_version=$(echo $current_version | cut -d "." -f 1)
            minor_version=$(echo $current_version | cut -d "." -f 2)
            patch_version=$(echo $current_version | cut -d "." -f 3)

            # Increment the patch version by one
            new_patch_version=$((patch_version+1))

            # Construct the new version
            new_version="$major_version.$minor_version.$new_patch_version"

            # Replace the old version with the new version in package.json
            jq --arg version "$new_version" '.version = $version' $dir/package.json > /tmp/package.json && mv /tmp/package.json $dir/package.json

            # Print the new version
            echo "Updated $dir package.json version to: $new_version"
          done

      # Setup .npmrc file to publish to npm
      - uses: actions/setup-node@v3
        with:
          node-version: "20.x"
          registry-url: "https://registry.npmjs.org"

      - name: Publish npm packages
        run: |
          cd plugins
          for dir in $(cat /tmp/change_dir.txt)
          do
            echo $dir
            cd $dir
            npm install
            if [[ $dir == 'data-plugin' ]]; then
              npm run build:deps
            fi
            npm run postinstall && ../../.github/scripts/auto-sign.sh
            if [[ $GITHUB_EVENT_NAME == 'push' && $GITHUB_EVENT_PULL_REQUEST_HEAD_REPO_FULL_NAME != $GITHUB_REPOSITORY ]]; then
              npm publish --access public
            fi
            cd ..
          done
        env:
          NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
          DEVELOPER_ID: ${{ secrets.DEVELOPER_ID }}
          APP_PATH: "."

      - name: "Commit new version to main and create tag"
        id: commit_and_tag
        if: github.event_name == 'push' && github.event.pull_request.head.repo.full_name != github.repository
        run: |
          rm -rf /tmp/plugin-catalog
          git clone https://${{ secrets.SERVICE_ACCOUNT_USERNAME }}:${{ secrets.PAT_SERVICE_ACCOUNT }}@github.com/janhq/plugin-catalog.git /tmp/plugin-catalog
          for dir in $(cat /tmp/change_dir.txt)
          do
            echo "$dir"
            version=$(jq -r '.version' plugins/$dir/package.json)
            git config --global user.email "service@jan.ai"
            git config --global user.name "Service Account"
            git add plugins/$dir/package.json
            git commit -m "${GITHUB_REPOSITORY}: Update tag build $version for $dir"
            git -c http.extraheader="AUTHORIZATION: bearer ${{ secrets.PAT_SERVICE_ACCOUNT }}" push origin HEAD:main
            git tag -a $dir-$version -m "${GITHUB_REPOSITORY}: Update tag build $version for $dir"
            git -c http.extraheader="AUTHORIZATION: bearer ${{ secrets.PAT_SERVICE_ACCOUNT }}" push origin $dir-$version
            plugin_name=$(jq -r '.name | sub("@janhq/"; "")' plugins/$dir/package.json)
            cp plugins/$dir/package.json /tmp/plugin-catalog/${plugin_name}.json
          done
          cd /tmp/plugin-catalog
          BRANCH_NAME="update-package-$(date +'%Y%m%d%H%M%S')"
          git checkout -b $BRANCH_NAME
          git add .
          git commit -m "Update plugin catalog"
          git push origin $BRANCH_NAME
          cd /tmp && rm -rf /tmp/plugin-catalog
          echo "BRANCH_NAME=$BRANCH_NAME" >> $GITHUB_ENV
          echo "::set-output name=branch_name::$BRANCH_NAME"

  pull_request:
    runs-on: ubuntu-latest
    environment: production
    if: github.event_name == 'push' && github.event.pull_request.head.repo.full_name != github.repository
    needs: build
    steps:
      - run: |
          gh pr create --title "Update plugin catalog" --body "Update plugin catalog" --base main --head ${{ needs.build.outputs.branch_name }} --repo janhq/plugin-catalog --reviewer louis-jan,hiento09
        env:
          GITHUB_TOKEN: ${{ secrets.PAT_SERVICE_ACCOUNT }}
