name: Create UnityPackage

on:
  workflow_dispatch:
  # push:
  #   branches:
  #     - workflow-wip-2

env:
  UNITY_PROJECT_PATH: .

defaults:
  run:
    shell: bash

jobs:
  create-unitypackage:
    runs-on: [self-hosted, Windows, X64, Unity]
    timeout-minutes: 60
    steps:
    - id: checkout
      uses: actions/checkout@v4
      with:
        submodules: recursive
        lfs: true

    - name: Detect Unity Version
      id: detect-unity-version
      run: |
        PROJECT_VERSION_PATH="${{ env.UNITY_PROJECT_PATH }}/ProjectSettings/ProjectVersion.txt"
        UNITY_HUB="C:\Program Files\Unity Hub\Unity Hub.exe"

        UNITY_VERSION=`cat ${PROJECT_VERSION_PATH} | sed -n -E "s/^m_EditorVersion:\s+//p" | head -n 1`
        UNITY_CHANGESET=`cat ${PROJECT_VERSION_PATH} | sed -n -E "s/^m_EditorVersionWithRevision:\s+\S+\s+\((\S+)\)/\1/p" | head -n 1`
        UNITY_EDITOR_EXECUTABLE=`"${UNITY_HUB}" -- --headless editors --installed | \
          sed -n -E "s/^${UNITY_VERSION} , installed at //p" | \
          head -n 1`

        if [ -z "${UNITY_EDITOR_EXECUTABLE}" ]; then
          echo "Unity ${UNITY_VERSION} is not installed."
          exit 1

          # コマンドラインからのインストールは Unity 3.7.0 時点では UAC 必須で難しい
          UNITY_INSTALL_COMMAND="\"${UNITY_HUB}\" -- --headless install \
            --version ${UNITY_VERSION} \
            --changeset ${UNITY_CHANGESET} \
            --module windows-il2cpp \
            --childModules"
        fi

        echo "${UNITY_EDITOR_EXECUTABLE} is installed."
        echo "unity-editor-executable=${UNITY_EDITOR_EXECUTABLE}" >> "${GITHUB_OUTPUT}"

    - name: Run EditMode Tests
      id: run-edit-mode-tests
      run: |
        echo "Run EditMode Tests..."
        # RunEditModeTests の実行の結果、終了コードが 0 でない場合でもテストの結果を表示したいので set +e して一時的に回避する
        set +e
        "${{ steps.detect-unity-version.outputs.unity-editor-executable }}" \
          -batchmode \
          -silent-crashes \
          -projectPath "${{ env.UNITY_PROJECT_PATH }}" \
          -executeMethod "UniGLTF.TestRunner.RunEditModeTests" \
          -logFile run-edit-mode-tests.log \
          -testRunnerNUnitXmlFile run-edit-mode-tests.xml
        RET=$?
        set -e

        echo "Output Log..."
        cat run-edit-mode-tests.log | egrep "^\[\[TestRunnerLog\]\]"

        # TODO: テスト結果を NUnit3 形式の run-edit-mode-tests.xml から読み込んで表示する

        if [ ${RET:-1} -eq 0 ]; then
          echo "Test succeeded."
          exit 0
        else
          echo "Test failed."
          exit 1
        fi

    - name: Upload test results
      if: ${{ always() }}
      uses: actions/upload-artifact@v4
      with:
        name: run-edit-mode-tests.xml
        path: ${{ env.UNITY_PROJECT_PATH }}/run-edit-mode-tests.xml

    - name: Create UnityPackage
      id: create-unitypackage
      run: |
        "${{ steps.detect-unity-version.outputs.unity-editor-executable }}" \
          -batchmode \
          -silent-crashes \
          -projectPath "${{ env.UNITY_PROJECT_PATH }}" \
          -executeMethod "VRM.DevOnly.PackageExporter.VRMExportUnityPackage.CreateUnityPackageWithBuild" \
          -logFile create-unitypackage.log
        
        echo "Success to create UnityPackage."

    - name: Upload UnityPackage
      uses: actions/upload-artifact@v4
      with:
        name: unitypackage
        path: ${{ env.UNITY_PROJECT_PATH }}/*.unitypackage
        



