name: Create Module Files For GitHub Release

env:
  # The URL used for the module's "Project URL" link on FoundryVTT's website.
  project_url: "https://github.com/${{github.repository}}"

  # A URL that will always point to the latest manifest.
  # FoundryVTT uses this URL to check whether the current module version that
  # is installed is the latest version. This URL should NOT change,
  # otherwise FoundryVTT won't be able to perform this check.
  latest_manifest_url: "https://github.com/${{github.repository}}/releases/latest/download/module.json"

  # The URL to the module archive associated with the module release being
  # processed by this workflow.
  release_module_url: "https://github.com/${{github.repository}}/releases/download/${{github.event.release.tag_name}}/module.zip"

on: 
  # Only run this workflow when a release is published.
  # To modify this workflow when other events occur, see:
  #   - https://docs.github.com/en/actions/using-workflows/triggering-a-workflow
  #   - https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows
  #   - https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#on
  #
  # Note that some steps may depend on context variables that are only
  # available for release events, so if you add other events, you may need to
  # alter other parts of this workflow.
  release:
    types: [published]

jobs:
  build:
    runs-on: ubuntu-latest
    permissions:
      contents: write
  
    steps:
      - name: Checkout Repository
        uses: actions/checkout@v3

      # Extract version embedded in the tag.
      # This step expects the tag to be one of the following formats:
      #   - "v<major>.<minor>.<patch>" (e.g., "v1.2.3")
      #   - "<major>.<minor>.<patch>"  (e.g., "1.2.3")
      #
      # The version will be used by later steps to fill in the value for the
      # "version" key required for a valid module manifest.
      - name: Extract Version From Tag
        id: get_version
        uses: battila7/get-version-action@v2

      # Modify "module.json" with values specific to the release.
      # Since the values for the "version" and "url" keys aren't known ahead of
      # time, the manifest file in the repository is updated with these values.
      #
      # While this does modify the manifest file in-place, the changes are not
      # commited to the repository, and only exist in the action's filesystem.
      - name: Modify Module Manifest With Release-Specific Values
        id: sub_manifest_link_version
        uses: cschleiden/replace-tokens@v1
        with:
          files: 'module.json'
        env:
          VERSION: ${{steps.get_version.outputs.version-without-v}}
          URL: ${{ env.project_url }}
          MANIFEST: ${{ env.latest_manifest_url }}
          DOWNLOAD: ${{ env.release_module_url }}

      # Create a "module.zip" archive containing all the module's required files.
      # If you have other directories or files that will need to be added to
      # your packaged module, add them here.
      - name: Create Module Archive
        run: |
          # Note that `zip` will only emit warnings when a file or directory
          # doesn't exist, it will not fail.
          zip                                  \
          `# Options`                          \
          --recurse-paths                      \
          `# The name of the output file`      \
          ./module.zip                         \
          `# The files that will be included.` \
          module.json                          \
          readme.md                            \
          LICENSE                              \
          languages/                           \
          scripts/                             \
          styles/                              \
          # Don't forget to add a backslash at the end of the line for any
          # additional files or directories!

      # Update the GitHub release with the manifest and module archive files.
      - name: Update Release with Files
        id: create_version_release
        uses: ncipollo/release-action@v1
        with:
          allowUpdates: true
          name: ${{ github.event.release.name }}
          draft: ${{ github.event.release.unpublished }}
          prerelease: ${{ github.event.release.prerelease }}
          token: ${{ secrets.GITHUB_TOKEN }}
          artifacts: './module.json, ./module.zip'
          tag: ${{ github.event.release.tag_name }}
          body: ${{ github.event.release.body }}
