name: unity-project-cached
description: "Run a Unity command using a project's version and a build target. Cache the library folder."
inputs:
  projectPath:
    description: "Path to the Unity project."
    required: true
    default: "."
  platform:
    description: "Unity Platform. Options: windows, windows32bit, mac, linux, android"
    required: true
  serial:
    description: "Unity license serial number. Or 'personal' for a personal license."
    required: true
    default: personal
  email:
    description: "Unity email."
    required: true
  password:
    description: "Unity password."
    required: true
  executeMethod:
    description: "Unity method to call."
    required: false
  command:
    description: "Additional unity commands."
    required: false
  noGraphics:
    description: "Whether or not to use the graphics device when running Unity."
    required: false
    default: "true"
  buildOnCacheHit:
    description: "Whether or not to build if a cache was found. Default: true"
    required: false
    default: "true"
  unityBuilder:
    description: "Whether or not to use the UnityBuilder instead of a Unity command."
    required: false
  sshPublicKey:
    description: "Public SSH key to use for git package restoration."
    required: false
  sshPrivateKey:
    description: "Private SSH key to use for git package restoration."
    required: false
  cacheSuffix:
    description: "Suffix or hash to use for the cache key."
    required: false
    default: ${{ github.sha }}
  cachePrefix:
    description: "Prefix to use for the cache key."
    required: false
    default: unity-library
  releaseBranch:
    description: "Release name to use for the middle of the cache key if an exact release match was not found."
    required: false
    default: release
  cachePath:
    description: "Cache path. Default: Library"
    required: false
    default: Library
outputs:
  cacheChanged:
    description: "Whether or not the cache was changed."
    value: ${{ steps.check-cache.outputs.cache-hit != 'true' }}
runs:
  using: "composite"
  steps:
  - name: "Get full cache key and build command."
    id: command
    run: |
      # Get the full cache id.
      echo "key=${{ inputs.cachePrefix }}-${{ github.ref_name }}-${{ inputs.cacheSuffix }}" >> "$GITHUB_OUTPUT"
      # Get the build command.
      COMMAND="${{ inputs.command }}"
      if [[ -n "${{ inputs.executeMethod }}" ]]; then
        COMMAND="$COMMAND -executeMethod ${{ inputs.executeMethod }}"
      fi
      echo "command=$COMMAND" >> "$GITHUB_OUTPUT"
    shell: bash
  - name: "Check if cache exists."
    id: check-cache
    uses: https://github.com/actions/cache/restore@v3
    with:
      path: ${{ inputs.cachePath }}
      key: ${{ steps.command.outputs.key }}
      lookup-only: true
  - name: "Restore Library from Cache."
    if: ${{ ( inputs.buildOnCacheHit == 'true' || steps.check-cache.outputs.cache-hit != 'true' ) }}
    uses: https://github.com/actions/cache/restore@v3
    with:
      path: ${{ inputs.cachePath }}
      key: ${{ steps.command.outputs.key }}
      restore-keys: |
        ${{ inputs.cachePrefix }}-${{ github.ref_name }}
        ${{ inputs.cachePrefix }}-${{ inputs.releaseBranch }}
        ${{ inputs.cachePrefix }}
  - name: "Build project."
    if: ${{ inputs.buildOnCacheHit == 'true' || steps.check-cache.outputs.cache-hit != 'true' }}
    uses: act/unity/unity-project@master
    with:
      platform: ${{ inputs.platform }}
      serial: ${{ inputs.serial }}
      email: ${{ inputs.email }}
      password: ${{ inputs.password }}
      sshPublicKey: ${{ inputs.sshPublicKey }}
      sshPrivateKey: ${{ inputs.sshPrivateKey }}
      command: ${{ steps.command.outputs.command }}
      noGraphics: ${{ inputs.noGraphics }}
      unityBuilder: ${{ inputs.unityBuilder }}
  - name: "Upload Library to Cache."
    if: ${{ steps.check-cache.outputs.cache-hit != 'true' }}
    uses: https://github.com/actions/cache/save@v3
    with:
      path: ${{ inputs.cachePath }}
      key: ${{ steps.command.outputs.key }}
